我是靠谱客的博主 坦率羊,最近开发中收集的这篇文章主要介绍Caffeine缓存,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

Caffeine相关参数

缓存大小

过期策略

填充策略

Caffeine框架中Cache的使用

同步需要手动维护——Cache

同步可设置缓存自动触发加载——LoadingCache

异步需手动维护——AsyncCache

异步可设置缓存自动触发加载——AsyncLoadingCache


在本地(进程)缓存方面,常见的缓存框架有ehcache、GuavaCache、Caffeine等方案。Caffeine是其中性能最好的一个。

Caffeine相关参数

缓存大小

使用maximumSize方法设置缓存的最大长度

过期策略

在Caffeine中有界缓存中三个设置过期方法:expireAfterAccess、expireAfterWrite、expireAfter。

  • expireAfterWrite:代表着写了之后多久过期。(上面列子就是这种方式)
  • expireAfterAccess: 代表着最后一次访问了之后多久过期。
  • expireAfter:在expireAfter中需要自己实现Expiry接口,这个接口支持create,update,以及access了之后多久过期。注意这个API和前面两个API是互斥的。这里和前面两个API不同的是,需要你告诉缓存框架,他应该在具体的某个时间过期,也就是通过前面的重写create,update,以及access的方法,获取具体的过期时间。

填充策略

Caffeine 中有三种填充策略:手动、同步和异步。

Caffeine框架中Cache的使用

基于三种不同填充策略对应提供了多种不同类型Cache提供给我们使用,下面具体看一下。

同步需要手动维护——Cache

同步是指对缓存实例中元素的get,put等操作是同步执行的;手动维护是需要我们手动显示调用API实现对实例中元素的缓存维护。

//初始化Cache对象实例
Cache<Object, Object> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)//设置过期时间为10分钟
    .maximumSize(1000)//最大长度为1000
    .build();
    
//添加(不存在)或者更新(key存在)缓存元素
cache.put(key, obj);

// 移除一个缓存元素
cache.invalidate(key);

//从cache实例中获取key对应的缓存value 如果不存在key返回null
Object obj = cache.getIfPresent(key);

//从cache实例中获取key对应的缓存value 如果不存在key就通过createObject方法生成缓存返回value,如果createObject方法执行失败返回null
Object obj = cache.get(key, k -> createObject(key));

同步可设置缓存自动触发加载——LoadingCache

LoadingCache与Cache不同的是可以在build方法中预设置一个构建缓存方法,当get方法获取的key不存在时会触发预设置的方法进行缓存的自动构建。

LoadingCache<Key, Object> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(key -> createObject(key));
	
	
//查找缓存,如果缓存不存在则通过createObject生成缓存元素,  如果无法生成则返回null
Object obj = cache.get(key);

//批量查找keys集合中指定的key缓存,如果缓存不存在则生成缓存元素
Map<Object, Object> map = cache.getAll(keys);

异步需手动维护——AsyncCache

异步是指对缓存实例中元素的get,put等操作是异步的方式执行的。对缓存的put操作需要手动显示调用API去维护。

AsyncCache<Key, Object> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .maximumSize(1000)
    .buildAsync();
	
//异步添加一个元素(一般直接使用get方法代替,因为是异步操作)
cache.put(key,createObjectAsync(key));	

//从cache实例中获取key对应的缓存value 如果不存在key返回null
Object obj = cache.getIfPresent(key);

//查找缓存元素,如果不存在,则异步生成
CompletableFuture<Object> obj = cache.get(key, k -> createObjectAsync(key));

异步可设置缓存自动触发加载——AsyncLoadingCache

AsyncLoadingCache与AsyncCache都是异步,但是AsyncLoadingCache可以预设置缓存构建的方法,在get获取不到时自动触发构建方法构建缓存,无须手动显示调用put方法。

AsyncLoadingCache<Key, Object> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    // 可以设置为同步操作来生成缓存元素
    .buildAsync(key -> createObject(key));
    // 也可以设置构建一个异步缓存元素操作并返回一个future
    .buildAsync((key, executor) -> createObjectAsync(key, executor));

// 查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Object> obj = cache.get(key);
// 批量查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Map<Object, Object>> graphs = cache.getAll(keys);

最后

以上就是坦率羊为你收集整理的Caffeine缓存的全部内容,希望文章能够帮你解决Caffeine缓存所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部