为 memcached增加缓存依赖的初步设想

CacheDependency

我们知道在System.Web.Caching.Cache中有缓存依赖这么个概念。涉及到的类有CacheDependency和 SqlCacheDependency。

CacheDependency构造函数:

static  CacheDependency();
protected  CacheDependency();
private  CacheDependency( int  bogus);
public  CacheDependency( string  filename);
public  CacheDependency( string [] filenames);
internal  CacheDependency( int  dummy,  string  filename);
public  CacheDependency( string [] filenames, DateTime start);
public  CacheDependency( string [] filenames,  string [] cachekeys);
internal  CacheDependency( int  dummy,  string [] filenames);
public  CacheDependency( string  filename, DateTime start);
public  CacheDependency( string [] filenames,  string [] cachekeys, DateTime start);
public  CacheDependency( string [] filenames,  string [] cachekeys, CacheDependency dependency);
internal  CacheDependency( int  dummy,  string  filename, DateTime utcStart);
internal  CacheDependency( int  dummy,  string [] filenames,  string [] cachekeys);
internal  CacheDependency( int  dummy,  string [] filenames, DateTime utcStart);
public  CacheDependency( string [] filenames,  string [] cachekeys, CacheDependency dependency, DateTime start);
internal  CacheDependency( int  dummy,  string [] filenames,  string [] cachekeys, DateTime utcStart);
internal  CacheDependency( int  dummy,  string [] filenames,  string [] cachekeys, CacheDependency dependency);
internal  CacheDependency( int  dummy,  string [] filenames,  string [] cachekeys, CacheDependency dependency, DateTime utcStart);

SqlCacheDependency构造函数:

private  SqlCacheDependency();
public  SqlCacheDependency(SqlCommand sqlCmd);
public  SqlCacheDependency( string  databaseEntryName,  string  tableName);

从上面的构造函数可以看出依赖项可以是:

filenames:
缓存对象所依赖的一组 (到文件或目录的)路径。当这些资源中的任何一个更改时,缓存的对象即过时,并从缓存中移除。
cachekeys:
一组缓存键,新对象监视它们的更改。当这些缓存键中的任何一个发生更改 时,与此依赖项对象关联的缓存对象即过时,并从缓存中移除。
tableName : 表名。

初步设想

我想实现的功能是memcached中某一个key基于另一个key 的依赖

据我所知memcached的cache机制是这样的:LRU(最近最少用)算法+超时失效,其本身没有提供依赖策略。

下面谈一下我的设计思路:

场景:key2,key3依赖于key1。当key1发生变化时,key2,key3视为无效。

第一个思路:key1发生变化时,不立即移除 key2,key3。在每次返回key2,key3对象时检查key1是否发生变化。如果发生变化再移除key2,key3。

按着这个思路,设计了以下模型图。欢迎拍砖!

 

解释一下上图:
没有依赖项的ca che
Data:数据cache。
Ctime:创建时间 cache。

创建key1时,创建DATA_Key1和Time_Key1。
移除key1时,移除DATA_Key1和 Time_Key1。
有依赖项的cache
Data: 数据cache。
Ctime:创建时间cache。
DependKey:所依赖的key。
DependCtime:所依赖的 key的创建时间。

创建key2时,创建DATA_Key2、Time_Key2、DEPDATA_Key2和 DEPTime_Key2。
DEPDATA_Key2的值是DATA_Key1。
DEPTime_Key2的值是Time_Key1的 值。

读取key2
1、判断DEPTime_Key2的值是否等于Time_Key1的值。
2、如果相等,直接读取 DATA_Key2。
3、如果不等,移除DATA_Key2、Time_Key2、DEPDATA_Key2和DEPTime_Key2。

if(Time_Value1==DEPTime_Value2)
{
  return DATA_Value2;    
}
else
{
  Remove(Key2)

第二个思路: key1发生变化时,立即移除key2,key3。

1 、依赖关系保存在memcached中(内存)。

没有依赖项的cache
Data:数据 cache。
DependKey:依赖于key1的key集合。

创建key1时,创建DATA_Key1。
移除key1 时,移除DATA_Key1、DATA_Key2和 DEPDATA_Key1。

有依赖项的 cache
Data:数据cache。

创建key2时,创建DATA_Key2、更新DEPDATA_Key1。
移 除key2时,移除DATA_Key2、更新DEPDATA_Key1。

2、依赖关系保存在XML文件中(硬盘)。

 原理与上面类似,只是将DependKey保存到了XML结构中。
memcached中的超时失效

我们上面的设计都是在客户端封装的方法(AddCache、RemoveCache),memcached中有超时失效。下面看看超时失效对于以上 设计的影响。

第一个思路

1、Key1超时失效。

Key1的Data、Ctime失效时间设为一致。

Key1的DATA_Key1和Time_Key1失效后,当读取Key2时,Time_value1=null。Key2会做Remove操作。 该设计方案不受影响。

2、Key2超时失效。

Key2的DATA_Key2、Time_Key2、DEPDATA_Key2和DEPTime_Key2 失效时间设为一致。

Key2失效后对Key1没有影响。

第二个思路
1、Key1超时失效。
Key1的Data、DependKey失效时间设为一致。
Key1的Data、DependKey失效后,Key2没有被移除,会造成Key2数 据不一致。 如果memcached超时失效时有通知的机制就可以解决此问题。

目前没有查到memcached中有超时失效通知的机制。

 

2、 Key2超时失效。Key2失效后, DEPDATA_Key1中还存在key2。下次Key1失效时,会多一次判断。不过功能不受影响。

 

另,关于memcached的问题,也欢迎大家到memcached小组讨论:http://space.cnblogs.com/group /101220/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值