关于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 相关文章推荐
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
解析Redis Cluster原理
Jun 21 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
Redis高并发缓存架构性能优化
May 15 Redis
redis lua限流算法实现示例
Jul 15 Redis
Redis主从复制操作和配置详情
Sep 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
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
php中namespace及use用法分析
2016/12/06 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
新浪的图片新闻效果
2007/01/13 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
javascript模块化简单解析
2016/04/07 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
Python timeit模块原理及使用方法
2020/10/10 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技