【开发利器Hutool】推荐一个超好用的本地缓存

简介: 【开发利器Hutool】推荐一个超好用的本地缓存

概述


Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool是由中国人开源,API的设计和中文注释都十分好用。

今天主要介绍下Hutool中的本地缓存API,它提供了各种各样的缓存策略供我们使用,十分简单方便。本地缓存在某些场景还是很好用的,相对于分布式缓存,基本上不用担心因为网络等原因导致的数据不一致,那直接看例子吧。


缓存创建API


CacheUtil类是一个可以创建各种类型缓存的工厂类,默认提供了下面6种缓存的创建:

  1. FIFOCache: 先进先出缓存
  • 元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)
  • 优点:简单快速
  • 缺点:不灵活,不能保证最常用的对象总是被保留
  • API:static <K, V> FIFOCache<K, V> newFIFOCache(int capacity, long timeout)
  1. LFUCache: 最少使用率缓存
  • 根据使用次数来判定对象是否被持续缓存,使用率是通过访问次数计算的。
  • 清理后依旧满的情况下清除最少访问(访问计数最小)的对象并将其他对象的访问数减去这个最小访问数,以便新对象进入后可以公平计数。
  • API:static <K, V> LFUCache<K, V> newLFUCache(int capacity, long timeout)
  1. LRUCache: 最近最久未使用缓存
  • 根据使用时间来判定对象是否被持续缓存 当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
  • 此缓存基于LinkedHashMap,因此当被缓存的对象每被访问一次,这个对象的key就到链表头部。
  • 这个算法简单并且非常快,他比FIFO有一个显著优势是经常使用的对象不太可能被移除缓存。 缺点是当缓存满时,不能被很快的访问。
  • API: static <K, V> LRUCache<K, V> newLRUCache(int capacity, long timeout)
  1. TimedCache: 定时缓存
  • 此缓存没有容量限制,对象只有在过期后才会被移除
  • API: static <K, V> TimedCache<K, V> newTimedCache(long timeout)
  1. WeakCache: 弱引用缓存
  • 对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。
  • 丢弃某个键时,其条目从映射中有效地移除。
  • API: static <K, V> WeakCache<K, V> newWeakCache(long timeout)
  1. NoCache: 不缓存
  • 不实现缓存,用于快速关闭缓存。
  • API: static <K, V> NoCache<K, V> newNoCache()


缓存操作API


上面的几个缓存实现了同一个缓存接口Cache,该接口封装了缓存操作的基本API, 比如添加、修改缓存等,以下是比较重要的几个接口。

  • void put(K key, V object)

将对象加入到缓存,使用默认失效时长

  • void put(K key, V object, long timeout)

将对象加入到缓存,使用指定失效时长

  • V get(K key)

从缓存中获得对象,当对象不在缓存中或已经过期返回null

  • V get(K key, Func0 supplier)

从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象

  • remove(K key)

从缓存中移除对象

  • Iterator<CacheObj<K, V>> cacheObjIterator()

返回包含键和值得迭代器,用来遍历缓存数据

  • Cache<K, V> setListener(CacheListener<K, V> listener)

设置监听器,用于实现缓存操作时的回调监听,例如缓存对象的移除事件等


缓存使用例子


我们介绍了一些相关的方法,那么直接上例子。

@Test
public void fifoCacheTest(){
    Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3, 5000);
    fifoCache.setListener((key, value)->{
        // 监听删除
        System.out.println("remove:" + key + "——" + value);
    });
    fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
    fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
    fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);
    fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);
    //由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
    String value1 = fifoCache.get("key1");
    Assert.assertNull(value1);
    String key = "key5";
    // 如果key从缓存中后去不到,调用Func方法返回的结果,并且保存到缓存中
    String key5Value = fifoCache.get(key, new Func0<String>() {
        @Override
        public String call() throws Exception {
            // 比如从数据库获取数据
            return "from db data " + key;
        }
    });
    System.out.println("first get key5 value: " + key5Value);
    // 再次从缓存中获取,就有了
    System.out.println("second get key5 value: " + fifoCache.get(key));
}

运行结果:

1671196168322.jpg


总结


本文总结了hutool工具类中缓存的api和使用,希望对大家有帮助。

目录
相关文章
|
缓存 Java
java开发常用模块——缓存模块
java开发常用模块——缓存模块
143 0
|
XML 存储 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
249 0
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
缓存 前端开发 Linux
哇塞!NPM 缓存竟成开发拦路虎?快来掌握清空秘籍,开启前端开发逆袭之旅!
【8月更文挑战第20天】NPM是前端开发中管理依赖的关键工具。有时需清空其缓存以解决版本不一致或包损坏等问题,确保使用最新依赖。可通过命令`npm cache clean --force`强制清空全部缓存,或手动删除各系统下的缓存文件夹。注意清空缓存可能延长后续安装时间,建议事先备份依赖或确保可重新安装。正确管理缓存有助于提升开发效率。
829 1
|
缓存 算法 API
深入理解后端开发中的缓存策略
【7月更文挑战第15天】缓存是提高后端系统性能和扩展性的关键机制之一。本文将深入探讨后端开发中缓存的应用,包括缓存的基本原理、类型、以及在实际应用中的策略。我们将从缓存的定义开始,逐步介绍缓存在数据库查询、API响应和分布式系统中的优化作用。通过实例分析常见的缓存模式,如LRU、LFU和FIFO,并讨论它们在不同场景下的适用性。最后,文章还将涵盖缓存一致性问题和解决方案,帮助读者构建高效且可靠的后端系统。
258 12
|
开发框架 缓存 NoSQL
基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
|
缓存 编解码
FFmpeg开发笔记(十四)FFmpeg音频重采样的缓存
FFmpeg在视频流重编码和音频重采样中使用缓存机制。在音频文件格式转换时,特别是对于帧长度不固定的格式如ogg、amr、wma,需处理重采样缓存。通过调用`swr_convert`,传入空输入和0大小来清空缓存。在`swrmp3.c`中,修改帧样本数处理,并在循环结束后添加代码以冲刷缓存。编译并运行程序,将ogg文件重采样为MP3,日志显示操作成功,播放转换后的文件确认功能正常。
566 7
FFmpeg开发笔记(十四)FFmpeg音频重采样的缓存
|
存储 缓存 NoSQL
SpringBoot实用开发篇第四章(整合缓存技术)
SpringBoot实用开发篇第四章(整合缓存技术)
下一篇
开通oss服务