需求描述
一個查詢List的需求,如果redis有,就直接從redis中獲取List返回。如果沒有,則先查詢,再保存入redis中。使用RedisTemplate實現。
實現步驟
添加maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
@Configuration配置
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
String host = env.getProperty("redis.url");
Integer port = Integer.valueOf(env.getProperty("redis.port"));
String password = env.getProperty("redis.password");
// 單機配置
RedisStandaloneConfiguration standaloneConfig = new RedisStandaloneConfiguration();
standaloneConfig.setHostName(host);
standaloneConfig.setPort(port);
if (StringTools.isNotBlank(password)) {
standaloneConfig.setPassword(RedisPassword.of(password));
}
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(standaloneConfig);
return connectionFactory;
}
@Bean
public RedisTemplate<Object, Object> getRedisTemplate(RedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory);
//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer來序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
僞代碼
@Autowired
private RedisTemplate redisTemplate;
@Override
@ExecTime
public List<TaskDto> getTaskDtoListUseCache(String uid) {
String key = getTaskRedisKey(uid);
boolean hasKey = redisTemplate.hasKey(key);
if (hasKey) {
List<TaskDto> taskDtoList = (List<TaskDto>) redisTemplate.opsForValue().get(key);
return taskDtoList;
}
else {
List<TaskDto> taskDtoList = getTaskDtoList(uid);
long expireTime = getTaskExpireTime();
redisTemplate.opsForValue().set(key, taskDtoList, expireTime, TimeUnit.SECONDS);
log.info("用戶[{}]的任務列表數據緩存成功,過期秒數爲:[{}]s", uid, expireTime);
return taskDtoList;
}
}
實體類需要實現序列化接口
public class TaskDto implements Serializable {
...
}
總結
可以發現,使用org.springframework.data.redis.core.RedisTemplate
,可以極大地簡化Java對redis的操作。
可以直接把List等結果保存在redis中,需要的時候也可以很方便地進行反序列化。