Package com.google.common.cache

Google Guava库的`com.google.common.cache`包提供了强大的缓存功能,包括LRU驱逐策略、时间过期、弱引用等。CacheBuilder是构建缓存的主要工具,支持多种定制选项,如缓存大小、过期时间和缓存监听器。此外,还可以通过CacheLoader进行缓存加载,并使用RemovalListener监听缓存项的移除。缓存的线程安全、数据同步、异常处理和清理也是其重要特性。在使用时,需要根据应用需求选择合适的缓存策略,注意缓存大小管理、数据同步和持久化等问题。监控和异常处理同样关键,确保缓存的高效稳定运行。

com.google.common.cache 是 Google Guava 库中的一个包,提供了强大的缓存功能。这个包中的类可以帮助你创建和管理缓存,以优化性能和资源使用。
例如,CacheBuilder 类是用来构建缓存实例的建造者(Builder),它支持各种特性,如最近最少使用(LRU)的驱逐策略、当达到最大大小时自动驱逐、基于时间的条目过期、自动包装键为弱引用、自动包装值为弱引用或软引用等。
其中 CacheBuilder 类提供的方法包括:

  • getIfPresent(Object key): 如果缓存中存在该键,则返回其值;否则返回 null
  • get(K key, Callable<? extends V> valueLoader): 如果缓存中已经存在该键,则通过 valueLoader 返回该缓存的值;否则在加载完成之前,该缓存的可观察状态不会被修改。
  • putAll(Map<? extends K, ? extends V> map): 将所有指定的映射关系放入缓存中。
  • invalidate(Object key): 从缓存中移除指定的键及其关联的值。
  • invalidateAll(Iterable<? extends K> keys): 从缓存中移除指定的键及其关联的值。
  • invalidateAll(): 从缓存中移除所有键及其关联的值。
  • stats(): 返回当前缓存的统计信息。
    要使用这些功能,你需要引入 Google Guava 库,并按照其提供的 API 进行编程。除了基本的缓存功能,com.google.common.cache 还提供了一些高级特性,例如缓存装饰器(Cache Decorators)、缓存监听器(CacheListeners)和缓存异常处理等。
  • 缓存装饰器:如 CacheBuilder.newBuilder().maximumSize(100).removalListener(myRemovalListener).build(new CacheLoader<K,V>() { ... });。它提供了一种方式来改变缓存行为,比如限制缓存的大小,添加驱逐监听器等。
  • 缓存监听器:如 CacheBuilder.newBuilder().removalListener(myRemovalListener).build();。它允许你添加一个监听器,当缓存中的元素被移除时,监听器会被触发。
  • 缓存异常处理:在 CacheLoader 中,你可以抛出任何运行时异常。如果 get(K key, Callable<? extends V> valueLoader) 方法抛出异常,那么该键将不会被放入缓存中,且已存在的值(如果有的话)将被清除。
    总的来说,Google Guava的com.google.common.cache包是一个非常强大的工具,能帮助你优化应用性能,管理和处理缓存,无论是小型项目还是大型分布式系统。然而,使用它需要一定的学习和理解,才能充分利用其提供的各种特性和功能。在使用 com.google.common.cache 时,还有一些重要的注意事项:
  1. 线程安全:Guava 缓存是线程安全的,可以在多线程环境下使用。
  2. 缓存失效:你可以通过 CacheBuilder.expireAfterWrite(long, TimeUnit)CacheBuilder.expireAfterAccess(long, TimeUnit) 方法设置缓存项在一定时间后自动失效。
  3. 缓存驱逐:Guava 提供了几种驱逐策略,例如基于大小的驱逐、基于时间的驱逐、基于引用能力的驱逐等。你可以通过 maximumSize(long), expireAfterWrite(long, TimeUnit), weakKeys(), weakValues(), softValues() 等方法来设置驱逐策略。
  4. 缓存加载:你可以使用 CacheBuilder.loader(CacheLoader) 方法来设置如何加载缓存项。如果缓存项不存在,则通过 CacheLoader 加载。
  5. 缓存监听器:你可以添加一个 RemovalListener 来监听缓存项的移除。这对于监控或日志记录非常有用。
  6. 序列化:默认情况下,Guava 缓存的键和值都是序列化的。如果键或值不能被序列化,那么你需要设置非序列化缓存。
  7. 缓存装饰器:如之前所述,你可以使用装饰器来改变缓存行为。例如,你可以使用 CacheBuilder.newBuilder().maximumSize(100).removalListener(myRemovalListener).build(new CacheLoader<K,V>() { ... }); 来创建一个最大大小为100的缓存,并在缓存项被移除时触发监听器。
  8. 清理缓存:如果你需要手动清理缓存,可以使用 invalidate(Object key)invalidateAll() 方法。
  9. 缓存异常处理:在 CacheLoader 中,你可以抛出任何运行时异常。如果 get(K key, Callable<? extends V> valueLoader) 方法抛出异常,那么该键将不会被放入缓存中,且已存在的值(如果有的话)将被清除。
  10. 使用例子:例如,LoadingCache<KeyType,ValueType> cache = CacheBuilder.newBuilder() .maximumSize(100) .build( new CacheLoader<KeyType, ValueType>() { public ValueType load(KeyType key) throws AnyException { return createExpensiveValue(key); } } );
    以上就是使用 Google Guava 的 com.google.common.cache 包时需要注意的一些要点和示例。希望对你有所帮助!除了上述提到的要点,还有一些额外的使用 com.google.common.cache 的建议:
  11. 缓存策略的选择:根据应用的需求选择合适的缓存策略。例如,如果你需要缓存大量数据,并且数据更新不频繁,那么可以选择基于大小的驱逐策略。
  12. 缓存大小的管理:合理设置缓存的大小,避免因缓存过大而消耗过多内存或因缓存过小而频繁地加载数据。
  13. 缓存数据的同步:如果多个线程同时修改缓存数据,需要考虑数据的同步问题,以避免数据不一致。
  14. 缓存数据的持久化:如果需要保证数据在程序重启后仍然可用,可以考虑将缓存数据持久化到磁盘或数据库。
  15. 缓存数据的清理:定期清理过期或无效的缓存数据,以释放缓存空间。可以使用 Guava 提供的 CacheBuilder.cleanUp() 方法来定期清理缓存数据。
  16. 监控和日志记录:添加适当的监控和日志记录,以便及时发现缓存相关的问题并进行调试。
  17. 异常处理:合理处理缓存加载和访问过程中可能出现的异常,以避免程序崩溃或数据丢失。
  18. 测试:对缓存进行充分的测试,包括单元测试、集成测试和性能测试,以确保其正常工作和满足性能要求。
  19. 文档和注释:为缓存代码添加必要的文档和注释,以便于他人理解和维护。
    总之,使用 com.google.common.cache 时需要综合考虑应用的需求、性能要求和资源限制等因素,并注意以上提到的要点和建议。
    This package contains caching utilities.

See:
Description

Interface Summary
AbstractCache.StatsCounter Accumulates statistics during the operation of a Cache for presentation by Cache.stats().
Cache<K,V> A semi-persistent mapping from keys to values.
RemovalListener<K,V> An object that can receive a notification when an entry is removed from a cache.

Class Summary
AbstractCache<K,V> This class provides a skeletal implementation of the Cache interface to minimize the effort required to implement this interface.
AbstractCache.SimpleStatsCounter A thread-safe AbstractCache.StatsCounter implementation for use by Cache implementors.
CacheBuilder<K,V> A builder of Cache instances having any combination of the following features: least-recently-used eviction when a maximum size is exceeded time-based expiration of entries, measured since last access or last write keys automatically wrapped in weak references values automatically wrapped in weak or soft references notification of evicted (or otherwise removed) entries
CacheLoader<K,V> Computes or retrieves values, based on a key, for use in populating a Cache.
CacheStats Statistics about the performance of a Cache.
ForwardingCache<K,V> A cache which forwards all its method calls to another cache.
ForwardingCache.SimpleForwardingCache<K,V> A simplified version of ForwardingCache where subclasses can pass in an already constructed Cache as the delegete.
RemovalListeners A collection of common removal listeners.
RemovalNotification<K,V> A notification of the removal of a single entry.
在这里插入图片描述

D:\JavaDevelTools\JDK17\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:8117,suspend=y,server=n -javaagent:D:\JavaDevelTools\Idear\plugins\java\lib\rt\debugger-agent.jar=file:///C:/Users/Ulike/AppData/Local/Temp/capture9642652005394840532.props -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 @C:\Users\Ulike\AppData\Local\Temp\idea_arg_file1935322404 com.ulike.hrm.PlatformApplication Connected to the target VM, address: '127.0.0.1:8117', transport: 'socket' Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:450) at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:432) at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:425) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:267) at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:246) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) at com.ulike.hrm.PlatformApplication.main(PlatformApplication.java:41) Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer]: Constructor threw exception; nested exception is com.ctrip.framework.apollo.exceptions.ApolloConfigException: Unable to load instance for com.ctrip.framework.apollo.spring.config.ConfigPropertySourceFactory! at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:226) at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:446) ... 7 more Caused by: com.ctrip.framework.apollo.exceptions.ApolloConfigException: Unable to load instance for com.ctrip.framework.apollo.spring.config.ConfigPropertySourceFactory! at com.ctrip.framework.apollo.spring.util.SpringInjector.getInstance(SpringInjector.java:40) at com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer.<init>(ApolloApplicationContextInitializer.java:67) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:213) ... 8 more Caused by: com.ctrip.framework.apollo.exceptions.ApolloConfigException: Unable to initialize Apollo Spring Injector! at com.ctrip.framework.apollo.spring.util.SpringInjector.getInjector(SpringInjector.java:24) at com.ctrip.framework.apollo.spring.util.SpringInjector.getInstance(SpringInjector.java:37) ... 15 more Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.ExceptionInInitializerError at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2049) at com.google.common.cache.LocalCache.get(LocalCache.java:3951) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974) at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958) at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964) at com.google.inject.internal.FailableCache.get(FailableCache.java:48) at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:50) at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:138) at com.google.inject.internal.InjectorImpl.initializeBinding(InjectorImpl.java:536) at com.google.inject.internal.AbstractBindingProcessor$Processor$1.run(AbstractBindingProcessor.java:160) at com.google.inject.internal.ProcessedBindingData.initializeBindings(ProcessedBindingData.java:44) at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:123) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107) at com.google.inject.Guice.createInjector(Guice.java:99) at com.google.inject.Guice.createInjector(Guice.java:73) at com.google.inject.Guice.createInjector(Guice.java:62) at com.ctrip.framework.apollo.spring.util.SpringInjector.getInjector(SpringInjector.java:22) ... 16 more Caused by: java.lang.ExceptionInInitializerError at com.google.inject.internal.cglib.reflect.$FastClass$Generator.getProtectionDomain(FastClass.java:73) at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:206) at com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:65) at com.google.inject.internal.BytecodeGen.newFastClassForMember(BytecodeGen.java:252) at com.google.inject.internal.BytecodeGen.newFastClassForMember(BytecodeGen.java:203) at com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:53) at com.google.inject.internal.ProxyFactory.create(ProxyFactory.java:158) at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:90) at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:29) at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:37) at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:33) at com.google.inject.internal.FailableCache$1.load(FailableCache.java:37) at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529) at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278) at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045) ... 32 more Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @776ec8df at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at com.google.inject.internal.cglib.core.$ReflectUtils$1.run(ReflectUtils.java:52) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at com.google.inject.internal.cglib.core.$ReflectUtils.<clinit>(ReflectUtils.java:42) ... 48 more Disconnected from the target VM, address: '127.0.0.1:8117', transport: 'socket' Process finished with exit code 1
最新发布
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值