省流

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 对比分析

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐