在日常的項目中redis已經成為必不可少的一部分,本人以前redis用的不是很多,並且用的是redis的jedis實現。最近,想着在SpringBoot中使用redis,之前做過一些了解但是沒有具體用過,這次具體實踐的時候發現了一些小問題,在此記錄一下。
本人使用的SpringBoot版本為2.1.13.RELEASE,SpringBoot 2.X版本以后集成的redis為Luttuce實現。在使用的過程中先添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
添加配置
spring:
redis:
host: localhost
password:
port: 6379
測試
@RestController public class RedisController { @Autowired private RedisTemplate redisTemplate; @GetMapping("/testForString") public String testForString(){ redisTemplate.opsForValue().set("name","zhangsan"); Object name = redisTemplate.opsForValue().get("name"); System.out.println("name:"+name); return "success"; } }
說明執行成功,我們通過redis客戶端看下數據
通過keys *(不建議使用,自己測試用的)查看,發現存key為\xac\xed\x00\x05t\x00\x04name的數據
\xac\xed\x00\x05t\x00\x04name對應的值為\xac\xed\x00\x05t\x00\bzhangsan
由上可以看出數據是存到了redis中,只不過在存入的過程中做了一定處理。網上查了一下是序列化的問題,RedisTemplate的keySerializer和valueSerializer默認使用的是JdkSerializationRedisSerializer,此處我們需要重新設置一下keySerializer和valueSerializer
網上隨便搜了下方法,有如下方法
@Bean public RedisTemplate<Object, Object> redisTemplateKeyObject(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
再次執行測試方法,發現沒有效果。我們打斷點跟一下代碼
發現設置沒生效。網上查了下應該是自動配置導致了,找到Redis自動配置類看了下
@ConditionalOnMissingBean(name = {"redisTemplate"})
當找不到name為redisTemplate的Bean時會自動注入RedisTemplate。在看下我們上面設置RedisTemplate的代碼,發現對應的name為redisTemplateKeyObject,我們將其修改一下
@Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
現在可以通過redis客戶端查看數據了。以上就是自己使用RedisTemplate的一次實踐,其中遇到了一些小問題,在此記錄一下。