首页 > 其他分享 >Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>

Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>

时间:2022-10-07 18:06:39浏览次数:41  
标签:Map 缓存 HashMap Object redis key 放入 String

背景

将一个类型为Map<Integer, String>的一个Map对象放到redis中后,再次取出来时。当我们想便利Map.entrySet()获取每个Entry中的Key,如执行Integer key = entry.getKey();

那么在执行时就会报错:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

Map<Integer,String> cacheMap =(Map<Integer,String>)redisCache.get(key);

for (Map.Entry<Integer, String> entry : cacheMap.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
}

探究

debug时发现,在从redis获得这个Map<Integer,String> cacheMap对象时,它其中的Key的实际类型已经是String类型。这是因为redisson采用JsonJacksonCodec反序列化时,是用Object作为对象decode。在这一步会默认把key设置成string。

private final Decoder<Object> decoder = new Decoder<Object>() {
@Override
public Object decode(ByteBuf buf, State state) throws IOException {
return mapObjectMapper.readValue((InputStream) new ByteBufInputStream(buf), Object.class);
}
};

测试

@Test
public void testMap() throws IOException {
ObjectMapper mapper = new ObjectMapper();
HashMap<Integer, String> map = new HashMap<>();
map.put(11, "little");
map.put(6, "nuts");

String s = mapper.writeValueAsString(map);
//{"11":"little","6":"nuts"}
System.out.println(s);

HashMap o = (HashMap)mapper.readValue(s, Object.class);
assertEquals(o.get("11"), "little");
assertNotEquals(o.get(11), "little");
}

总结

如果要针对,对象进行JsonJackson序列化时,如果对象是Map,则需要注意不要用Integer做为key。如果要将一个json对象作为redis缓存时,同样不要将Integer当作HashMap的key类型。

 

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。


Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>_redis

作者:翎野君


如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。

转载文章请务必保留出处和署名,否则保留追究法律责任的权利。



标签:Map,缓存,HashMap,Object,redis,key,放入,String
From: https://blog.51cto.com/lingyejun/5734772

相关文章

  • CPU缓存对性能的影响
    CPU缓存机制的几个特点及编写程序时需要注意的点:1.时间局部性,CPU缓存会假设,如果访问了某一内存区域的,那么很快会重复访问它需要时才声明变量,尽可能缩短对象的周期,提高缓......
  • CVPR2022| BodyMap可用于换装,Vision Transformers 又立功!
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注公众号AI算法与图像处理,获取更多干货:大家好,  最近正在......
  • ES Mapping
    映射是定义如何存储和索引一个文件及其包含的字段的过程。每个文档都是一个字段的集合,每个字段都有自己的数据类型。当映射你的数据时,你创建一个映射定义,其中包含一个与文......
  • 3、spring+mybatis关联映射(无mapper实现类)+idea+maven
    该工程采用spring+mybatis的关联映射,动态sql,sql片段实现1、搭建项目结构如下  2、配置项目的pom.xml文件中的依赖1<?xmlversion="1.0"encoding="UTF-8"?>23<proj......
  • 2、spring+mybatis注解(无mapper实现类)+idea+maven
    1、在idea中配置database连接数据库,用来在idea中编写sql脚本操作数据库         2、sql详细脚本如下:1--1.创建部门表2createtabledept3(4deptnoint......
  • 隔板法解决小球放入箱子问题(箱子可空,箱子不可空)
    n个箱子k个小球1、不可空:k个小球共有k-1个空隙,k-1个空隙中选n-1个位置放入隔板,形成n个箱子答案为C(k-1,n-1)2、可空k个小球和n-1个隔板,选取k个位置放小球,并形成n个箱......
  • 缓存雪崩等问题
    缓存雪崩就是在同一段时间内有大量缓存数据失效了(缓存过期了、被内存淘汰策略淘汰了或者Redis服务宕机了),然后在这段时间内又有请求想要获取这些数据,因为这些缓存数据已经......
  • MyBatis框架:第十章:mybatis缓存
    mybatis缓存说明:缓存指的是把一些常用的数据,保存到一个可以高速读取的缓冲区中。方便程序在频繁读取的时候,可以快速的取出数据。这就叫做缓存。一级缓存指的是,这些缓存......
  • 2022年中国研究生数学建模竞赛C题代码及参考思路-汽车制造涂装-总装缓存调序区调度优
    一、背景介绍汽车制造厂主要由焊装车间、涂装车间、总装车间构成,每个车间有不同的生产偏好,如:焊装车间由于车身夹具的限制偏向最小车型及配置切换生产,涂装车间由于喷漆(固定每......
  • SQLMap进阶:参数讲解
    1、--level5:探测等级 —level5参数代表需要执行的测试等级为5,一共有5个测试等级1~5,可不加level,不加等级参数默认是1。SQLMap使用的Payload可以在xml/poyloads.xml中看......