关于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 相关文章推荐
Redis如何一键部署脚本
Apr 12 Redis
redis 查看所有的key方式
May 07 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
Redis监控工具RedisInsight安装与使用
Mar 21 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis keys命令的具体使用
Jun 05 Redis
Redis全局ID生成器的实现
Jun 05 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开发的一些注意点总结
2010/10/12 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
python实现简单俄罗斯方块
2020/03/13 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
django实现日志按日期分割
2020/05/21 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
软件毕业生个人鉴定
2014/03/03 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
青岛导游词
2015/02/12 职场文书
初中毕业感言300字
2015/07/31 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书