SpringBoot之RedisTemplate存取Long类型数据自动变Integer问题

【饿了么、美团】外卖红包领取地址 >> 能省一点是一点

在SpringBoot中,经常使用RedisTemplate来对redis进行操作,但是我们会发现,当我们修改了RedisTemplate的序列化方式之后,在存取Long类型数据时,会发生一些问题。

前置知识点:SpringBoot之RedisTemplate操作redis出现\xAC\xED\x00\x05t\x00\x08乱码问题

问题:
当我们定义了一个Long类型的数据l1,且l1的实际值小于等于 Integer.MAX_VALUE 时。这个时候将l1存入redis再从redis中重新读取l1的值时,如果使用了(Long)进行类型转换时,也就是下方代码:

(Long) redisTemplate.opsForValue().get(k1)

会直接报异常:java.lang.Integer cannot be cast to java.lang.Long

那么问题来了,我明明存进去的是个Long类型,为啥取出来的时候变成了Integer类型呢?
原因是因为我们指定了RedisTemplate的序列化方式,实际在redis存的是具体的数字,那么当读取的时候,代码并不知道缓存中的数字到底是Integer类型还是Long类型,于是乎会使用实际数字的值进行自动转换。

那我们有什么办法可以解决这个问题呢?除了使用Object对象进行缓存结果的承接,然后判断类型进行转换,有没有什么更好的办法?
我们仔细观察一下Integer类和Long类,会发现他们都继承了一个Number类,而且Number类中存在intValue()和longValue() 两个方法。那么问题就迎刃而解了,我们可以直接使用(Number)进行类型转换,在需要使用的地方用具体的xxValue()方法进行值的获取即可。

测试代码:

//往缓存写入数据
Long l1 = 1L;
Long l2 = Integer.MAX_VALUE + 1L;
String k1 = "k1";
String k2 = "k2";
redisTemplate.opsForValue().set(k1, l1);
redisTemplate.opsForValue().set(k2, l2);

//从缓存中读取数据
Object o1 = redisTemplate.opsForValue().get(k1);
Object o2 = redisTemplate.opsForValue().get(k2);
System.out.println("k1对应value类型"+o1.getClass().getName());
System.out.println("k2对应value类型"+o2.getClass().getName());

//强制使用Long类型会报异常
try {
    Long o3 = (Long) redisTemplate.opsForValue().get(k1);
} catch (Exception e) {
    System.out.println(e.getMessage());
}

//解决方法
Number n1 = (Number) redisTemplate.opsForValue().get(k1);
System.out.println("需要int时"+n1.intValue());
System.out.println("需要long时"+n1.longValue());

代码:https://gitee.com/lqccan/blog-demo/tree/master/SpringBoot/redis-number
单元测试:DemoApplicationTest


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

斑马牌(ZEBRA)3色多功能笔杆 SARASA系列彩色中性笔杆 (替芯RNJK5) S3A25 浅粉杆
¥9.90
王后雄学案教材完全解读 高中化学4选择性必修2物质结构与性质 配鲁科版 王后雄2023版高二化学
¥33.93
哈骆顿(HALODN) 暖手蛋替换芯学生毛绒暖宝宝自发热暖手宝冬季免充电免注水暖手贴儿童便携捂手蛋 3个毛绒暖手蛋+30片替换芯【款式随机】 【2022年新款暖手蛋,店长强烈推荐】
¥37.00
强生悠然舒缓护手霜50g(洋甘菊舒缓 防止干裂粗糙 嫩滑双手)
¥17.60
400g泓一咸蛋黄蛋卷零食蛋黄酥办公室零嘴宅家网红零食食品糖 400g(约16袋共64根)
¥10.90
都小秀 指甲刀【3件套】便携指甲钳不锈钢大中小号套装修脚刀成人儿童通用亮银白
¥15.90
慕安士(Monchou)泰国进口 宠物零食鸡肉日本木鱼浓汤罐头70g*1 猫罐头
¥12.00
临犀字帖必考词句初中语文字帖(七年级上册)·人教部编版/教材同步字帖词语词组临摹视频讲解
¥14.86