千家信息网

基于Java8的缓存框架Caffeine是怎样的

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,基于Java8的缓存框架Caffeine是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Caffeine是一个基于
千家信息网最后更新 2024年11月24日基于Java8的缓存框架Caffeine是怎样的

基于Java8的缓存框架Caffeine是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美。Caffeine受启发于Guava Cache的API,使用API和Guava是一致的。它借鉴了Guava Cache和ConcurrentLinkedHashMap的设计经验。

性能比较

基准测试使用Java microbenchmark工具提供准确的分析。缓存配置为

  • Caffeine和ConcurrentLinkedHashMap根据CPU数量确定其内部结构的大小
  • Guava的并发级别配置为64(默认为4,以减少内存使用)。
  • Ehcache v2在内部被硬编码为100个段,而v3未分段

100%的读操作

读75% 写25%

写100%

上面三种测试图来自于Caffeine官网,从图可知,Caffeine的性能玩爆其他缓存框架。

在Matrix-Web中使用Caffeine

在工程的pom文件引入caffeine的依赖,如下:


com.github.ben-manes.caffeine
caffeine
${caffeine.version}

创建一个抽象类AbstractCaffineCache,该类使用范型来约束缓存的数据类型,并实现了三个方法,put、get、clear。

public abstract class AbstractCaffineCache {

protected LoadingCache loadingCache;


abstract LoadingCache createLoadingCache();

public boolean put(String key, T value) {
if(loadingCache==null){
loadingCache=createLoadingCache();
}
loadingCache.put(key, value);

return Boolean.TRUE;
}

public T get(String key) {
if(loadingCache==null){
loadingCache=createLoadingCache();
}
try {

return loadingCache.get(key);
} catch (Exception e) {
return null;
}
}

public boolean clear(String key) {
if(loadingCache==null){
loadingCache=createLoadingCache();
}
loadingCache.invalidate(key);
return Boolean.TRUE;
}

}

创建UserRolePermissionCache的缓存类,该类缓存类用户的信息、用户的角色信息、用户的权限信息。创建LoadingCache类,该类设置了缓存过期的时间,最大的缓存个数。

public class UserRolePermissionCache extends AbstractCaffineCache {

@Override
LoadingCache createLoadingCache() {

loadingCache = Caffeine.newBuilder()
.expireAfterWrite(10 , TimeUnit.MINUTES)
.initialCapacity(10)
.maximumSize(99999999)
.recordStats()
.build(new CacheLoader() {
@Override
public SysUser load(String key) throws Exception {
return null;
}
});
return loadingCache;
}
}

将UserRolePermissionCache注入到spring ioc中,代码如下:


@Configuration
public class CaffineCacheConfig {
@Bean
public UserRolePermissionCache userRolePermissionCache(){
return new UserRolePermissionCache();
}
}

如何使用,在UserPermissonService中,查询SysUser信息,如果缓存中有数据,则在缓存中取,如果没有,则在数据库中读,并做缓存。


@Component
public class UserPermissonService {

@Autowired
SysUserMapper sysUserMapper;

@Autowired
UserRolePermissionCache userRolePermissionCache;

public SysUser getUserRolePerssion(String userId) {
SysUser sysUser = (SysUser) userRolePermissionCache.get(userId);
if (sysUser == null) {
sysUser = sysUserMapper.selectUserRolePermission(userId);
userRolePermissionCache.put(userId, sysUser);
}
return sysUser;
}
}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0