• 常见java本地缓存


    Caffeine

    特点

    Caffeine的底层数据存储采用ConcurrentHashMap

    Caffeine是Spring 5默认支持的Cache,可见Spring对它的看重,Spring抛弃Guava转向了Caffeine。

    Caffeine可以看作是Guava Cache的增强版,采用了一种结合LRU、LFU优点的算法:W-TinyLFU,在性能上有明显的优越性

    依赖

    
        com.github.ben-manes.caffeine
        caffeine
        2.9.3
    

     简单使用

    1. public static void main(String[] args) throws InterruptedException {
    2. Cache cache = Caffeine.newBuilder()
    3. // 初始容量
    4. .initialCapacity(100)
    5. // 最大缓存数
    6. .maximumSize(1000)
    7. // 过期时间
    8. .expireAfterAccess(5, TimeUnit.SECONDS)
    9. // 失效时触发,不会自动触发
    10. .removalListener((k,v,removeCause)->{
    11. System.out.println("--------------"+k);
    12. }).recordStats()
    13. .build();
    14. cache.put("a","b");
    15. System.out.println(cache.getIfPresent("a")); // b
    16. Thread.sleep(6000);
    17. // cache.invalidate("a"); // 触发removalListener
    18. System.out.println(cache.getIfPresent("a")); // null
    19. System.out.println(cache.get("a", k -> { // 不存在则填充值,之前的过期触发removalListener
    20. System.out.println("进入get");
    21. return k;
    22. }));
    23. }

    Guava Cache

    特点

    Guava是Google团队开源的一款 Java 核心增强库,包含集合、并发原语、缓存、IO、反射等工具箱,性能和稳定性上都有保障,应用十分广泛。Guava Cache支持很多特性:

    • 支持最大容量限制
    • 支持两种过期删除策略(插入时间和访问时间)
    • 支持简单的统计功能
    • 基于LRU算法实现

    依赖

    
        com.google.guava
        guava
        18.0
    

    简单使用

    1. public static void main(String[] args) throws Exception {
    2. LoadingCache loadingCache
    3. //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例
    4. = CacheBuilder.newBuilder()
    5. //设置并发级别为8,并发级别是指可以同时写缓存的线程数
    6. // .concurrencyLevel(8)
    7. //设置写缓存后8秒钟过期
    8. .expireAfterWrite(2, TimeUnit.SECONDS)
    9. // .expireAfterAccess(10, TimeUnit.MINUTES)//设置时间对象没有被读/写访问则对象从内存中删除
    10. //设置缓存容器的初始容量为10
    11. .initialCapacity(10)
    12. //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
    13. .maximumSize(100)
    14. //设置要统计缓存的命中率
    15. .recordStats()
    16. //设置缓存的移除通知
    17. .removalListener((all)->{
    18. System.out.println("移除key:"+all.getKey());
    19. })
    20. //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
    21. .build(
    22. new CacheLoader() {
    23. @Override
    24. public String load(String s) throws Exception {
    25. return "b";
    26. }
    27. }
    28. );
    29. String a = loadingCache.get("a"); // 不存在key为“a”则触发load() return "b";
    30. // loadingCache.invalidate("a"); // 手动失效key,触发removalListener, System.out.println("移除key:"+all.getKey());
    31. TimeUnit.SECONDS.sleep(3);
    32. loadingCache.get("a"); // 过期触发removalListener, System.out.println("移除key:"+all.getKey());
    33. }

    Ehcache

    特点

    其缓存的数据可以放在内存里面,也可以放在硬盘上。

    ehcache的核心是cacheManager,cacheManager是用来管理cache(缓存)的。

    一个应用下可以有多个cacheManager,而一个cacheManager下又可以有多个cache

    cache内部保存的是一个的element,一个element中保存的是一个key和value的配对。

    1、快速

    2、简单

    3、多种缓存策略

    4、缓存数据有两级:内存和磁盘,因此无须担心容量问题

    5、缓存数据会在虚拟机重启的过程中写入磁盘

    6、可通过RMI、可插入APi等方式进行分布式缓存

    7、具有缓存和缓存管理器的监听接口

    8、支持多缓存管理器示例,以及一个实例的多个缓存区域

    9、提供hibernate的缓存实现

    同Caffeine和Guava Cache相比,Encache的功能更加丰富,扩展性更强

    ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但涉及缓存恢复、大数据缓存,则不适合。

     依赖

    
        org.ehcache
        ehcache
        3.9.0
    

    简单使用

    1. public static void main(String[] args) {
    2. CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
    3. .withCache("cache",
    4. CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(20))) 声明一个容量为20的堆内缓存
    5. .build(true);
    6. // cacheManager.init(); // true
    7. // Cache cache =
    8. // cacheManager.getCache("cache", Long.class, String.class);
    9. // cache.put();
    10. // cache.get()
    11. Cache myCache = cacheManager.createCache("myCache",
    12. CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))
    13. .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20)))//设置过期 可自定义过期策略
    14. );
    15. myCache.put(1L, "one!");
    16. String value = myCache.get(1L);
    17. cacheManager.removeCache("cache");
    18. cacheManager.close();
    19. }

    WeakHashMap

    jdk自带,根据合适场景使用

    WeakHashMap.Entry 继承了WeakReference

    弱引用的生存期特别短。垃圾回收的时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。

    ExpiringMap

    特点

    我使用的场景理由:过期自动触发移除事件

    依赖

    
        net.jodah
        expiringmap
        0.5.8
    

    简单使用

    1. public static void main(String[] args) throws InterruptedException {
    2. ExpiringMap map = ExpiringMap.builder()
    3. .expirationPolicy(ExpirationPolicy.CREATED)
    4. .expirationListener((k,v)->{
    5. System.out.println(k);
    6. System.out.println(v);
    7. })
    8. .maxSize(123)
    9. .expiration(2, TimeUnit.SECONDS)
    10. .build();
    11. // Expires after 30 seconds or as soon as a 124th element is added and this is the next one to expire based on the expiration policy
    12. map.put("connection", "1");
    13. TimeUnit.SECONDS.sleep(3);
    14. }
    15. // 可以使用ExpiringMap.builder().variableExpiration().build();然后搭配map,put(k,v, ExpirationPolicy.ACCESSED, 5, TimeUnit.MINUTES)为单个元素设置过期时间,不推荐

  • 相关阅读:
    生长刺激表达基因2蛋白(ST2)介绍
    DSP2335的按键输入key工程笔记
    软件和硬件中的调用
    汽车辅助系统
    javaweb02
    Hive参数与性能企业级调优
    二十一、数组(1)
    3D人脸扫描设备助推元宇宙虚拟人打造
    《Go 简易速速上手小册》第8章:网络编程(2024 最新版)
    项目中屏幕适配
  • 原文地址:https://blog.csdn.net/wai_58934/article/details/126443855