Spring中RedisTemplate的使用

需求描述

一個查詢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中,需要的時候也可以很方便地進行反序列化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章