使用concurrentHashMap如何实现缓存
使用concurrentHashMap实现缓存
1、concurrentHashMap本身是线程安全的
2、使用@PostConstruct注解init函数,在生成bean的时候会调用init函数。init函数进行concurrenthashMap的初始化,分配初始空间大小。并且开启线程每隔一段时间处理清空缓存,flushAlll。
3、如果一个key需要存多条消息,并发很高,可以考虑分桶,使用多个concurrentHashMap,根据key来决定放到那个Map保存,Map里面使用另外的key进行散列。
4、add向缓存添加元素,map元素个数大于阈值,则进行缓存处理清理
难点一
- 缓存需要读多写多,高并发。
- 使用concurrentHashMap比较合适,根据id来散列,id相同的消息多个,所以concurrentHashMap的val应该是一个线程安全,并且并发效率好的集合。
- 使用ConcurrentLinkedQueue。
难点二
上线发布,需要重启机器,缓存实例被销毁,怎么做到缓存的不丢失?
场景:
- 消费mq,放到缓存。
- 使用@BeforeDestory,void destory函数中,将flag置成flase,缓存添加函数add,先判断flag如果为flase,直接抛出异常,mq不确认ack。
- flag应该是volatile的。
难点三
- destory函数将flag置成flase,add函数根据flag判断,add是高并发的。可能add判断为true之后,正要放入缓存,destory才将flag置成flase,也会丢失少量消息。
- 如果使用CountDownLatch,等add把消息全部放入缓存之后,再执行uploadAll,把缓存全部刷,进行清理。关键是把countDownLatch的初始值设为多少呢?
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决
这篇文章主要介绍了SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09
SpringCloud Eureka Provider及Consumer的实现
这篇文章主要介绍了SpringCloud Eureka 提供者及调用者的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-10-10
解决springboot自定义配置Boolean属性不能生效的问题
这篇文章主要介绍了解决springboot自定义配置Boolean属性不能生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05


最新评论