这篇文章会记录自己在使用springcloud和redis的组合使用时一些注意点
1、RedisTemplate和StringRedisTemplate
RedisTemplate和StringRedisTemplate在同样配置下所存储的位置一样。但是,一样的key却无法相互获取。他们两者之间的区别主要在于他们使用的序列化类。RedisTemplate使用的是JdkSerializationRedisSerializer,StringRedisTemplate使用的是StringRedisSerializer。RedisTemplate使用的序列类在操作数据的时候,会将数据先序列化成字节数组然后在存入Redis数据库。StringRedisTemplate则是以可读的形式存入redis。所以,对你来说是同样的存入一个key,但是,实际上存入的key值并不相同。
2、Redis切换DB的问题。
当我们使用同样的配置文件统一配置Redis时。可能会遇到需要切换数据库的问题。配置如下
spring:
redis:
database: 0
host: your-redis-name
port: 6379
password:
pool:
max-active: 8
max-wait: -1
max-idle: 8
这个时候又不想单独,再给redis做另一套匹配。这时可以使用如下方式来进行切换
private final int REDIS_DB = 5;//需要特殊指定的DB
@Value("${spring.redis.database}")
private int redisDbDefault;//默认的配置
private RedisTemplate redisTemplate;
/**
* 将数据存储到指定DB
*
* @param key 要存到redis的key
* @param value 要存到redis的值
*/
private void setInDB5(String key, JSONArray value) {
synchronized (redisTemplate) {
try {
changeRedisDB(REDIS_DB);
redisTemplate.opsForValue().set(key, value);
} catch (Exception e) {
} finally {
changeRedisDB(redisDbDefault);
}
}
}
/**
* 将数据存储到指定DB
*
* @param key 要取值redis的key
*/
private JSONArray getInDB5(String key) {
JSONArray value = new JSONArray();
synchronized (redisTemplate) {
try {
changeRedisDB(REDIS_DB);
value = JSONArray.fromObject(redisTemplate.opsForValue().get(key));
} catch (Exception e) {
} finally {
changeRedisDB(redisDbDefault);
}
}
return value;
}
/**
* 将redis切换到DB5,使用后一定要切回来(此方法不公用)
*
* @return
*/
private RedisTemplate changeRedisDB(int dbNum) {
JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
jedisConnectionFactory.setDatabase(dbNum);
redisTemplate.setConnectionFactory(jedisConnectionFactory);
return redisTemplate;
}