使用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值