最近我在把項目的php后端改成Java后端,之前的php項目我用的是Redis做的緩存記錄,然后還要用訂閱進行短信推送,所以Redis必須要用到。但是我用spring boot去整合Redis的時候,遇到的問題還是有的,先說整合的步驟吧!
首先你得在pom文件里面加入依賴:
<dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-data-redis</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-redis</artifactId>
? ? ? ? ? ? <version>1.3.8.RELEASE</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.apache.commons</groupId>
? ? ? ? ? ? <artifactId>commons-pool2</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>commons-io</groupId>
? ? ? ? ? ? <artifactId>commons-io</artifactId>
? ? ? ? ? ? <version>2.6</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>com.alibaba</groupId>
? ? ? ? ? ? <artifactId>fastjson</artifactId>
? ? ? ? ? ? <version>1.2.38</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>redis.clients</groupId>
? ? ? ? ? ? <artifactId>jedis</artifactId>
? ? ? ? ? ? <version>2.9.1</version>
? ? ? ? </dependency>
這些都是得在spring boot里面進行整合的,然后還要進行序列化等操作,這些百度都有
然后開始在yml里面配置Redis的信息:
redis:
? ? password: 123456
? ? port: 6379
? ? host: 127.0.0.1
? ? lettuce:
? ? ? pool:
? ? ? ? min-idle: 5
? ? ? ? max-idle: 10
? ? ? ? max-active: 8
? ? ? ? max-wait: 1ms
? ? ? shutdown-timeout: 100ms
? ? database: 0
然后就是工具類的封裝:
@Slf4j
@Configuration
public class RedisConfig {
? ? @Resource
? ? private RedisTemplate redisTemplate;
? ? public RedisTemplate setDataBase(int num) {
? ? ? ? LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
? ? ? ? if (connectionFactory != null && num != connectionFactory.getDatabase()) {
? ? ? ? ? ? connectionFactory.setDatabase(num);
? ? ? ? ? ? this.redisTemplate.setConnectionFactory(connectionFactory);
? ? ? ? ? ? connectionFactory.afterPropertiesSet();//一定要加上這句
? ? ? ? ? ? connectionFactory.resetConnection();
? ? ? ? }
? ? ? ? return redisTemplate;
? ? }
? ? /**
? ? * 序列化注入spring容器的RedisTemplate
? ? *
? ? * @return
? ? */
? ? @Bean
? ? public RedisTemplate<Serializable, Object> getRedisTemplate() {
? ? ? ? Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
? ? ? ? ObjectMapper mapper = new ObjectMapper();
? ? ? ? mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
? ? ? ? serializer.setObjectMapper(mapper);
? ? ? ? redisTemplate.setKeySerializer(new StringRedisSerializer());
? ? ? ? redisTemplate.setValueSerializer(new StringRedisSerializer());
? ? ? ? redisTemplate.setValueSerializer(serializer);
? ? ? ? redisTemplate.setHashKeySerializer(new StringRedisSerializer());
? ? ? ? redisTemplate.setHashValueSerializer(new StringRedisSerializer());
? ? ? ? redisTemplate.afterPropertiesSet();
? ? ? ? return redisTemplate;
? ? }
}
這里有一個注意點:
因為后期你不可能一直在某個數據庫里面加一個數據集合,還得用到其他的庫,所以就得用到切換數據庫的功能。
setDatabase后,如果你不用afterPropertiesSet,是無法達到刷新連接信息的目的。
在看用redis實現異步消息隊列時,遇到了注冊Event,其中看到了afterPropertiesSet。然后查博客,記錄下。
1、init-method方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。init-method需要在applicationContext.xml配置文檔中bean的定義里頭寫明。例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>這樣,當TestBean在初始化的時候會執行TestBean中定義的init方法。
2、afterPropertiesSet方法,初始化bean的時候執行,可以針對某個具體的bean進行配置。afterPropertiesSet 必須實現 InitializingBean接口。實現 InitializingBean接口必須實現afterPropertiesSet方法。
3、BeanPostProcessor,針對所有Spring上下文中所有的bean,可以在配置文檔applicationContext.xml中配置一個BeanPostProcessor,然后對所有的bean進行一個初始化之前和之后的代理。BeanPostProcessor接口中有兩個方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前執行, postProcessAfterInitialization方法在bean初始化之后執行。
總之,afterPropertiesSet 和init-method之間的執行順序是afterPropertiesSet 先執行,init-method 后執行。從BeanPostProcessor的作用,可以看出最先執行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。
@Slf4j
@Component
public class RedisUtils {
? ? @Resource
? ? private RedisConfig redisConfig;
? ? /**
? ? * 根據db獲取對應的redisTemplate實例
? ? *
? ? * @param db
? ? * @return redisTemplate實例
? ? */
? ? public RedisTemplate<Serializable, Object> getRedisTemplateByDb(final int db) {
? ? ? ? return redisConfig.setDataBase(db);
? ? }
? ? /**
? ? * 設置緩存
? ? *
? ? * @param key? 緩存key
? ? * @param value 緩存value
? ? */
? ? public void setString(String key, String value, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? redisTemplate.opsForValue().set(key, value);
? ? ? ? Loger.debug("RedisUtil:set cache key={},value={}", key, value);
? ? }
? ? /**
? ? * 設置緩存,并且自己指定過期時間
? ? *
? ? * @param key
? ? * @param value
? ? * @param expireTime 過期時間
? ? */
? ? public void setString(String key, String value, int expireTime, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
? ? ? ? Loger.debug("RedisUtil:set cache key={},value={}", key, value, expireTime, TimeUnit.SECONDS);
? ? }
? ? /**
? ? * 設置緩存對象,可指定DB
? ? *
? ? * @param key 緩存key
? ? * @param obj 緩存value
? ? */
? ? public <T> void setObject(String key, T obj, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? redisTemplate.opsForValue().set(key, obj);
? ? }
? ? /**
? ? * 新增hashMap值
? ? *
? ? * @param key
? ? * @param hashKey
? ? * @param hashValue
? ? * @param db
? ? * @return void
? ? * @author Xuyijieing
? ? * @date 2019年10月26日 9:22
? ? */
? ? public <T> void hashPutString(Serializable key, Serializable hashKey, String hashValue, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? operations.put(key, hashKey, hashValue);
? ? }
? ? /**
? ? * 以map集合的形式添加鍵值對
? ? *
? ? * @param key
? ? * @param maps
? ? * @param db
? ? * @return void
? ? * @author Sunhj
? ? * @date 2019年10月26日 9:56
? ? */
? ? public void hashPutAll(String key, Map<Serializable, Serializable> maps, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? operations.putAll(key, maps);
? ? }
? ? /**
? ? * 獲取變量中的鍵值對
? ? * {key3=value3, key1=value1, key5=value5, key4=value4, key2=value2}
? ? *
? ? * @param db
? ? * @param key
? ? * @return java.util.Map<String, String>
? ? * @author Xuyijie
? ? * @date 2019年10月26日 8:47
? ? */
? ? public <T> Map<Object, Object> hashGetAll(int db, Serializable key) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForHash().entries(key);
? ? }
? ? /**
? ? * 判斷key是否存在
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.util.Map<String, String>
? ? * @author Xuyijie
? ? * @date 2019年10月26日 8:47
? ? */
? ? public <T> Boolean hashHasKey(Serializable key, Serializable hahsKey, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForHash().hasKey(key, hahsKey);
? ? }
? ? /**
? ? * 獲取hash表中存在的所有的鍵
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.util.List<java.lang.String>
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:58
? ? */
? ? public Set<Object> hashGetAllHashKeys(Serializable key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForHash().keys(key);
? ? }
? ? /**
? ? * 獲取hash表中存在的所有的值
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.util.List<java.lang.String>
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:58
? ? */
? ? public List<Object> hashGetAllHashValues(Serializable key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForHash().values(key);
? ? }
? ? /**
? ? * 根據key,hashKey
? ? * 獲取hash表中存在的單個值
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.util.List<java.lang.String>
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:58
? ? */
? ? public Object hashGetObject(Serializable key, Serializable hashKey, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForHash().get(key, hashKey);
? ? }
? ? /**
? ? * 刪除一個或者多個hash表字段
? ? *
? ? * @param key
? ? * @param db
? ? * @param fields
? ? * @return java.lang.Long
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:15
? ? */
? ? public Long hashDelete(Serializable key, int db, Serializable... fields) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? return operations.delete(key, (Object) fields);
? ? }
? ? /**
? ? * 刪除一個hash表字段
? ? *
? ? * @param key
? ? * @param db
? ? * @param fields
? ? * @return java.lang.Long
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:15
? ? */
? ? public boolean hashDeleteOne(Serializable key, String fields, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? return operations.delete(key, fields) == 1;
? ? }
? ? /**
? ? * 設置緩存對象
? ? *
? ? * @param key 緩存key
? ? * @param obj 緩存value
? ? */
? ? public <T> void setObject(String key, T obj, int expireTime, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? redisTemplate.opsForValue().set(key, obj, expireTime, TimeUnit.SECONDS);
? ? }
? ? /**
? ? * 獲取指定key的緩存
? ? *
? ? * @param key---JSON.parseObject(value, User.class);
? ? */
? ? public Object getObject(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForValue().get(key);
? ? }
? ? /**
? ? * 獲取指定key的緩存
? ? *
? ? * @param key---JSON.parseObject(value, User.class);
? ? */
? ? public Object getKeys(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.opsForValue().getOperations().keys(key);
? ? }
? ? /**
? ? * 判斷當前key值 是否存在
? ? *
? ? * @param key
? ? */
? ? public boolean hasKey(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.hasKey(key);
? ? }
? ? /**
? ? * 獲取指定key的緩存
? ? *
? ? * @param key
? ? */
? ? public String getString(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? String value = (String) redisTemplate.opsForValue().get(key);
? ? ? ? Loger.debug("RedisUtil:get cache key={},value={}", key, value);
? ? ? ? return value;
? ? }
? ? /**
? ? * 刪除指定key的緩存
? ? *
? ? * @param key
? ? */
? ? public boolean delete(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? return redisTemplate.delete(key);
? ? }
? ? /**
? ? * @param key
? ? * @throws
? ? * @Title: expire
? ? * @Description: 更新key的失效時間
? ? */
? ? public Boolean expire(String key, int seconds, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? Loger.debug("RedisUtil:expire cache key={}", key);
? ? ? ? return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
? ? }
? ? /**
? ? * 移除并獲取列表中第一個元素
? ? *
? ? * @param key
? ? * @param db
? ? * @return void
? ? * @author sunhj
? ? * @date 2019年10月26日 14:35
? ? */
? ? public String listLeftPop(Serializable key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? Object leftPop = redisTemplate.opsForList().leftPop(key);
? ? ? ? if (leftPop == null) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? return JSON.toJSONString(leftPop);
? ? }
? ? /**
? ? * 移除并獲取列表最后一個元素
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.lang.Object
? ? * @author sunhj
? ? * @date 2019年10月26日 14:40
? ? */
? ? public String listRightPop(Serializable key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? ListOperations<Serializable, Object> operations = redisTemplate.opsForList();
? ? ? ? Object x = operations.rightPop(key);
? ? ? ? if (x == null) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ? return JSON.toJSONString(x);
? ? }
? ? /**
? ? * 獲取變量中的指定map鍵是否有值,如果存在該map鍵則獲取值,沒有則返回null。
? ? *
? ? * @param key
? ? * @param field
? ? * @param db
? ? * @return T
? ? * @author Sunhj
? ? * @date 2019年10月26日 8:41
? ? */
? ? public <T> T hashGet(Serializable key, Serializable field, Class<T> t, int db) {
? ? ? ? try {
? ? ? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? ? ? //String x = Objects.requireNonNull(operations.get(key, field)).toString();
? ? ? ? ? ? //T y = JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);
? ? ? ? ? ? //T y = JSON.parseObject(x , t);
? ? ? ? ? ? return JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? }
? ? /**
? ? * 獲取變量中的指定map鍵是否有值,如果存在該map鍵則獲取值(String格式),沒有則返回null。
? ? *
? ? * @param key
? ? * @param field
? ? * @param db
? ? * @return T
? ? * @author Sunhj
? ? * @date 2019年10月26日 8:41
? ? */
? ? public String hashGetString(Serializable key, Serializable field, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? try {
? ? ? ? ? ? Serializable serializable = operations.get(key, field);
? ? ? ? ? ? if (serializable != null) {
? ? ? ? ? ? ? ? return serializable.toString();
? ? ? ? ? ? }
? ? ? ? ? ? return null;
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? Loger.error("hashGetString方法異常", e);
? ? ? ? ? ? return null;
? ? ? ? }
? ? }
? ? /**
? ? * 獲取變量中的鍵值對 ??
? ? *
? ? * @param key
? ? * @param db
? ? * @return java.util.Map<String, String>
? ? * @author Sunhj
? ? * @date 2019年10月26日 8:47
? ? */
? ? public <T> Map<String, T> hashGetAll(Serializable key, Class<T> t, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? Map<Serializable, Serializable> x = operations.entries(key);
? ? ? ? Map<String, T> map = new HashMap<>();
? ? ? ? try {
? ? ? ? ? ? for (Serializable xa : x.keySet()) {
? ? ? ? ? ? ? ? String keyValue = x.get(xa).toString();
? ? ? ? ? ? ? ? map.put(xa.toString(), JSON.parseObject(keyValue, t));
? ? ? ? ? ? }
? ? ? ? ? ? return map;
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? }
? ? /**
? ? * 新增hashMap值
? ? *
? ? * @param key
? ? * @param hashKey
? ? * @param hashValue
? ? * @param db
? ? * @return void
? ? * @author Sunhj
? ? * @date 2019年10月26日 9:22
? ? */
? ? public <T> boolean hashPut(Serializable key, Serializable hashKey, T hashValue, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? operations.put(key, hashKey, JSON.toJSONString(hashValue, SerializerFeature.WriteMapNullValue));
? ? ? ? return true;
? ? }
? ? /**
? ? * 查看hash表中指定字段是否存在
? ? *
? ? * @param key
? ? * @param field
? ? * @param db
? ? * @return boolean
? ? * @author Sunhj
? ? * @date 2019年10月26日 10:32
? ? */
? ? public boolean hashExists(Serializable key, Serializable field, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? HashOperations<Serializable, Serializable, Serializable> operations = redisTemplate.opsForHash();
? ? ? ? return operations.hasKey(key, field);
? ? }
? ? /**
? ? * 存儲在list的頭部,即添加一個就把它放在最前面的索引處
? ? *
? ? * @param key
? ? * @param value
? ? * @param db
? ? * @return java.lang.Long
? ? * @author sunhj
? ? * @date 2019年10月26日 14:03
? ? */
? ? public Long listLeftPush(Serializable key, Serializable value, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? ListOperations<Serializable, Object> operations = redisTemplate.opsForList();
? ? ? ? return operations.leftPush(key, value);
? ? }
? ? /**
? ? * 獲取所有的KEY
? ? *
? ? * @param key
? ? */
? ? public List<Object> getHashKeys(String key, int db) {
? ? ? ? RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
? ? ? ? List<Object> values = redisTemplate.opsForHash().values(key);
? ? ? ? return values;
? ? }
}
這些都是比較簡單的,,沒什么好說的
然后平常使用redis的時候,避免不了使用樹形的結構,就是
用:隔開的樹形結構,但是你用redisTeamplate用get()是拿不到的,而且你就算使用通配符也拿不到,這個就得看源碼了!具體的我不分析了,不然還是寫一大篇
有一個api 是可以用通配符的,用
這個是獲取Redis對應的鍵才可以使用通配符,而且RedisManager也做了一個運算符的展示:
其他的都在上面了,然后后面還要做一個Redis 的連接池,避免Redis的連接資源浪費了,簡單的就不多說了