Web中通用列表缓存的策略和实现。
在当前的web网站中,缓存扮演越来越重要的角色,是应付网站高并发的重要技术手段,在缓存中,对于单一记录的缓存是最简单的,只要卡住所有的保存、删除、更新操作,然后向缓存控制中心提交对应的事件即可,而对于list的缓存通常是很难解决的,这里说说最近在弄的缓存,自我感觉良好。
第零种:系统中最新博客文章,策略是采用ttl,每隔5‘过期一次。
第一种:最简单的list缓存,策略是只要有数据更新要删除此类的所有list缓存。(目前hibernate的二级缓存的实现策略)
第二种: 条件缓存,譬如:某人的博客;博客系统中的用户和文章的关系,当某一用户更新了自己的文章,不应该删除其他人的博客缓存,策略用用户的id参入到缓存的key中
第N种: 非固定值多条件缓存,譬如:某人9:00~10:00 的博客文章列表;策略自定义缓存策略
谈谈我的思路,一样卡住所有的增、删、改操作,当发生增删该的时候,向缓存服务器发送事件。
public class CacheEvent<T> {
private Class<T> targetClass;
private T targetObject;
private Operation operation;
public CacheEvent(Class<T> targetClass, T targetObject, Operation operation) {
this.targetClass = targetClass;
this.targetObject = targetObject;
this.operation = operation;
}
对于第一种:那么我的缓存定义:
@Cacheable(clazz=TestMember.class)
public List<TestMember> getList();
通过方法和实体类产生一个缓存key, 只要发现此这样的实体发生增、删操作,即刻删除此缓存(关于如何删除,见下文)
@Cacheable(clazz=TestArticle.class,namespaces={@CacheNsParameter(name=”member”,keyIndex=1)})public List<TestArticle> getList(@CacheKeyParameter TestMember member,@CacheKeParameter start,@CacheKeyParameter offset);
@Cacheable(clazz=TestArticle.class,strategy=”XX”)public List<TestArticle> getList(@CacheKeyParameter TestMember member,@CacheKeyParameter int month);
TestArticle_member_1_0_10 (后三位分别为member_id,start,offset)TestArticle_member_1_1_30TestArticle_member_1_40_30TestArticle_member_2_0_10TestArticle_member_2_1_10
TestArticle_member_2_30_10。。。。。。。。。。
TestArticle_member_1_v0_0_10 (后四位分别为member_id,version,start,offset)TestArticle_member_1_v0_1_30TestArticle_member_1_v0_40_30TestArticle_member_2_v0_0_10TestArticle_member_2_v0_1_10
TestArticle_member_2_v0_30_10
TestArticle_member_1_v1_0_10 (后四位分别为member_id,version,start,offset)TestArticle_member_1_v1_1_30TestArticle_member_1_v1_40_30TestArticle_member_2_v0_0_10TestArticle_member_2_v0_1_10
TestArticle_member_2_v0_30_10
