使用concurrentHashMap如何实现缓存

 更新时间:2025年02月19日 11:27:39   作者:蜗牛^^O^  
文章介绍了使用ConcurrentHashMap实现缓存的线程安全性和初始化方法,以及如何处理高并发场景下的缓存清理和数据一致性问题,包括分桶、使用ConcurrentLinkedQueue以及使用CountDownLatch来确保缓存数据的不丢失

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis-Plus联表查询及分页代码举例

    MyBatis-Plus联表查询及分页代码举例

    本文介绍了mybatis-plus-join工具的使用,该工具可以简化mybatis-plus的联表查询,使得开发者可以以类似QueryWrapper的方式进行联表查询,无需手动编写xml文件,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • SpringBoot Redis配置多数据源的项目实践

    SpringBoot Redis配置多数据源的项目实践

    springboot中默认的redis配置是只能对单个redis库进行操作的, 那么我们需要多个库操作的时候这个时候就可以采用redis多数据源 ,本文就介绍了SpringBoot Redis配置多数据源,感兴趣的可以了解一下
    2023-07-07
  • java控制台输出数字金字塔示例分享

    java控制台输出数字金字塔示例分享

    这篇文章主要介绍了java控制台输出数字金字塔的示例,控制台输出的缺陷是数字不能完全居中,只能右对齐或左对齐,大家参考使用吧
    2014-01-01
  • Java基于解释器模式实现定义一种简单的语言功能示例

    Java基于解释器模式实现定义一种简单的语言功能示例

    这篇文章主要介绍了Java基于解释器模式实现定义一种简单的语言功能,简单描述了解释器模式的概念、功能及Java使用解释器模式定义一种简单语言的相关实现与使用技巧,需要的朋友可以参考下
    2018-05-05
  • 图文详解Maven工程打jar包的N种方式

    图文详解Maven工程打jar包的N种方式

    最近在打包maven项目时,该项目中仅有一个测试类,想打成jar包运行测试,所以下面这篇文章主要给大家介绍了关于Maven工程打jar包的N种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java 将字符串动态生成字节码的实现方法

    Java 将字符串动态生成字节码的实现方法

    本篇文章主要是对Java将字符串动态生成字节码的实现方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 一文详解如何指定Maven的JDK版本

    一文详解如何指定Maven的JDK版本

    这篇文章主要介绍了如何修改Maven的可执行文件以指定JDK版本,并验证Maven是否使用了正确的JDK版本,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • 在Linux上搭建一个Java部署环境的详细步骤

    在Linux上搭建一个Java部署环境的详细步骤

    这篇文章主要介绍了在Linux上搭建一个Java部署环境,安装jdk有很多种方式,但是我们这里推荐的是使用yum直接安装openjdk,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • java date类与string类实例代码分享

    java date类与string类实例代码分享

    这篇文章主要介绍了java date类与string类实例代码分享,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 基于Spring boot @Value 注解注入属性值的操作方法

    基于Spring boot @Value 注解注入属性值的操作方法

    这篇文章主要介绍了结合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论