文档章节

J2Cache 两级缓存中的 Region 到底是什么东西?

红薯
 红薯
发布于 04/03 10:55
字数 819
阅读 2429
收藏 20

不时有人来询问 J2Cache 里的 Region 到底是什么概念,这里做统一的解答。

J2Cache 的 Region 来源于 Ehcache 的 Region 概念。

一般我们在使用像 Redis、Caffeine、Guava Cache 时都没有 Region 这样的概念,特别是 Redis 是一个大哈希表,更没有这个概念。

在实际的缓存场景中,不同的数据会有不同的 TTL 策略,例如有些缓存数据可以永不失效,而有些缓存我们希望是 30 分钟的有效期,有些是 60 分钟等不同的失效时间策略。在 Redis 我们可以针对不同的 key 设置不同的 TTL 时间。但是一般的 Java 内存缓存框架(如 Ehcache、Caffeine、Guava Cache 等),它没法为每一个 key 设置不同 TTL,因为这样管理起来会非常复杂,而且会检查缓存数据是否失效时性能极差。所以一般内存缓存框架会把一组相同 TTL 策略的缓存数据放在一起进行管理。

J2Cache 的 Region 概念对应关系如下所示:

Ehcache region
Caffeine Cache
Guava Cache Cache

像 Caffeine 和 Guava Cache 在存放缓存数据时需要先构建一个 Cache 实例,设定好缓存的时间策略,如下代码所示:

Caffeine<Object, Object> caffeine = Caffeine.newBuilder();
caffeine = caffeine.maximumSize(size).expireAfterWrite(expire, TimeUnit.SECONDS);
Cache<String, Object> theCache = caffeine.build();

这时候你才可以往 theCache 写入缓存数据,而不能再单独针对某一个 key 设定不同的 TTL 时间。

而 Redis 可以让你非常随意的给不同的 key 设置不同的 TTL。

J2Cache 是内存缓存和 Redis 这类集中式缓存的一个桥梁,因此它只能是兼容两者的特性。

J2Cache 默认使用 Caffeine 作为一级缓存,其配置文件位于 caffeine.properties 中。一个基本使用场景如下:

#########################################
# Caffeine configuration
# [name] = size, xxxx[s|m|h|d]
#########################################

default = 1000, 30m 
users = 2000, 10m
blogs = 5000, 1h

上面的配置定义了三个缓存 Region ,分别是:

  1. 默认缓存,大小是 1000 个对象,TTL 是 30 分钟
  2. users 缓存,大小是 2000 个对象,TTL 是 10 分钟
  3. blogs 缓存,大小是 5000 个对象,TTL 是 1 个小时

例如我们可以用 users 来存放用户对象的缓存,用 blogs 来存放博客对象缓存,两种的 TTL 是不同的。

而 default 是当我们调用如下方法时: 

public void set(String region, String key, Object value)

如果我们传入的 region 参数(假设为:region1)没有在 caffeine.properties 中定义的话,那 J2Cache 会自动创建一个名为 region1 的缓存 Region,其配置和 default 的配置一致。

所以要用好缓存首先要确保以下几点:

  1. 根据业务规划好不同的 region 来存放不同的缓存数据
  2. 根据实际情况确定每个 region 的缓存数据数量和 TTL 时间
  3. 尽量必要未经定义直接使用一个全新的 region (避免使用 default 数据)

更多关于 J2Cache 的介绍请看 https://gitee.com/ld/J2Cache

© 著作权归作者所有

红薯

红薯

粉丝 21756
博文 146
码字总数 64283
作品 8
深圳
产品经理
私信 提问
加载中

评论(6)

红薯
红薯 博主

引用来自“理工男海哥”的评论

“但是一般的 Java 内存缓存框架(如 Ehcache、Caffeine、Guava Cache 等),它没法为每一个 key 设置不同 TTL” ,这句话有误,ehcache 是可以设置单个key的ttl 的。Caffeine、Guava Cache 这两个没看。

ehcache 3 就不行,知道为何吗?
理工男海哥
理工男海哥
“但是一般的 Java 内存缓存框架(如 Ehcache、Caffeine、Guava Cache 等),它没法为每一个 key 设置不同 TTL” ,这句话有误,ehcache 是可以设置单个key的ttl 的。Caffeine、Guava Cache 这两个没看。
MyronLee
MyronLee
尽量必要未经定义直接使用一个全新的 region (避免使用 default 数据)
-->
尽量避免未经定义直接使用一个全新的 region (避免使用 default 数据)
Lison-Liou
Lison-Liou
就是男左女右
黑子鱼咖
黑子鱼咖
最近最近在用
土兔子
土兔子
沙发
Python 两级缓存框架--Py3Cache

Py3Cache 是 J2Cache 两级缓存框架的 Python 语言移植版本。关于两级缓存框架的思路已经要解决的问题请看 J2Cache 项目首页中的文章以及视频,这里不再赘述。 Py3Cache 使用 Redis 的 Pub/Su...

红薯
2017/02/28
3.3K
12
J2Cache 2.2.1 正式版发布,开源中国两级缓存框架

J2Cache 2.2.1 正式版发布了。J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因...

周其
2018/01/10
1K
5
J2Cache 已经提交到 Maven 中央库

J2Cache 已经提交到 Maven 中央库,现在可以通过 Maven 的方式来使用 J2Cache 用法: J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于...

oschina
2015/01/31
3.3K
15
Java两级缓存框架--J2Cache

J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读...

红薯
2014/01/07
62.7K
112
J2Cache 2.2.0-beta 发布,开源中国两级缓存框架

J2Cache 2.2.0-beta 发布,J2Cache 是 OSChina 目前正在使用的两级缓存框架。第一级缓存使用 Ehcache,第二级缓存使用 Redis 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此...

周其
2018/01/08
3.2K
21

没有更多内容

加载失败,请刷新页面

加载更多

二叉查找树的第 K 个结点

private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root......

Garphy
今天
4
0
windo8 weblogic

需要的软件包 现在安装jdk 则先进入你电脑自带jdk \bin目录下 然后java -jar 执行你的jar包就可以了 欢迎界面直接点击下一步,跳到更新界面,直接选择跳过 然后选择安装目录(注意:目录不要有...

恩多
今天
8
0
Activiti 批注

Activiti添加批注(comment)信息 在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等  1、添加批注 // 由于流程...

奔跑的android
今天
4
0
centos7命令行和图形界面的相互切换

最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同。 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面; 2,在图形化桌面,右击鼠标,选...

无名氏的程序员
今天
6
0
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在...

Bb进阶
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部