谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。 ?...Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果不符合需求,可以选择Memcached、Redis等工具。 小案例 pom.xml添加guava依赖 GuavaCacheDemo.java 代码如下: package me.xueyao.cache.java.guava...; import java.util.concurrent.TimeUnit; /** * @author simon * https://github.com/google/guava */...(8, TimeUnit.SECONDS) //设置写缓存后1秒钟刷新 .refreshAfterWrite(1, TimeUnit.SECONDS
在项目中用到的除了分布式缓存,还有本地缓存,例如:Guava、Encache,使用本地缓存能够很大程度上提升程序性能,本地缓存是直接从本地内存中读取,没有网络开销。...今天给大家介绍一个高性能的 Java 缓存库 -- Caffeine 。...简介 Caffeine是基于Java8 的高性能缓存库,借鉴了 Guava 和 ConcurrentLinkedHashMap 的设计经验,拥有更高的缓存命中率和更快的读写速度。...性能比Guava更强 功能特性 基于时间的回收策略:包括写入时间和访问时间 基于容量的回收策略:一种是基于容量大小,一种是基于权重大小,两者只能取其一。...,无论读还是写的效率都远高于其他缓存,从 Spring5 开始的默认缓存实现就将 Caffeine 代替原来的Google Guava,支持多种回收策略,感兴趣的小伙伴赶快去试试吧~
导语: Guava 作为Google开源Java 库中的精品成员,在性能、功能上都十分出色,本文将从实际使用的角度,来对Guava进行讲解 在使用Cache之前,首先要考虑两个问题: 1、应该在什么情况下使用它...3、在高并发情况下、能够正常缓存的更新以及返回。 带着这几个问题,来开始介绍Guava Cache这一趁手兵器。...到这里,使用场景以及Guava Cache 的使用方法已经了解完了,还需要一个工具来验证缓存的效果。...因此记得在修改之前将缓存数据先深拷贝。 在上述Guava Cache的使用中,当缓存过期后,此时请求过来就会阻塞等待缓存的重新拉取。。。有没有可能避免掉这种阻塞?...futureValue : fullyFailedFuture(t); } } Guava Cache 这种异步刷新缓存的方式是作者个人比较倾向的使用姿势,但是这里也有一个问题,缓存不会主动刷新的
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是...(LocalCache.java:2285) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2200) at com.google.common.cache.LocalCache.get...(LocalCache.java:3947) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3951) at com.google.common.cache.LocalCache...(LocalCache.java:4880) 这就是LoadingCache的load方法,不能返回null。...; this.name = name; } public String getName(){ return this.name; } } 更多的guava
前言对一个java开发者而言,提到缓存,第一反应就是Redis。...本地缓存常用技术本地缓存和应用同属于一个进程,使用不当会影响服务稳定性,所以通常需要考虑更多的因素,例如容量限制、过期策略、淘汰策略、自动刷新等。...常用的本地缓存方案有:Guava CacheCaffeineEhCache基于Guava Cache实现本地缓存Guava是Google团队开源的一款 Java 核心增强库,包含集合、并发原语、缓存、IO...同时两者的API类似,使用Guava Cache的代码很容易可以切换到Caffeine,节省迁移成本。EhCacheEhCache是一个纯Java的进程内缓存框架,具有快速、精干的特点。...EhCache提供了多种缓存策略,主要分为内存和磁盘两级,是一款面向通用缓存、Java EE和轻量级容器的缓存框架。
提到本地缓存,大家都能想到Guava Cache,他的优点是封装了get,put操作;提供线程安全的缓存操作;提供过期策略;提供回收策略;缓存监控。当缓存的数据超过最大值时,使用LRU算法替换。...这一篇我们将要谈到一个新的本地缓存框架:Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache,借着他的思想优化了算法发展而来。...在现有算法的局限性下,会导致缓存数据的命中率或多或少的受损,而命中略又是缓存的重要指标。...W-TinyLFU主要用来解决一些稀疏的突发访问元素。在一些数目很少但突发访问量很大的场景下,TinyLFU将无法保存这类元素,因为它们无法在给定时间内积累到足够高的频率。...缓存的删除策略使用的是惰性删除和定时删除。这两个删除策略的时间复杂度都是O(1)。 「3. 基于引用的过期方式」 Java中四种引用类型 ?
利用Java中的现有方法实现对集合元素进行排序。...(1) Collections.sort(集合名); 如果参与排序的集合中存储的是自定义类型的对象,则对象对应类需要实现java.lang.Comparable接口,同时实现接口中 compareTo(...包中对集合元素进行操作的工具类。...(2) 功能方法: a. static void reverse(List list):将集合中元素进行倒置 b. static void shuffle(List list):对集合中元素进行随机显示...c. static void sort(List list):对集合元素进行排序。
点击关注公众号,Java干货及时送达 最近在使用系统的时候,发现尽管应用已经使用了 redis 缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研...,有早期的 Guava 缓存、在 Guava 上进一步传承的 Caffine 以及自称在 Java 中使用最广泛的 EhCache,那么我们该怎么选择适合自己应用的缓存呢,下面会简单介绍,并将以上缓存进行一个对比...expireAfterWrite(5L, TimeUnit.MINUTES) .build(); } (2) 基于过期时间 通过对比最近最后一次的访问时间,比如设置 5 分钟,每次访问之后都会刷新过期时间为...LRU 算法,在批量刷新缓存数据的场景下,可能会将其他缓存数据淘汰掉,从而带来缓存击穿的风险。LFU 算法,需要保存缓存记录的访问次数,带来内存空间的损耗。...LRU 算法,第一次被访问的元素会进入淘汰段,第二次被访问会进入保护段,保护段中被淘汰的元素会进入淘汰段,这种算法实现了高命中率和低内存占用。
摘要 Guava Cache是Google开源的Java工具集库Guava里的一款缓存工具,一直觉得使用起来比较简单,没想到这次居然还踩了一个坑。...但同时还有批量请求,为了提高效率,肯定要批量查询数据库, sthMapper.findByIds(Collectionids) 对于的guava cache 处理类 // 定义guava缓存...但是上线后,线上监控数据却发现这个接口耗时很长,通过分析,发现有很多sthMappper.findByIds()的单个id查询。也就是说,并没有调用 loadAll,走到批量查询数据库中。...refreshAfterWrite 刷新缓存数据时调用的还是load方法。...搜索了下,https://github.com/google/guava/issues/1975 github上这个issue还在。汗!!! 最后我这边解决是用 SpringCache统一了缓存管理。
前言 阿里巴巴出了一本Java规范,在国内Java开发眼里被赋予了神圣的殿堂,但是我司禁止使用阿里巴巴的开发手册。...目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家分享!学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码!...首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?...因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!...其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。
1、背景 本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。先简单介绍一下爱奇艺的java缓存道路的发展吧。 ?...第四阶段: Guava Cache刷新 为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。解决了一直不更新的问题,但是依然没有解决实时刷新。...第五阶段: 外部缓存异步刷新 ? 这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。...5.3、自动刷新 自动刷新操作,在guava cache中实现相对比较简单,直接通过查询,判断其是否满足刷新条件,进行刷新。...爱奇艺的缓存的发展也是基于此之上,通过对guava cache的二次开发,让其可以进行java应用服务之间的缓存更新。
本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。先简单介绍一下爱奇艺的java缓存道路的发展吧。 ?...第四阶段: Guava Cache刷新 为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。解决了一直不更新的问题,但是依然没有解决实时刷新。...第五阶段: 外部缓存异步刷新 ? 这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。...5.3、自动刷新 自动刷新操作,在guava cache中实现相对比较简单,直接通过查询,判断其是否满足刷新条件,进行刷新。...爱奇艺的缓存的发展也是基于此之上,通过对guava cache的二次开发,让其可以进行java应用服务之间的缓存更新。
1.背景 本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。先简单介绍一下爱奇艺的java缓存道路的发展吧。 ?...第四阶段: Guava Cache刷新 为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。解决了一直不更新的问题,但是依然没有解决实时刷新。...第五阶段: 外部缓存异步刷新 ? 这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。...5.3自动刷新 自动刷新操作,在guava cache中实现相对比较简单,直接通过查询,判断其是否满足刷新条件,进行刷新。...爱奇艺的缓存的发展也是基于此之上,通过对guava cache的二次开发,让其可以进行java应用服务之间的缓存更新。
database W-TinyLFU 算法是对 TinyLFU算法的优化,能够很好地解决一些稀疏的突发访问元素。...后,触发缓存异步刷新,此时会获取缓存中的旧值 适用场景: 缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 可以接受任何时间缓存中存在旧数据 ?...缓存值会变,需要刷新缓存 不可以接受缓存中存在旧数据 同步加载数据延迟小(使用 redis 等) ?...存在问题:需要手动定时任务异步刷新缓存 适用场景: 缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 不可以接受缓存中存在旧数据 同步加载数据延迟可能会很大 ?...适用场景: 缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 可以接受有限时间缓存中存在旧数据 同步加载数据延迟小(使用 redis 等) ?
最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。...当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新 key将自动被弱引用所封装 value将自动被弱引用或者软引用所封装 驱逐(或移除)缓存中的元素时将会进行通知 写入传播到一个外部数据源当中...持续计算缓存的访问统计指标 为了提高集成度,扩展模块提供了JSR-107 JCache和Guava适配器。...JSR-107规范了基于Java 6的API,在牺牲了功能和性能的代价下使代码更加规范。Guava的Cache是Caffeine的原型库并且Caffeine提供了适配器以供简单的迁移策略。...刷新策略:使用 refreshAfterWrite 设置缓存自动刷新,实现数据的实时性和一致性。 监听器支持:可以注册监听器,在缓存数据被创建、更新或删除时执行特定操作。
正如标题所言,学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码!...举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。...首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?...因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!...其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。
目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家分享!学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码!...举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。...CacheLoader 首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?...因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!...其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。
正如标题所言,学习使用Google Guava可以让你快乐编程,写出优雅的JAVA代码!...举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。...CacheLoader 首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?...因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!...其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。
在本地缓存方面,SpringFramework5.0(SpringBoot2.0)放弃了Google的GuavaCache,选择了「Caffeine」(Drop Guava caching - superseded...最根本的区别就是,ConcurrentMap保存所有添加的元素,除非显示删除之(比如调用remove方法)。而本地缓存一般会配置自动剔除策略,为了保护应用程序,限制内存占用情况,防止内存溢出。...这就意味着,如果不读取本地缓存中的数据的话,无论刷新时间间隔是多少,本地缓存中的数据永远是旧的数据!...根据RemovalCause.java枚举值可知,剔除策略有如下5种: 「EXPLICIT」:调用方法(例如:cache.invalidate(key)、cache.invalidateAll)显示剔除数据...嘿嘿,Caffeine已经想到了这一点,它提供了一个适配器,让你用Guava的接口操作它的缓存。
领取专属 10元无门槛券
手把手带您无忧上云