省流
1.用StringRedisTemplate,且变量类型确认为String
2.变量值是否自带引号
说明
用redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null(不管是RedisTemplate还是StringRedisTemplate)
仔细一看发现:存入redis后,key左右多了个双引号。
测试了一下必须加上引号才能取出来,不然就是null
解决(可能的原因)
以下不是按顺序的。每一点对应一种情况。仅供参考,有错轻喷
1.换RedisTemplate为StringRedisTemplate就可以。
原因如下(摘自其他文章)
RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
2.如果用RedisTemplate,需要作一些配置,大致是修改序列化的类(以下代码只是简单说一下,具体可以看下别人的文章)
//template.setKeySerializer(jackson2JsonRedisSerializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
3.如果用的是StringRedisTemplate(只能支持String),一定要检查你set的key和value是不是String,否则的话总是加上引号。
4.检查前后端代码。看变量是不是本来就自带双引号。
补充
我就是因为最后两点,没检查好变量类型和变量值,而且基础不扎实,前后端传数据的时候想当然了。
前后端代码截取片段如下:
//前端。请求Ajax时,其中的data。email是一个变量,字符串,存了邮箱地址
//data : JSON.stringify(email),
data : JSON.stringify({"email":email}),
//后端,实际上是post请求
@RequestMapping("/send")
public R send(@RequestBody String email){}
这里前后端有问题的。假设email值为"123@qq.com",
对于data : JSON.stringify(email)
,传到后端的时候,后端email变量就是="“123@qq.com”"
对于data : JSON.stringify({"email":email})
,后端email变量就是="{“email”:“123@qq.com”}",
因为它直接把前端传过来的整个放进后端email变量了。存进redis的时候自然有双引号。
这里,最好是后端直接用一个vo对象接收,前端用data : JSON.stringify({"email":email})
参考
StringRedisTemplate操作redis数据
前端json数据 到 自动后台转换为对象 Spring
RedisTemplate.opsForHash().entries(hashkey)方法出现多双引号序列问题
解决redis redistemplate KEY为字符串是多双引号的问题
redis使用Jackson2JsonRedisSerializer序列化问题
RedisTemplate序列化StringRedisSerializer只能支持String的坑
StringRedisTemplate 和RedisTemplate 对比分析
转载请注明:redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 存入的key被加上了引号 | 胖虎的工具箱-编程导航