缓存基本特性:
1.时间记录,进入Cache的时间
2.timeout过期时间,cache里面数据多久过期
3.eviction policy 清楚策略,最不经常访问的数据,最久没访问到的数据
4.命中率:Cache的数据被选中的比率
5.分级Cache,支持 Region分级,比如ehcache
6.分布式,分布在不同的计算机上
7.锁,事务,数据同步
各个Cluster之间的Cache同步有多种实现方法。比如JMS,RMI
Cache中一般有get,put,remove,clear
对于Cluster的Cache来说,读(get)肯定是local的,只需要从本地内存中获取,而Remove/clear,需要和其他计算机同步,put可以是local的,因为如果读不到,可以从数据库中读
remote put:一台计算机把数据放到自己的Cache中,这个数据需要传播到Cluster其他计算机上,这样其他Cluster可以同步,但是如果数据大,传播的代价就大了
local put:只放到本地计算机的Cache里,不需要同步到其他Cluster,从Cache得不到的数据可以在数据库里读取
过期数据:在hibernate等orm工具中,有一个原则,就是不要把没有commit的数据放到缓存中,防止脏读,而且remove之后必须通知其他Cluster,保证大部分时间内,给用户的数据不是过期的数据
ORM Cache中,一般分2种Cache,一种是类缓存,一种是查询缓存,类缓存是以ID对应Entity对象,而查询缓存是用来存放一条查询语句对应的结果集,然后再到类缓存里找响应的实体。
类缓存:一类Entity一个Region
查询缓存:hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面org.hibernate.cache. UpdateTimestampsCache所指定的缓存配置里面,当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。 可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。
7