最近使用spring-data-redis 和jedis 操作redis時發現存儲在redis中的key不是程序中設置的string值,前面還多出了許多類似\xac\xed\x00\x05t\x00這種字符串
2.原因:
spring-data-redis的RedisTemplate<K, V>模板類在操作redis時默認使用JdkSerializationRedisSerializer來進行序列化。
- public void afterPropertiesSet() {
-
- super.afterPropertiesSet();
-
- boolean defaultUsed = false;
-
- if (defaultSerializer == null) {
-
- defaultSerializer = new JdkSerializationRedisSerializer(
- classLoader != null ? classLoader : this.getClass().getClassLoader());
- }
-
- if (enableDefaultSerializer) {
-
- if (keySerializer == null) {
- keySerializer = defaultSerializer;
- defaultUsed = true;
- }
- if (valueSerializer == null) {
- valueSerializer = defaultSerializer;
- defaultUsed = true;
- }
- if (hashKeySerializer == null) {
- hashKeySerializer = defaultSerializer;
- defaultUsed = true;
- }
- if (hashValueSerializer == null) {
- hashValueSerializer = defaultSerializer;
- defaultUsed = true;
- }
- }
-
- if (enableDefaultSerializer && defaultUsed) {
- Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
- }
-
- if (scriptExecutor == null) {
- this.scriptExecutor = new DefaultScriptExecutor<K>(this);
- }
-
- initialized = true;
- }
3.解決方案
redisTemplate所在類加上: @Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); this.redisTemplate = redisTemplate; }
將redisTemplate默認改爲stringRedis序列化方式。
另一種方式,因爲我redisTemplate用了@Resource進行了註解,需要上面的序列化才能改。或者把註解改爲@Autowired,不用寫上面那些序列化方法,問題就解決了