`
阅读更多
下面列出Cache的基本特性。
1. 时间记录
数据进入Cache的时间。

2. timeout过期时间
Cache里面的数据多久过期

3. Eviction Policy 清除策略
Cache满了之后,根据什么策略,应该清除哪些数据。
比如,最不经常被访问的数据,最久没有访问到的数据。

4. 命中率
Cache的数据被选中的比率

5. 分级Cache
有些Cache有分级的概念。比如,几乎所有的Cache都支持Region分区的概念。可以指定某一类的数据存放在特定的Region里面。JBoss Cache可以支持更多的级别。

6. 分布式Cache
分布在不同计算机上的Cache

7. 锁,事务,数据同步
一些Cache提供了完善的锁,事务支持。

过期数据
Cache可以用在任何地方,比如,页面缓存。但Cache的最常用场景是用在ORM中,比如,Hibernate,JDO,JPA中。
ORM Cache的使用方法有个原则——不要把没有Commit的修改数据放入到缓存中。这是为了防止Read Dirty。
数据库事务分为两种,一种是读事务,不修改数据,一种是写事务,修改数据。
写事务的操作流程如下:
db.commt();
cache.remove(key); // 这一步操作,清除了Cache数据,也记录了一个时间removeTime。

读事务的操作流程如下:
readTime = current time;
data = cache.get(key);
if(data is null){
data = db.load(key);
cache.put(key, data, readTime); // 这里要readTime传进去
}

这里需要注意的是put的时候,需要readTime这个参数。
这个readTime要和上一次的removeTime进行比较。
如果readTime > removeTime,这个put才能成功,数据才能够进入缓存。
这是为了保证不把过期数据放入到Cache中,及时反映数据库的变化。

另外,需要注意的是,cache.remove(key); 这个事件需要传播到Cluster其他计算机,通知它们清理缓存。
为什么需要这个通知?
一定要注意,这不是为了避免并发修改冲突。并发修改冲突的避免需要引入乐观锁版本控制机制。
有可能存在这样的误解,认为有了乐观锁版本控制机制,就不需要Cache.remove通知了。这是不对的。
Cache.remove通知的主要目的是,保证缓存能够及时清理过期数据,反映数据的变化,保证大部分时间内,应用程序显示给用户的不是过期数据。
另外,db.commt(); cache.remove(key); 这两步调用之间,有很小的可能发生另外的事务。这段极小的时间内,可能无法保证Read Committed,可能出现很短期的过期数据。
为什么说很短期,因为紧接着的Cache.remove就会清理过期数据。
如果偏执到这种程度,这么短期的几乎不可能发生的小概率事件,都不能容忍,那么可以,db.commt()之前,给Cache加一个悲观锁,不让别的事务,把数据Put进入Cache,就可以防止这个小概率、微影响的事件。
JBoss Cache和Tangosol就提供了这类鸡肋一般的悲观锁机制。典型的开发资源配置不当,有用的需要的不做,没用的功能使劲做。

ORM Query Cache
ORM Cache一般分为两种。一种是ID Cache(ORM文档中称为二级Cache),用来存放Entity ID对应的Entity对象;一种是Query Cache,用来存放一条查询语句对应的查询结果集。
ID Cache非常直观,如同上述讲述的,一般是一个Entity Class对应一个Region,Entity存放到对应的Region里面。
Query Cache比较复杂,而且潜在作用很大,值得仔细讲解。
现有的ORM对Query Cache的支持并不是很理想。
比如,Hibernate把整个结果集直接放在Query Cache中。这样,有任何风吹草动,发生了任何数据库的写操作,Query Cache都需要清空。
有一种比较好的做法,把ID List存放在Query Cache中,每次获取的时候,先获取ID List,然后根据ID List获取Entity List。Query Cache根据Query涉及到的Table Name来进行清理,一旦发生对这些Table Name的修改操作,就可以根据不同情况,清理Query Cache。
比如,select t2.* from t1, t2 where t1.id = t2.foreign_id and t1.name = ‘a’
那么insert into t1, delete from t1, insert into t2, delete from t2都会清除这条Query Cache。
同样的 update t1 set name = … 这样的语句也会清除这条Query Cache。
Hibernate为什么不这么做,因为Query Cache的情况比较复杂。也许选择的结果集并不是只有一个Entity类型,也许只是几个字段。
这个地方,如果细分,还是有很多功夫可以做的。而且也很值得花功夫做,因为Query Cache对于性能的提高,有很大作用。
分享到:
评论

相关推荐

    高速缓存(Cache)的Verilog代码

    该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB I_Cache Cache替换策略: ...

    cache-api-1.1.1-API文档-中文版.zip

    赠送jar包:cache-api-1.1.1.jar; 赠送原API文档:cache-api-1.1.1-javadoc.jar; 赠送源代码:cache-api-1.1.1-sources.jar; 赠送Maven依赖信息文件:cache-api-1.1.1.pom; 包含翻译后的API文档:cache-api-...

    Supercache X86 win7版本

    SuperCache实现专利的数据块级别的缓存技术,除提高系统性能之外,还能独自进行 NT 文件级别缓存。 SuperCache使用获得专利的块级高速缓存技术来提升系统的性能,这种技术远胜于单纯使用NT文件级的高速缓存。通过...

    头歌计算机组成原理2路组相联cache设计

    头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2...

    PrimoCache和PrimoRamdisk 重置试用期

    PrimoCache和PrimoRamdisk 重置试用期 PrimoCache 支持版本 V2.4.0 V2.5.0 V2.6.0 PrimoRamdisk 支持版本 V5.7.0 如果同时安装了PrimoCache 和 PrimoRamdisk, 那么重置试用期的时候如果只是针对其中的一个...

    论文研究-基于分布式合作cache的私有cache划分方法.pdf

    私有cache划分(private cache partitioning,PCP)方法采用一个分布式一致性引擎(DCE)把多个私有cache组织在一起,最后通过硬件信息提取单元获得多个程序在不同cache路上的命中分布情况,用于指导划分算法的执行,...

    彻底搞清楚library cache lock的成因和解决方法

    当出现上述情况的时候,我们可以通过v$session_wait查询等待事件,当然,这种情况下,该session的等待事件一定是'Library cache lock'。 让我们来解释一下, 第一种情况,当会话1(session 1)在对一个表执行DML ...

    ARM高速缓存(Cache)Verilog代码 包含ISE工程

    该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,附带可运行的ISE工程文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB ...

    expresscache_x64 64位 1.3.118 最新版

    ExpressCache可以让电脑上面只需要安装一个20来G的小msata固态SSD硬盘就可以让整台电脑的读写性能大增,启动时间达到几乎和完全使用SSD硬盘一样的速度(虽然比不上真正的全固态),不过对于平时使用来说,已经是很...

    PrimoCache3.0.2+永久60天+免PE重置(x86.x64)

    PrimoCache3.0.2+永久60天+免PE重置(x86.x64),亲测(win7 x86,x64 win10 x64,其他未测,理论可用),一键恢复60天试用状态,不用重启进PE这么麻烦。使用方法见文件中的说明文档,需要说明的是,程序运行需要...

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot 使用spring cache缓存 和 使用fastjson配置redis系列化,springboot ...

    opencv-4.8.0-cache.zip

    这个是windows上源码编译opencv4.8.0+opencv-contrib4.8.0时候cmake时候缓存文件,只需要将压缩文件夹解压到源码目录下面,cmake-gui上configure时候就不会报错,注意解压后文件夹名字是.cache,文件夹名字不能改变,...

    java连接cache数据库说明,数据库驱动,cache可视化工具

    java连接cache数据库说明,数据库驱动,cache可视化工具

    Supercache+超级缓存使用详解

    Supercache 超级缓存使用详解 Supercache 是一种高性能的缓存技术,能够极大地提高计算机的读写性能。下面是 Supercache 的使用详解。 一、安装方法 在安装 Supercache 之前,需要先安装好重开机,然后在我的...

    php数据缓存cache类

    如果访问量大的话会给数据库造成很大的负担,所以对于变化不经常的内容要做好php 数据cache(缓存)是十分必要的。 对于一般的变量,把该变量变成php语言的格式,写到文件中,用时只要include这个文件就相当于加载了...

    supercache2 含注册机

    supercache2 含注册机 巨好用的内存虚拟硬盘缓存软件,能大大减轻硬盘负担。 Supercache II这个软体最主要的功能就是帮硬碟做cache的动作,你可以把他想成是硬碟的快取, 目前市面上的硬碟快取主要为8MB,用这个...

    Cache Killer.crx

    Cache Killer(chrome刷新自动清除缓存插件)是一款每当页面刷新就会自动清除缓存数据的chrome插件,Cache Killer适用于以chrome为内核的所有浏览器,该插件能在你加载页面之前自动清除浏览器缓存,而不需要在浏览器...

    值得推荐的WordPress缓存插件DB Cache

    WordPress支持很丰富的插件功能,通过这些插件功能极大的完善了,凡事都具有两面性,有利有弊,有时WordPress的插件会出现插件相冲突的事件,例如:wp super cache与postviews插件二者就有冲突,这对于一些朋友来说...

    8位无Cache的5段流水CPU

    参考《16位5级流水无cache实验CPU课程设计实验要求》文档及其VHDL代码,在理解其思想和方法的基础上,将其改造成8位的5级流水无cache的实验CPU,包括对指令系统、数据通路、各流水段模块、内存模块等方面的改造。...

    oracle性能调优之buffer cache

    Oracle 性能调优之 Buffer Cache Buffer Cache 是 Oracle 中的一种缓存机制,负责将磁盘上的数据 block 读取到内存中,以提高数据库的访问速度。在本文中,我们将详细介绍 Buffer Cache 的工作原理、状态、管理和...

Global site tag (gtag.js) - Google Analytics