大家用SpringDataRedis的RedisTemplate时,怎么对象序列化的?
java吧
全部回复
仅看楼主
level 13
zu123456 楼主
看到几个做法:
1、 业务比较简单,没有对象,全是String,不用处理;
2、调用redisTemplate的存储API前,在自己代码里序列化转成String,然后存储(同样读取也是读到后代码里反序列化);
3、@Bean里自定义RedisTemplate,其中的RedisSerializer选择提供的GenericJackson2JsonRedisSerializer
4、@Bean里自定义RedisTemplate,其中RedisSerializer是自己写的,利用了更省空间的其他序列化工具
其中3~4是可以不用额外写序列化的代码了,更简洁一点。
2023年06月05日 06点06分 1
level 8
本身就提供了stringredistemplate,直接用这个对象不就行了
2023年06月05日 10点06分 2
我猜你应该是情况1,stringredistemplate是extends RedisTemplate<String, String>,所以value是不能直接放对象,只能是string。如果你的场景可以直接用,估计是所有的value都是string,可能没有直接传入对象。当然也可能是你提前转好string然后再用,也就是情况2
2023年06月05日 10点06分
当然很多地方习惯把对象具体进行拆解存为hash,保证每一个小地方基本都是string,这样也是没问题的
2023年06月05日 10点06分
level 7
建议使用stringRedisTemplate
2023年06月05日 12点06分 3
level 1
同楼上,全部存json字符串
2023年06月05日 13点06分 4
level 14
都有用,我自己也封装过一套存取,但其实用起来也麻烦。
用指定的序列化方式在某些场景下是比较有用的,比如说我们有个需求要每2-3秒中左右从一个redis的hashkey里getall出来全部数据并且把value全部转化为对象。redis里的key是用字符串拼接的每一位数据这么个规则。
正常情况下把value当做string读出来肯定没问题,但如果要做业务判断处理,就还得需要遍历map然后把每个value转成对象。
但实际上从底层来说这么做就会浪费一次遍历,因为spring的redis底层无论是jedis还是lettuce,执行hgetall命令的时候拿到的结果都是一个map<byte[], byte[]> redis底层拿到这个map之后会遍历走一遍反序列化,然后你拿到这个map又做了一次遍历,但实际上只需要一次的。
说穿了根本上来说我们这种大hash key读取又要很高的性能,spring底层就没给我们这个口子,理论上读出整个二进制报文自己放到一个map里是最快的,但那样就失去了用java的意义了,我用c++写好不咧
2023年06月05日 13点06分 5
level 14
综上而言,一般情况下都没什么特别大的必要去自定义序列化。json或者string差不多够用了。再不济也没必要走序列化了,直接execute或者executePipeline更加简单直接。
相比之下用redis还是多琢磨琢磨lua脚本怎么写,很多时候既要相对高的性能又要保证原子性操作,lua脚本实用多了,就是不好维护和调试。
2023年06月05日 13点06分 6
level 12
统一一下redis序列化的配置就行了
2023年06月05日 13点06分 7
level 13
一半会对redis的序列化进行配置为第3点,这样Jackson序列化的个别类型是带有类型全限定名的,占用内存。我都是自己转好json存入,以达到最小内存占用。我也只用stringRedisTemplate。
2023年06月05日 15点06分 8
一般都会配置为第3点,redisTemplate直接存对象进去,比转好json再存进去,其实是差不多的,小项目无所谓不会有太多数据存redis中。看每个人喜好吧。
2023年06月05日 15点06分
@会飞的长颈鹿🔥 类全限定名是Jackson序列化规则没配好吧,其实关键还是看平时用什么序列化库。像我们使用json库都用Jackson的,也没出现啥全限定名的问题
2023年06月06日 04点06分
不清楚,别人用项目框架封装的方法就有,不关我事夜不搭理
2023年06月06日 10点06分
level 6
我基本上都是序列化后再存取的,项目的原因 基本上是全异步加rpc。如果用spring,那就str redis temp
2023年06月06日 07点06分 10
level 7
stringredistemplate
2023年06月07日 07点06分 11
1