当前位置: 代码网 > 服务器>服务器>缓存 > 使用concurrentHashMap如何实现缓存

使用concurrentHashMap如何实现缓存

2025年02月19日 缓存 我要评论
使用concurrenthashmap实现缓存1、concurrenthashmap本身是线程安全的2、使用@postconstruct注解init函数,在生成bean的时候会调用init函数。ini

使用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的初始值设为多少呢?

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com