欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

跟我学Springboot开发后端管理系统6:缓存框架Caffeine

程序员文章站 2022-08-07 16:00:24
Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美。Caffeine受启发于Guava Cache的API,使用API和Guava是一致的。它借鉴了Guava Cache和ConcurrentLinkedHashMap的设计经验。性能比较基准测试使用Java microbenchmark工具提供准确的分析。 缓存配置为Caffeine和ConcurrentLinkedHashMap根据CPU数量确定其内部结构的大小Guava的并发级别配置为64(默认为4,以减少内存使用)。Ehc...

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

性能比较

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

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

100%的读操作

跟我学Springboot开发后端管理系统6:缓存框架Caffeine

读75% 写25%

跟我学Springboot开发后端管理系统6:缓存框架Caffeine

写100%

跟我学Springboot开发后端管理系统6:缓存框架Caffeine

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

在Matrix-Web中使用Caffeine

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

<dependency>
	<groupId>com.github.ben-manes.caffeine</groupId>
	<artifactId>caffeine</artifactId>
	<version>${caffeine.version}</version>
</dependency>

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

public abstract class AbstractCaffineCache<T> {

    protected LoadingCache<String, T> loadingCache;


    abstract LoadingCache<String, T>  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<SysUser> extends AbstractCaffineCache {

    @Override
    LoadingCache createLoadingCache() {

         loadingCache = Caffeine.newBuilder()
                .expireAfterWrite(10 , TimeUnit.MINUTES)
                .initialCapacity(10)
                .maximumSize(99999999)
                .recordStats()
                .build(new CacheLoader<String, SysUser>() {
                    @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<SysUser> 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;
    }
}

源码下载

https://github.com/forezp/matrix-web

本文地址:https://blog.csdn.net/forezp/article/details/106412266