spring java redis 乱码
作者:bin我们使用redisTemplate去set一个value时,在redis里面用key * 去获取,会发现不是正常的字符串。
例如:
设置值:
redisTemplate.opsForValue().set("key1", "value1");
获取key:
127.0.0.1:6379> keys *key1 127.0.0.1:6379> "\xac\xed\x00\x05t\x00"
问题:
出现这个问题的原因是,java是一个基于对象的语言,redis是基于字符串存储的NoSql,对象是无法存储到Redis中的。
解决方案:
java提供了序列化机制,只要类实现了java.io.Serializable接口,就代表类的对象能够进行序列化,通过将类对象进行序列化,就能够得到二进制的字符的。
这样Redis就能将这些类对象的字符串进行存储,java也可以将那些二进制的字符串进行反序列化转为对象。
spring基于这个原理,spring提供类序列化机制,这里讨论2个常用的序列化器
StringRedisSerializer和JdkSerializationRedisSerializer(默认序列化器)
解决,这里为们使用String的序列化器去序列化就可以了
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); //获取一个序列化器 RedisSerializer stringRedisSerializer = redisTemplate.getStringSerializer(); //下面设置序列化器 redisTemplate.setKeySerialiazer(stringRedisSerializer); redisTemplate.setValueSerialiazer(stringRedisSerializer); //初始化链接 redisTemplate.setConnectionFactoru(initConnectionFactory()); //设置值 redisTemplate.opsForValue().set("key1", "value1");
使用redis获取key
127.0.0.1:6379> keys *key1 127.0.0.1:6379>"key1" 127.0.0.1:6379> get key1 127.0.0.1:6379>"value1"