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相关推荐

  1. 跟我学Springboot开发后端管理系统9:AOP+logback+MDC日志输出

    MDC介绍 在比较复杂的应用中,一个请求需要走很多个方法的处理,怎么样才能快速查找一个请求的全部日志呢.在分布式系统中,我们可以用链路追踪,比如zipkin.skywalking去快速查找日志,从而定 ...

  2. 跟我学Springboot开发后端管理系统8:Matrxi-Web权限设计实现

    上篇文章讲述了Matrix-web整体实现的权限控制的思路.现在来回顾一下: 首先,用户需要登录,填用户名.密码,后端接收到登录请求,进行用户.密码的校验,校验成功后则根据用户名生成Token,并返回 ...

  3. 跟我学Springboot开发后端管理系统7:Matrxi-Web权限设计

    Matrxi-Web权限设计 对于一个后端系统来说,权限是基础设施,是安全保障.没有权限,系统可能随时面临各种风险,所以权限设计对后端系统来说至关重要.在Javaweb开发中,有很多权限开发的框架,比 ...

  4. 跟我学Springboot开发后端管理系统5:数据库读写分离

    在Matrix-web后台管理系统中,使用到了数据库的读写分离技术.采用的开源的Sharding-JDBC作为数据库读写分离的框架.Matrix-Web后台数据库这一块采用的技术栈如下: 使用Myba ...

  5. 跟我学Springboot开发后端管理系统4:数据库连接池Druid和HikariCP

    上一篇文章主要讲解了如何再Matrix-Web中使用Mybatis-Plus,Mybatis-Plus作为Orm框架,连接数据库需要连接数据库的依赖.WEB 系统高并发环境下,频繁的进行数据库连接操作 ...

  6. 跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2

    在上一篇文章讲述了如何使用Mybatis-plus自动生成代码,生成的代码具有单表操作数据库的能力,节约了开发时间.然后讲述了如何在Spring Boot中整合Mybatis-Plus.这篇文章讲述如 ...

  7. 跟我学Springboot开发后端管理系统2:Mybatis-Plus实战

    在Matrix-Web项目中使用Mybatis-Plus作为操作数据库的ORM框架.在市面上常用的ORM框架有hibernetes.mybatis.JPA等,那么为什么选择Mybatis-Plus呢? ...

  8. mybatis plus springboot test_跟我学Springboot开发后端管理系统3:Mybatis-Plus实战2

    文章来源:https://mp.weixin.qq.com/s/YL0FDjn8BczNfIJJ9DgMRA 原文作者:forezp 来源平台:微信公众号 在上一篇文章讲述了如何使用Mybatis-p ...

  9. 跟我学Springboot开发后端管理系统8:AOP+logback+MDC日志输出

    MDC介绍 在比较复杂的应用中,一个请求需要走很多个方法的处理,怎么样才能快速查找一个请求的全部日志呢.在分布式系统中,我们可以用链路追踪,比如zipkin.skywalking去快速查找日志,从而定 ...

最新文章

  1. php 第三方DB库NOTORM
  2. linux bash 写入文件
  3. 泛型--协变与逆变(转)
  4. how is CRM One Order date range finally converted to OPEN SQL
  5. 梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频
  6. plc控制可调节阀流程图_PLC五大主流编程语言你会几种?
  7. JAVA实现度分秒单位换算
  8. Carsim安装中遇到的一些坑(invalid license key)
  9. 四川师范大学自然地理(1-地球)90分以上版本
  10. 成长经历:DIV标签设置背景色,没有显示背景色
  11. excel合并两列内容_合并多个Excel文件内容到一个Excel中
  12. javascript 正则表达式判断只能是中文、英文或者中文加英文
  13. 如何将AD类型的封装导成Allegro库中的封装
  14. JAVA——制作java程序说明书、解决DOS下中文编码问题 GBK
  15. VMware虚拟机 扩展Ubuntu系统磁盘空间方法
  16. html5 机械动画制作软件,KoolShow(HTML5动画制作助手)V2.4.3 正式版
  17. MapReduce 运行机制
  18. 全国AI特色中小学榜单发布:北京46家单位入围,上海3家
  19. [野狐行网游研究][一期][8.17更新]
  20. 第一届LeetCode刷题打卡赢现金活动开始啦,助力每一位想拿大厂offer的小伙伴!

热门文章

  1. Pycharm初始创建项目和环境搭建(解决aconda库文件引入不全等问题)
  2. java后端判断用户是否关注公众号
  3. Java基础概念性的知识总结
  4. html css 布局知识概况
  5. Hadoop学习笔记之三 数据流向
  6. java基础之——类的初始化顺序(转载)
  7. joomla网页无任何显示输出
  8. 有关于诚信:唐骏学历门
  9. Matlab数据的可视化 -- 柱形立体图
  10. Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end