欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合Redis及Redis工具類撰寫實例

 更新時間:2022年01月03日 12:25:12   作者:zeng1994  
這篇文章主要介紹了SpringBoot整合Redis及Redis工具類撰寫實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot整合Redis的博客很多,但是很多都不是我想要的結(jié)果。因為我只需要整合完成后,可以操作Redis就可以了,并不需要配合緩存相關(guān)的注解使用(如@Cacheable)??戳撕芏嗖┛秃?,我成功的整合了,并寫了個Redis操作工具類。特意在此記錄一下,方便后續(xù)查閱。

一、Maven依賴

(1)本文所采用的SpringBoot的版本如下

? ?<parent>
?? ??? ?<groupId>org.springframework.boot</groupId>
?? ??? ?<artifactId>spring-boot-starter-parent</artifactId>
?? ??? ?<version>2.0.2.RELEASE</version>
?? ??? ?<relativePath/> <!-- lookup parent from repository -->
?? ?</parent>

(2)加入Redis相關(guān)依賴

? ? ? ? <dependency>
?? ??? ??? ?<groupId>org.springframework.boot</groupId>
?? ??? ??? ?<artifactId>spring-boot-starter-data-redis</artifactId>
?? ??? ?</dependency>?

二、application.properties中加入redis相關(guān)配置

# Redis數(shù)據(jù)庫索引(默認為0) ?
spring.redis.database=0 ?
# Redis服務(wù)器地址 ?
spring.redis.host=192.168.0.24 ?
# Redis服務(wù)器連接端口 ?
spring.redis.port=6379 ?
# Redis服務(wù)器連接密碼(默認為空) ?
spring.redis.password= ?
# 連接池最大連接數(shù)(使用負值表示沒有限制) ?
spring.redis.pool.max-active=200 ?
# 連接池最大阻塞等待時間(使用負值表示沒有限制) ?
spring.redis.pool.max-wait=-1 ?
# 連接池中的最大空閑連接 ?
spring.redis.pool.max-idle=10?
# 連接池中的最小空閑連接 ?
spring.redis.pool.min-idle=0 ?
# 連接超時時間(毫秒) ?
spring.redis.timeout=1000?

三、寫一個redis配置類

(1)聊聊RedisTemplate的自動配置

其實現(xiàn)在就可以在代碼中注入RedisTemplate,為啥可以直接注入呢?先看下源碼吧。下圖為 RedisAutoConfiguration類中的截圖,為了防止圖片失效,代碼也貼上 。

代碼:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
?? ?@Bean
?? ?@ConditionalOnMissingBean(name = "redisTemplate")
?? ?public RedisTemplate<Object, Object> redisTemplate(
?? ??? ??? ?RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
?? ??? ?RedisTemplate<Object, Object> template = new RedisTemplate<>();
?? ??? ?template.setConnectionFactory(redisConnectionFactory);
?? ??? ?return template;
?? ?}
?? ?@Bean
?? ?@ConditionalOnMissingBean
?? ?public StringRedisTemplate stringRedisTemplate(
?? ??? ??? ?RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
?? ??? ?StringRedisTemplate template = new StringRedisTemplate();
?? ??? ?template.setConnectionFactory(redisConnectionFactory);
?? ??? ?return template;
?? ?}
}? ? ?

通過源碼可以看出,SpringBoot自動幫我們在容器中生成了一個RedisTemplate和一個StringRedisTemplate。但是,這個RedisTemplate的泛型是<Object,Object>,寫代碼不方便,需要寫好多類型轉(zhuǎn)換的代碼;我們需要一個泛型為<String,Object>形式的RedisTemplate。并且,這個RedisTemplate沒有設(shè)置數(shù)據(jù)存在Redis時,key及value的序列化方式。       

看到這個@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate對象了,這個自動配置的RedisTemplate不會實例化。因此我們可以直接自己寫個配置類,配置RedisTemplate。

(2)既然自動配置不好用,就重新配置一個RedisTemplate

代碼如下:

package com.zxy.demo.redis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * redis配置類
 * @author ZENG.XIAO.YAN
 * @date   2018年6月6日
 * 
 */
@Configuration
public class RedisConfig {
    
	@Bean
	@SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    	RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
    	template.setConnectionFactory(factory);
		Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

四、寫一個Redis工具類

直接用RedisTemplate操作Redis,需要很多行代碼,因此直接封裝好一個RedisUtils,這樣寫代碼更方便點。這個RedisUtils交給Spring容器實例化,使用時直接注解注入。

工具類代碼如下:

package com.zxy.demo.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
 * Redis工具類
 * @author ZENG.XIAO.YAN
 * @date   2018年6月7日
 */
@Component
public final class RedisUtil {
	
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;
	// =============================common============================
	/**
	 * 指定緩存失效時間
	 * @param key 鍵
	 * @param time 時間(秒)
	 * @return
	 */
	public boolean expire(String key, long time) {
		try {
			if (time > 0) {
				redisTemplate.expire(key, time, TimeUnit.SECONDS);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 根據(jù)key 獲取過期時間
	 * @param key 鍵 不能為null
	 * @return 時間(秒) 返回0代表為永久有效
	 */
	public long getExpire(String key) {
		return redisTemplate.getExpire(key, TimeUnit.SECONDS);
	}
	/**
	 * 判斷key是否存在
	 * @param key 鍵
	 * @return true 存在 false不存在
	 */
	public boolean hasKey(String key) {
		try {
			return redisTemplate.hasKey(key);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 刪除緩存
	 * @param key 可以傳一個值 或多個
	 */
	@SuppressWarnings("unchecked")
	public void del(String... key) {
		if (key != null && key.length > 0) {
			if (key.length == 1) {
				redisTemplate.delete(key[0]);
			} else {
				redisTemplate.delete(CollectionUtils.arrayToList(key));
			}
		}
	}
	// ============================String=============================
	/**
	 * 普通緩存獲取
	 * @param key 鍵
	 * @return 值
	 */
	public Object get(String key) {
		return key == null ? null : redisTemplate.opsForValue().get(key);
	}
	/**
	 * 普通緩存放入
	 * @param key 鍵
	 * @param value 值
	 * @return true成功 false失敗
	 */
	public boolean set(String key, Object value) {
		try {
			redisTemplate.opsForValue().set(key, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 普通緩存放入并設(shè)置時間
	 * @param key 鍵
	 * @param value 值
	 * @param time 時間(秒) time要大于0 如果time小于等于0 將設(shè)置無限期
	 * @return true成功 false 失敗
	 */
	public boolean set(String key, Object value, long time) {
		try {
			if (time > 0) {
				redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
			} else {
				set(key, value);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 遞增
	 * @param key 鍵
	 * @param delta 要增加幾(大于0)
	 * @return
	 */
	public long incr(String key, long delta) {
		if (delta < 0) {
			throw new RuntimeException("遞增因子必須大于0");
		}
		return redisTemplate.opsForValue().increment(key, delta);
	}
	/**
	 * 遞減
	 * @param key 鍵
	 * @param delta 要減少幾(小于0)
	 * @return
	 */
	public long decr(String key, long delta) {
		if (delta < 0) {
			throw new RuntimeException("遞減因子必須大于0");
		}
		return redisTemplate.opsForValue().increment(key, -delta);
	}
	// ================================Map=================================
	/**
	 * HashGet
	 * @param key 鍵 不能為null
	 * @param item 項 不能為null
	 * @return 值
	 */
	public Object hget(String key, String item) {
		return redisTemplate.opsForHash().get(key, item);
	}
	/**
	 * 獲取hashKey對應(yīng)的所有鍵值
	 * @param key 鍵
	 * @return 對應(yīng)的多個鍵值
	 */
	public Map<Object, Object> hmget(String key) {
		return redisTemplate.opsForHash().entries(key);
	}
	/**
	 * HashSet
	 * @param key 鍵
	 * @param map 對應(yīng)多個鍵值
	 * @return true 成功 false 失敗
	 */
	public boolean hmset(String key, Map<String, Object> map) {
		try {
			redisTemplate.opsForHash().putAll(key, map);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * HashSet 并設(shè)置時間
	 * @param key 鍵
	 * @param map 對應(yīng)多個鍵值
	 * @param time 時間(秒)
	 * @return true成功 false失敗
	 */
	public boolean hmset(String key, Map<String, Object> map, long time) {
		try {
			redisTemplate.opsForHash().putAll(key, map);
			if (time > 0) {
				expire(key, time);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
	 * @param key 鍵
	 * @param item 項
	 * @param value 值
	 * @return true 成功 false失敗
	 */
	public boolean hset(String key, String item, Object value) {
		try {
			redisTemplate.opsForHash().put(key, item, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
	 * @param key 鍵
	 * @param item 項
	 * @param value 值
	 * @param time 時間(秒) 注意:如果已存在的hash表有時間,這里將會替換原有的時間
	 * @return true 成功 false失敗
	 */
	public boolean hset(String key, String item, Object value, long time) {
		try {
			redisTemplate.opsForHash().put(key, item, value);
			if (time > 0) {
				expire(key, time);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 刪除hash表中的值
	 * @param key 鍵 不能為null
	 * @param item 項 可以使多個 不能為null
	 */
	public void hdel(String key, Object... item) {
		redisTemplate.opsForHash().delete(key, item);
	}
	/**
	 * 判斷hash表中是否有該項的值
	 * @param key 鍵 不能為null
	 * @param item 項 不能為null
	 * @return true 存在 false不存在
	 */
	public boolean hHasKey(String key, String item) {
		return redisTemplate.opsForHash().hasKey(key, item);
	}
	/**
	 * hash遞增 如果不存在,就會創(chuàng)建一個 并把新增后的值返回
	 * @param key 鍵
	 * @param item 項
	 * @param by 要增加幾(大于0)
	 * @return
	 */
	public double hincr(String key, String item, double by) {
		return redisTemplate.opsForHash().increment(key, item, by);
	}
	/**
	 * hash遞減
	 * @param key 鍵
	 * @param item 項
	 * @param by 要減少記(小于0)
	 * @return
	 */
	public double hdecr(String key, String item, double by) {
		return redisTemplate.opsForHash().increment(key, item, -by);
	}
	// ============================set=============================
	/**
	 * 根據(jù)key獲取Set中的所有值
	 * @param key 鍵
	 * @return
	 */
	public Set<Object> sGet(String key) {
		try {
			return redisTemplate.opsForSet().members(key);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 根據(jù)value從一個set中查詢,是否存在
	 * @param key 鍵
	 * @param value 值
	 * @return true 存在 false不存在
	 */
	public boolean sHasKey(String key, Object value) {
		try {
			return redisTemplate.opsForSet().isMember(key, value);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 將數(shù)據(jù)放入set緩存
	 * @param key 鍵
	 * @param values 值 可以是多個
	 * @return 成功個數(shù)
	 */
	public long sSet(String key, Object... values) {
		try {
			return redisTemplate.opsForSet().add(key, values);
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 將set數(shù)據(jù)放入緩存
	 * @param key 鍵
	 * @param time 時間(秒)
	 * @param values 值 可以是多個
	 * @return 成功個數(shù)
	 */
	public long sSetAndTime(String key, long time, Object... values) {
		try {
			Long count = redisTemplate.opsForSet().add(key, values);
			if (time > 0)
				expire(key, time);
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 獲取set緩存的長度
	 * @param key 鍵
	 * @return
	 */
	public long sGetSetSize(String key) {
		try {
			return redisTemplate.opsForSet().size(key);
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 移除值為value的
	 * @param key 鍵
	 * @param values 值 可以是多個
	 * @return 移除的個數(shù)
	 */
	public long setRemove(String key, Object... values) {
		try {
			Long count = redisTemplate.opsForSet().remove(key, values);
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
	// ===============================list=================================
	/**
	 * 獲取list緩存的內(nèi)容
	 * @param key 鍵
	 * @param start 開始
	 * @param end 結(jié)束 0 到 -1代表所有值
	 * @return
	 */
	public List<Object> lGet(String key, long start, long end) {
		try {
			return redisTemplate.opsForList().range(key, start, end);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 獲取list緩存的長度
	 * @param key 鍵
	 * @return
	 */
	public long lGetListSize(String key) {
		try {
			return redisTemplate.opsForList().size(key);
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 通過索引 獲取list中的值
	 * @param key 鍵
	 * @param index 索引 index>=0時, 0 表頭,1 第二個元素,依次類推;index<0時,-1,表尾,-2倒數(shù)第二個元素,依次類推
	 * @return
	 */
	public Object lGetIndex(String key, long index) {
		try {
			return redisTemplate.opsForList().index(key, index);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 將list放入緩存
	 * @param key 鍵
	 * @param value 值
	 * @param time 時間(秒)
	 * @return
	 */
	public boolean lSet(String key, Object value) {
		try {
			redisTemplate.opsForList().rightPush(key, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 將list放入緩存
	 * @param key 鍵
	 * @param value 值
	 * @param time 時間(秒)
	 * @return
	 */
	public boolean lSet(String key, Object value, long time) {
		try {
			redisTemplate.opsForList().rightPush(key, value);
			if (time > 0)
				expire(key, time);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 將list放入緩存
	 * @param key 鍵
	 * @param value 值
	 * @param time 時間(秒)
	 * @return
	 */
	public boolean lSet(String key, List<Object> value) {
		try {
			redisTemplate.opsForList().rightPushAll(key, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 將list放入緩存
	 * 
	 * @param key 鍵
	 * @param value 值
	 * @param time 時間(秒)
	 * @return
	 */
	public boolean lSet(String key, List<Object> value, long time) {
		try {
			redisTemplate.opsForList().rightPushAll(key, value);
			if (time > 0)
				expire(key, time);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 根據(jù)索引修改list中的某條數(shù)據(jù)
	 * @param key 鍵
	 * @param index 索引
	 * @param value 值
	 * @return
	 */
	public boolean lUpdateIndex(String key, long index, Object value) {
		try {
			redisTemplate.opsForList().set(key, index, value);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * 移除N個值為value
	 * @param key 鍵
	 * @param count 移除多少個
	 * @param value 值
	 * @return 移除的個數(shù)
	 */
	public long lRemove(String key, long count, Object value) {
		try {
			Long remove = redisTemplate.opsForList().remove(key, count, value);
			return remove;
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}
}

五、小結(jié)

整合其實不麻煩,網(wǎng)上好多博文都有。注意設(shè)置下key和value的序列化方式,不然存到Redis的中數(shù)據(jù)看起來像亂碼一下。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PC 端微信掃碼注冊和登錄實例

    PC 端微信掃碼注冊和登錄實例

    這篇文章主要介紹了PC 端微信掃碼注冊和登錄實例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Java實現(xiàn)字符串反轉(zhuǎn)

    Java實現(xiàn)字符串反轉(zhuǎn)

    這篇文章介紹了Java實現(xiàn)字符串反轉(zhuǎn)的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • springboot依賴沖突問題及解決過程

    springboot依賴沖突問題及解決過程

    新搭了一個springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的過程中,啟動報錯,怎么解決這個問題呢,下面小編給大家?guī)砹藄pringboot依賴沖突問題及解決過程,一起看看吧
    2021-09-09
  • JavaWeb后臺購物車類實現(xiàn)代碼詳解

    JavaWeb后臺購物車類實現(xiàn)代碼詳解

    這篇文章主要介紹了JavaWeb后臺購物車類實現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • java 中RSA的方式實現(xiàn)非對稱加密的實例

    java 中RSA的方式實現(xiàn)非對稱加密的實例

    這篇文章主要介紹了java 中RSA的方式實現(xiàn)非對稱加密的實例的相關(guān)資料,這里提供實例幫助大家理解這部分知識,需要的朋友可以參考下
    2017-08-08
  • SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn)

    這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 淺談springcloud gateway 連接?;顔栴}

    淺談springcloud gateway 連接?;顔栴}

    這篇文章主要介紹了springcloud gateway 連接?;顔栴},具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC數(shù)據(jù)處理和亂碼問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • synchronized及JUC顯式locks?使用原理解析

    synchronized及JUC顯式locks?使用原理解析

    這篇文章主要為大家介紹了synchronized及JUC顯式locks?使用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • java數(shù)據(jù)隨機分頁實現(xiàn)方案

    java數(shù)據(jù)隨機分頁實現(xiàn)方案

    本文主要介紹了java數(shù)據(jù)隨機分頁實現(xiàn)方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論