设为首页 收藏本站
查看: 1378|回复: 0

[经验分享] 为memcached增加缓存依赖的初步设想

[复制链接]

尚未签到

发表于 2015-8-31 11:53:13 | 显示全部楼层 |阅读模式
  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。
  按着这个思路,设计了以下模型图。欢迎拍砖!

  
DSC0000.jpg
  解释一下上图:
没有依赖项的cache
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中(内存)。
DSC0001.jpg
  没有依赖项的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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106777-1-1.html 上篇帖子: springMVC整合memcached,以注解形式使用 下篇帖子: memcached系列2:memcached实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表