关于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 27 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
详解缓存穿透击穿雪崩解决方案
May 28 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
浅谈Redis中的RDB快照
Jun 29 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
基于Redis结合SpringBoot的秒杀案例详解
Oct 05 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
Redis实现分布式锁的五种方法详解
Jun 14 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
python抓取网页中链接的静态图片
2018/01/29 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python得到单词模式的示例
2018/10/15 Python
python实现flappy bird小游戏
2018/12/24 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
开办化妆品公司创业计划书
2013/12/26 职场文书
初三家长会邀请函
2014/01/18 职场文书
体育之星事迹材料
2014/05/11 职场文书
社区先进事迹材料
2014/05/19 职场文书
自我检讨书怎么写
2015/05/07 职场文书
项目备案申请报告
2015/05/15 职场文书
千手观音观后感
2015/06/03 职场文书
上学路上观后感
2015/06/16 职场文书
Golang日志包的使用
2022/04/20 Golang
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL