这篇文章主要介绍下用guava做cache时候数据的移除方式,在guava中数据的移除分为被动移除和主动移除两种
被动移除数据的方式,guava默认提供了三种方式:
基于大小的移除
看字面意思就知道就是按照缓存的大小来移除,如果即将到达指定的大小,那就会把不常用的键值对从cache中移除。
定义的方式一般为 CacheBuilder.maximumSize(long),官方还介绍了一种可以算权重的方法,个人认为实际使用中不太用到,暂不讨论。
就这个常用的来看有几个注意点,
其一,这个size指的是cache中的条目数,不是内存大小或是其他;
其二,并不是完全到了指定的size系统才开始移除不常用的数据的,而是接近这个size的时候系统就会开始做移除的动作;
其三,如果一个键值对已经从缓存中被移除了,你再次请求访问的时候,如果cachebuild是使用cacheloader方式的,那依然还是会从cacheloader中再取一次值,如果这样还没有,就会抛出异常
基于时间的移除
guava提供了两个基于时间移除的方法
expireAfterAccess(long, TimeUnit) 这个方法是根据某个键值对最后一次访问之后多少时间后移除
expireAfterWrite(long, TimeUnit) 这个方法是根据某个键值对被创建或值被替换后多少时间移除
基于引用的移除
这种移除方式主要是基于java的垃圾回收机制,根据键或者值的引用关系决定移除,个人对垃圾回收这块不是非常了解,窃以为不太可靠。。也不常用。。所以没有研究,欢迎补充。
主动移除数据方式
主动移除有三种方法:
单独移除用 Cache.invalidate(key)
批量移除用 Cache.invalidateAll(keys)
移除所有用 Cache.invalidateAll()
如果需要在移除数据的时候有所动作还可以定义Removal Listener,但是有点需要注意的是默认Removal Listener中的行为是和移除动作同步执行的,如果需要改成异步形式,可以考虑使用RemovalListeners.asynchronous(RemovalListener, Executor)
分享到:
相关推荐
Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案,用于存储经常访问的数据,以减少对远程服务或计算的调用,从而提高应用性能。本案例代码将详细介绍Guava Cache的使用,包括缓存的...
Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案。在许多应用程序中,我们经常需要缓存数据以减少不必要的数据库查询或远程服务调用,提高系统性能。尽管分布式缓存如Redis在高并发和...
4. **监听器**:Guava Cache提供了丰富的事件监听机制,如插入、更新、移除等操作的监听。Go实现可能会有对应的事件接口,允许用户注册回调函数,以应对缓存的变化。 5. **并发控制**:Guava Cache保证了线程安全,...
Guava Cache提供了get()方法来获取缓存中的数据,如果缓存中没有,则调用load()方法加载数据并放入缓存。 ```java try { return graphs.get(key); } catch (ExecutionException e) { throw new OtherException(e....
Guava Cache的设计目标是为了帮助应用程序在内存中存储经常访问的数据,以减少对远程服务或者数据库的调用,从而提高性能和响应速度。 **一、Guava Cache的基本概念** 1. **LoadingCache**: Guava Cache的核心接口...
创建一个Guava Cache对象,你可以通过`LoadingCache`接口,它在缓存项缺失时会自动加载。例如: ```java LoadingCache, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) // 设置最大缓存容量 ....
Guava Cache 提供了一种键值对存储,其中的值可以自动过期或基于一定的填充策略被移除。它支持同步和异步加载值,提供了统计信息以及弱引用和软引用的键值对存储选项,从而在内存管理上提供了灵活性。 在 `Guava-...
Guava Cache是单个应用运行时的本地缓存,用于将数据缓存到JVM内存中,提高应用程序的性能和效率。本文将详细介绍Guava LoadingCache的使用解析,包括其优点、缺点、使用场景、配置参数等方面。 Guava LoadingCache...
Guava cache 模块提供了许多有用的特性,如自动加载、缓存池大小限制、缓存项过期时间设置、缓存项移除监听器等。 二、LoadingCache 简介 LoadingCache 是 Guava 库提供的一种缓存实现方式,继承自 Cache 接口。...
- **Cache模块**:Guava的Cache模块在17.0中可能有性能提升和更灵活的配置选项。 - **Multiset和Table的改进**:这两个数据结构在新版本中可能提供更丰富的操作和优化。 - **检查异常(CheckedException)**:对于...
Guava Cache为开发者提供了丰富的配置选项,包括自动移除策略、缓存大小限制等,可以帮助开发者优化内存使用和提高应用程序性能。 在并发编程方面,Guava提供了丰富的并发工具,如ListenableFuture、LoadingCache、...
开源项目-goburrow-cache.zip 是一个基于Go语言实现的本地缓存库,它受到了Google的Guava Cache的启发,旨在为Go开发者提供类似于Guava Cache的功能。Guava Cache是Java开发中的一个流行缓存解决方案,而goburrow-...
2. **缓存机制**:Guava的Cache模块允许开发者创建本地缓存,以提高应用程序的性能。它可以自动管理缓存大小,支持基于时间和引用的过期策略,甚至可以监听缓存项的添加和移除事件。 3. **并发工具**:Guava提供了...
- Guava的Immutable集合类是不可变的,适合用于创建线程安全的常量数据结构,这个版本可能对它们的创建效率进行了提升。 2. **并发库**: - Guava的并发库提供了一些高级并发工具,如ListenableFuture、Futures、...
2. **缓存机制**:Guava的Cache模块允许开发者创建高效的本地缓存,它可以自动管理缓存的大小,根据预设策略进行过期和移除,从而提高性能。 3. **并发工具**:Guava提供了线程安全的数据结构和并发工具,如Striped...
3. **缓存机制**:Guava提供了一种强大的本地缓存机制,可以根据需要自动加载或移除数据,提高了程序性能。 4. **字符串处理**:Guava的Strings类提供了各种实用的静态方法,如split、join、strip等,方便字符串...
在实际项目中,还可以考虑使用第三方库如Google的Guava库,它提供了高效且功能丰富的Cache实现,支持LRU和其他高级特性。然而,了解基本实现原理对于优化和定制自己的缓存解决方案至关重要。 总结,通过Java实现...
3. **数据过期**:缓存中的数据可能会过期,因此需要一个机制来检查并移除过期的数据。这可以通过设置每个条目的时间戳或访问计数器来实现。 4. **线程安全**:在多线程环境中,我们需要确保缓存操作是线程安全的,...
2. **Guava Cache**: Google Guava库的一部分,提供了一个简单易用且功能强大的本地缓存实现。 3. **Hazelcast**: 一个分布式内存数据网格,不仅提供缓存功能,还能实现分布式计算和存储。 4. **Infinispan**: 一个...
例如,我们可以创建一个Guava Cache实例,然后使用`LoadingCache`接口,当尝试获取一个不存在于缓存中的键时,它会自动调用预定义的加载函数从数据源中填充数据。 ```java LoadingCache, Graph> graphs = ...