跟我学Springboot开发后端管理系统6:缓存框架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的依赖,如下:
<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 {@OverrideLoadingCache createLoadingCache() {loadingCache = Caffeine.newBuilder().expireAfterWrite(10 , TimeUnit.MINUTES).initialCapacity(10).maximumSize(99999999).recordStats().build(new CacheLoader<String, SysUser>() {@Overridepublic SysUser load(String key) throws Exception {return null;}});return loadingCache;}
}
将UserRolePermissionCache注入到spring ioc中,代码如下:
@Configuration
public class CaffineCacheConfig {@Beanpublic UserRolePermissionCache userRolePermissionCache(){return new UserRolePermissionCache();}
}
如何使用,在UserPermissonService中,查询SysUser信息,如果缓存中有数据,则在缓存中取,如果没有,则在数据库中读,并做缓存。
@Component
public class UserPermissonService {@AutowiredSysUserMapper sysUserMapper;@AutowiredUserRolePermissionCache<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
往期文章:
跟我学Springboot开发后端管理系统1:概述
跟我学Springboot开发后端管理系统2:Mybatis-Plus实战
跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2
跟我学Springboot开发后端管理系统4:数据库连接池Druid和HikariCP
跟我学Springboot开发后端管理系统5:数据库读写分离
跟我学Springboot开发后端管理系统6:缓存框架Caffeine相关推荐
- 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出
MDC介绍 在比较复杂的应用中,一个请求需要走很多个方法的处理,怎么样才能快速查找一个请求的全部日志呢.在分布式系统中,我们可以用链路追踪,比如zipkin.skywalking去快速查找日志,从而定 ...
- 跟我学Springboot开发后端管理系统8:Matrxi-Web权限设计实现
上篇文章讲述了Matrix-web整体实现的权限控制的思路.现在来回顾一下: 首先,用户需要登录,填用户名.密码,后端接收到登录请求,进行用户.密码的校验,校验成功后则根据用户名生成Token,并返回 ...
- 跟我学Springboot开发后端管理系统7:Matrxi-Web权限设计
Matrxi-Web权限设计 对于一个后端系统来说,权限是基础设施,是安全保障.没有权限,系统可能随时面临各种风险,所以权限设计对后端系统来说至关重要.在Javaweb开发中,有很多权限开发的框架,比 ...
- 跟我学Springboot开发后端管理系统5:数据库读写分离
在Matrix-web后台管理系统中,使用到了数据库的读写分离技术.采用的开源的Sharding-JDBC作为数据库读写分离的框架.Matrix-Web后台数据库这一块采用的技术栈如下: 使用Myba ...
- 跟我学Springboot开发后端管理系统4:数据库连接池Druid和HikariCP
上一篇文章主要讲解了如何再Matrix-Web中使用Mybatis-Plus,Mybatis-Plus作为Orm框架,连接数据库需要连接数据库的依赖.WEB 系统高并发环境下,频繁的进行数据库连接操作 ...
- 跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2
在上一篇文章讲述了如何使用Mybatis-plus自动生成代码,生成的代码具有单表操作数据库的能力,节约了开发时间.然后讲述了如何在Spring Boot中整合Mybatis-Plus.这篇文章讲述如 ...
- 跟我学Springboot开发后端管理系统2:Mybatis-Plus实战
在Matrix-Web项目中使用Mybatis-Plus作为操作数据库的ORM框架.在市面上常用的ORM框架有hibernetes.mybatis.JPA等,那么为什么选择Mybatis-Plus呢? ...
- mybatis plus springboot test_跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2
文章来源:https://mp.weixin.qq.com/s/YL0FDjn8BczNfIJJ9DgMRA 原文作者:forezp 来源平台:微信公众号 在上一篇文章讲述了如何使用Mybatis-p ...
- 跟我学Springboot开发后端管理系统8:AOP+logback+MDC日志输出
MDC介绍 在比较复杂的应用中,一个请求需要走很多个方法的处理,怎么样才能快速查找一个请求的全部日志呢.在分布式系统中,我们可以用链路追踪,比如zipkin.skywalking去快速查找日志,从而定 ...
最新文章
- php 第三方DB库NOTORM
- linux bash 写入文件
- 泛型--协变与逆变(转)
- how is CRM One Order date range finally converted to OPEN SQL
- 梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频
- plc控制可调节阀流程图_PLC五大主流编程语言你会几种?
- JAVA实现度分秒单位换算
- Carsim安装中遇到的一些坑(invalid license key)
- 四川师范大学自然地理(1-地球)90分以上版本
- 成长经历:DIV标签设置背景色,没有显示背景色
- excel合并两列内容_合并多个Excel文件内容到一个Excel中
- javascript 正则表达式判断只能是中文、英文或者中文加英文
- 如何将AD类型的封装导成Allegro库中的封装
- JAVA——制作java程序说明书、解决DOS下中文编码问题 GBK
- VMware虚拟机 扩展Ubuntu系统磁盘空间方法
- html5 机械动画制作软件,KoolShow(HTML5动画制作助手)V2.4.3 正式版
- MapReduce 运行机制
- 全国AI特色中小学榜单发布:北京46家单位入围,上海3家
- [野狐行网游研究][一期][8.17更新]
- 第一届LeetCode刷题打卡赢现金活动开始啦,助力每一位想拿大厂offer的小伙伴!