关于redisson缓存序列化几枚大坑说明


Posted in Redis onAugust 04, 2021

redisson缓存序列化几枚坑

1、返回值为Map<T, K> 的方法增加@Cacheable后,T和K被类型擦出了,为啥?

redisson结合Spring使用时,会有RedissonSpringCacheManager,将redissonClient自动注入,另外还有codec的概念,即序列化和反序列化,可以查看实现类,就几种实现,假设我们使用org.redisson.codec.JsonJacksonCodec,可以看到,decode中,仅一个Object.class,即范型信息并未带入,故出现了问题

关于redisson缓存序列化几枚大坑说明

2、对于匿名内部类的滥用导致反序列化失败

你会想,匿名内部类有什么影响?

那么跟着我看下我们时常会写的一种Map写法:

Map<String, Object> map = new HashMap(){{put("mykey", "test");}};

这种方式有什么问题呢,这就涉及到匿名内部类声明方式在实际编译时是如何存在于class文件中的

...
$1 extends HashMap{
    ...
}
...

也就是新生成了一个匿名类型,而这个类型在反序列化时是没办法找到构造函数的,故而是有问题的。

按上面写法后,序列化时,存储的是xxx$1这个匿名类型,所以反序列化也就失败了。

redis的坑(序列化、scan)

最近做的一个项目用到redis,需要使用redis对数据进行缓存,用户的动作也会更新redis中的数据,为了方便管理,采用了hash的方式。神坑就此开始。

最开始是序列化的坑

使用包装的ByteArrayRedisTemplate时,对象存入redis之后,rdm可以查看到,但是程序里面取出来是乱码,使用原生的RedisTemplate就不会出现这个问题,后来发现是对象包装的问题,原生的RedisTemplate中支持将value设置为对象,但是包装的ByteArrayRedisTemplate只能用byte[],所以我这边先把对象转为json,然后json转为byte[],再写入redis,取数据的时候,查redis的结果是byte[],然后转为json,再转为对象,就没问题了。

但是!!!不知道什么原因,这样做之后rdm中查不到这个key了,可能是redis版本和rdm版本不兼容的问题,这个有待验证。你看到的一切不一定存在,你看不到的也不一定不存在,当个码农还要思考这些哲学问题。。。

还有一个坑

spring整合的redis是不支持scan指令的,而且不只是scan指令,基本上所有搂全量的指令都被禁止,当然,像keys之类的指令还是能用,但是在生产环境下千万不要使用,因为很容易阻塞,业务动不动就停几秒,很尴尬。而且现在大部分在生产环境下使用的redis都是用codis包装的,codis更绝,直接禁止使用那些指令,同志们可以自己动手搜一下,被禁止的指令还是挺多得,我第一次看还以为自己看错了,尼玛禁了一大半,搂全量的指令全部被禁。不过这样做的好处就是数据安全,使用scan指令的漏洞捞数据的软件也不在少数。

最后项目只能放弃使用redis了,因为我必须得搂全量。。。通过这个事件也懂得了,代码开发一定要一边开发一边测试(自己测试),不然有的坑,掉进去了都不知道,还在屁颠屁颠的往里刨,最后把自己埋了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Redis 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
Redis IP地址的绑定的实现
May 08 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
Redis如何实现分布式锁
Aug 23 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
解决Redis启动警告问题
Feb 24 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
基于redis+lua进行限流的方法
Jul 23 Redis
Redis Cluster 集群搭建你会吗
Aug 04 #Redis
解析redis hash应用场景和常用命令
Aug 04 #Redis
redis 存储对象的方法对比分析
Aug 02 #Redis
springboot使用Redis作缓存使用入门教程
Jul 25 #Redis
Redis中一个String类型引发的惨案
缓存替换策略及应用(以Redis、InnoDB为例)
浅谈redis整数集为什么不能降级
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
深入理解PHP中的global
2014/08/19 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python进行统计建模
2020/08/10 Python
python实现视频压缩功能
2020/12/18 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
植物生产学专业求职信
2014/08/08 职场文书
法制教育演讲稿
2014/09/10 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
社区工作者个人总结
2015/02/28 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
八年级作文之友情
2019/11/25 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS