springboot中使用RedisTemplate操作redis遇到的问题
首先说说问题,
在springboot中使用RedisTemplate操作redis时候,通过redis工具发现存入redis的数据的键为空
,如下图:
点击空的键,弹出错误提示:不能打开值的标签,不能加载key,因为它(key)不存在数据库中,请重新加载连接,如图:
通过黑窗口查看redis中的键,发现存储在redis中的key不是设置的string值,前面还多出了许多类似\xac\xed\x00\x05t\x00
操作redis的代码如下:
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic List<User> findAll() {// 首先判断缓存中是否有数据 List<User> users = (List<User>) redisTemplate.boundValueOps("jae:springboot:user:id:1").get();if (users==null) {System.out.println("load from db");// 从数据库中查询users = userMapper.findAll();// 放入缓存redisTemplate.boundValueOps("jae:springboot:user:id:1").set(users);}else {System.out.println("load from redis");}
/*// 方便即存即删redisTemplate.delete("jae:springboot:user:id:1");
*/return users;}
}
spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,如下
private boolean enableDefaultSerializer = true;private RedisSerializer<?> defaultSerializer = new JdkSerializationRedisSerializer();private RedisSerializer keySerializer = null;private RedisSerializer valueSerializer = null;private RedisSerializer hashKeySerializer = null;private RedisSerializer hashValueSerializer = null;
解决办法:在代码中,将RedisTemplate 注入改成如下代码
private RedisTemplate 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;
}
一般到这里问题差不多可以解决了,但是我是存对象的集合,运行的时候报了一个类型转换异常,list不能转string,因此我将存入redis的user对象toString,问题得到解决。
优化redis操作:
- 如果你的pojo没有重写toString方法,这时候redis中存的值为对象的地址值,如果需要在redis中展示结果(非地址值),pojo重写toString即可
- 可以给存入redis的数据设置过期时间,即使我们在redis中看不见对应的数据,无法删除,但是我们还是可以通过redis的过期时间自动清除记录,下面示例为 设置过期时间是1小时
redisTemplate.boundValueOps("jae:springboot:user:id:1").set(users.toString(),1, TimeUnit.HOURS);
springboot中使用RedisTemplate操作redis遇到的问题相关推荐
- Spring中使用RedisTemplate操作Redis(spring-data-redis)
Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...
- spring-data-redis 中使用RedisTemplate操作Redis
Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...
- java jredis hset_SpringBoot中 集成 redisTemplate 对 Redis 的操作(四)HSet
SpringBoot中 集成 redisTemplate 对 Redis 的操作(四)HSet redis 数据结构中,set用于去重,hset 则用于 去重加排序.在hset 中,有两个概念: 1⃣ ...
- SpringBoot中注入RedisTemplate泛型异常
SpringBoot中注入RedisTemplate泛型异常 报错如下: org.springframework.beans.factory.UnsatisfiedDependencyExceptio ...
- java jedis使用_Java中使用Jedis操作Redis
Java中使用Jedis操作Redis 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0 ...
- java中使用lua操作redis
java中使用lua脚本参见我的上一篇文章 lua基础 本篇简单说下java中使用lua操作redis的示例,如下: 先引入jedis <dependency><groupId> ...
- RedisTemplate操作redis时,key值出现\xac\xed\x00\x05t\x00前缀
现象: 使用redistemplate操作redis,随后在客户端keys * 查询,发现key值多了前缀,但是不影响程序读写 经查阅资料,是RedisTemplate默认序列化方式用的是JdkSer ...
- RedisTemplate操作redis五大类型用法详解(springboot整合redis版本)
1.案例说明 springboot整合redis之后,提供了操作redis的简便方式 通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型 ...
- 【过程记录】springboot整合redis/分别用redisRepository和redistemplate操作redis
导入依赖 基本配置 使用RedisTemplate访问redis 使用Redisrepository访问redis 实例: 导入依赖 菜单大部分情况下不会出现变化,我们可以将其放入Redis 加快加载 ...
最新文章
- Java-集合的简单介绍
- Linux文件夹含义
- 程序员这口饭-职业规划解决方案
- c语言结构体单元测试,C语言结构体单元练习.doc
- RN子组件获取redux数据
- 南京航空航天大学2020数据结构课设
- 金山云笔试题:AKM函数
- 2022-2028全球记账软件行业调研及趋势分析报告
- 法语语法学习笔记——代词(1)
- 了解DPDK——内核NIC接口
- sfgghshs测试测试
- [译]尤雨溪: Ref语法糖提案
- 苹果真伪查询_苹果自研M1芯片Mac电脑开启预售!该不该冲?
- 【COCOS2DX-游戏开发之七】添加启动数字输入法的功能
- ASP.NET CORE的服务注册方法
- 喜讯 | 人大金仓荣获行业信息化领航企业奖
- VSCode配置Python开发环境!
- 8 9区别 endnote7_带鱼5-7和8-9的区别
- 防止 “黑天鹅”事件需态势感知 态势感知又如何实现?
- Linux软件安装—软件包管理—rpm命令管理—包名与依赖性