【Java】- 缓存之JetCache基础篇
Java缓存之JetCache
- 写在前面
- 为什么使用缓存
- 使用场景
- 简介
- 特性
- 缓存类型-两级缓存
- 本地缓存
- 远程(访问Redis的客户端)
- 区别
- Spring Cache:
- JetCache
- 常用注解
- @Cached
- @CacheInvalidate
- @CacheUpdate
- @CreateCache
- @CacheRefresh
写在前面
为什么使用缓存
在高并发、大流量等场景下,降低系统延迟,缓解数据库压力,提高系统整体的性能,也能够让用户有更好的体验;
使用场景
读多写少、不追求强一致性
简介
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作;
当前有四个实现:RedisCache、RedisLettuceCache、CaffeineCache、LinkedHashMapCache;
特性
- 通过统一的API访问Cache系统
- 通过注解实现声明式的方法缓存,支持TTL(超时时间,Spring Cache Redis 默认只支持配置全局的)和两级缓存
- 通过注解创建并配置Cache实例
- 针对所有Cache实例和方法缓存的自动统计
- Key的生成策略和Value的序列化策略支持自定义配置
- 分布式缓存自动刷新,分布式锁
- 异步Cache API (使用Redis的Lettuce客户端时)
缓存类型-两级缓存
本地缓存
- LinkedHashMap:使用LinkedHashMap做LUR方式淘汰
- Caffeine:基于Java8开发的提供了近乎最佳命中率的高性能的缓存库
- PS:选择了本地缓存请设置limit,全局默认设置了100,本地缓存的数据存放于内存,减轻内存的损耗,如果使用了Caffeine,缓存的key过多可能导致内存溢出
远程(访问Redis的客户端)
- Redis:使用Jedis客户端,Redis官方首选的Java客户端
- RedisLettuce:使用Lettuce客户端,一个高性能基于Java的Redis驱动框架,支持线程安全的同步、异步操作,底层集成了Project Reactor,提供反应式编程;
- PS:选择了远程缓存请设置keyPrefix,保证存放至Redis的缓存key规范化,避免与其他系统出现冲突
区别
Spring Cache:
优点
- 支持开箱即用(Out Of The Box),并提供基本的Cache抽象,方便切换各种底层Cache
- 通过Cache注解即可实现缓存逻辑透明化,让开发者关注业务逻辑
- 当事务回滚时,缓存也会自动回滚
- 支持比较复杂的缓存逻辑
- 提供缓存编程的一致性抽象,方便代码维护
缺点
- Spring Cache并不针对多进程的应用环境进行专门的处理;
- Spring Cache抽象的操作中没有锁的概念,当多线程并发操作(更新或者删除)同一个缓存项时,有可能读取到过期的数据
- 无法满足本地缓存和远程缓存同时使用,使用远程缓存时无法自动刷新
JetCache
- 优点
- 远程缓存和内存型缓存可以共存,当共存时,优先访问内存,保护远程缓存;也可以只用某一种;
- 自动刷新策略,防止某个缓存失效,访问量突然增大时,所有机器都去访问数据库,可能导致数据库挂掉
- 利用不严格的分布式锁,对同一key,全局只有一台机器自动刷新
- 缺点:
- JetCache通过Spring AOP生成代理,来支持缓存功能
常用注解
@Cached
- @Cached:是在接口方法或者类方法上添加缓存,一般以参数为key,以返回值为value存入缓存中
可配置cacheType参数:REMOTE, LOCAL, BOTH
LOCAL时可配置localLimit参数来设置本地local缓存的数量限制,condition参数可配置在什么情况下使用缓存,condition和key支持SPEL语法; - @CreateCache是直接创建一个缓存实例,然后调用put(T key, T value)、get(T key)等方法实现缓存
- Cache实例的默认超时时间,通过在@CreateCache和@Cached上的expire属性指定,如果没有指定,则使用yml中定义的全局配置
@CacheInvalidate
@CacheInvalidate:缓存失效,同样可配置condition满足的情况下失效缓存,但不能支持是在方法调用前还是调用后将缓存失效;
@CacheUpdate
@CacheUpdate:缓存更新,value为缓存更新后的值,此操作是调用原方法结束后将更新缓存
@CreateCache
@CreateCache:用于字段上的注解,创建缓存,根据参数,创建一个name的缓存,可以全局显式使用这个缓存参数对象
@CacheRefresh
@CacheRefresh:自动刷新策略,可设置refresh、stopRefreshAfterLastAccess、refreshLockTimeout参数;
更多详细配置说明介绍,可仔细查看文档:https://github.com/alibaba/jetcache/wiki/MethodCache_CN
【Java】- 缓存之JetCache基础篇相关推荐
- Java程序设计语言(基础篇)机械工业出版社 原属第10版
链接:https://pan.baidu.com/s/1txoB3sk0SdT1u8RpS2x-Kg 提取码:rxkd Java程序设计语言(基础篇)机械工业出版社 原属第10版 外加一本Java ...
- [转载] JAVA语言程序设计(基础篇)第十版课后题答案(第一章)
参考链接: Java中的Scanner和nextChar() JAVA语言程序设计(基础篇)第十版课后题答案 第一章 第二题 /** Created by ysy on 2018/7/6. */ pu ...
- java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...
<Java语言程序设计:基础篇>课后复习题答案-第十五章 Chapter15Graphics 1. Theycoordinateshouldincreaseandthexcoordinat ...
- Java学习---Day16_IO流基础篇
Java学习-Day16_IO流基础篇 文件操作 操作磁盘上的某一个文件或某一个文件夹,可以对他们进行创建或删除.移动.属性获取.属性设置等操作.但是,不包含读取文件的内容.拷贝文件 ps:java中 ...
- Java学习笔记之基础篇
Java学习笔记之基础篇 目录 Java如何体现平台的无关性? 面向对象(OO)的理解 面向对象和面向过程编程的区别 面向对象三大特征 静态绑定和动态绑定(后期绑定) 延伸:类之间的关系 组合(聚合) ...
- invader的java学习第一天基础篇
invader的java学习第一天基础篇 一.java主要历史 ①java是Sun公司的产品,09年被Oracle公司收购. ②java语言之父:詹姆士高斯林 二.jdk.jre.jvm三者关系 jd ...
- invader的java学习第二天基础篇
invader的java学习第二天基础篇 一.深入了解第一个Hello World程序 public class Hello World{ public static void main(String ...
- JAVA学习之路--基础篇三
目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...
- java综合知识点总结基础篇
一.JDK常用的包 java.lang: 这个是系统的基础类,比如String.Math.Integer.System和Thread,提供常用功能. java.io: 这里面是所有输入输出有关的类,比 ...
最新文章
- C++中拷贝控制操作(三/五法则)
- idea 更改自动补全返回值_整理了一些 IDEA 中比较骚的技巧
- 〖Linux〗Bash快捷键使用
- UI设计入门书籍(未整理)
- SQL基础【二、SQL语法】
- 计篇-之一文言文翻译
- angularjs控制器之间的数据共享与通信
- C++ —— C++程序编译的四个过程
- tree命令的使用(过滤文件夹)
- WCF在安全性方面的支持(1):一些概念
- Git笔记(18) 搭建服务器Git
- 计算机主机内有哪些部件常用的,智慧职教: 计算机系统由什么组成?计算机主机内有哪些部件?常用的计算机外设有哪些...
- 美团关联公司公开“无人车及无人配送系统”相关专利
- JavaScript:instanceof 实现原理
- guava-Retryer失败重试
- 主从同步redis和mysql的区别_mysql主从复制、redis基础、持久化和主从复制
- C#控制BarTender自动打印(方法一)
- php网站后台修改主页,织梦网站后台主页页面修改
- Nginx源码阅读:ngx_palloc 内存池
- 后端每天更新微信用户用户头像