最近我在把项目的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的连接资源浪费了,简单的就不多说了