zoukankan      html  css  js  c++  java
  • 为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。

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

    解释一下上图:
    没有依赖项的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中(内存)。

    没有依赖项的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/

  • 相关阅读:
    C++ 对象模型学习记录(2) 第3章 data语义学
    C++ 对象模型学习记录(1) 第2章 构造函数语义学
    C ++ 对象模型学习记录(4) function 语义学 (未完待续)
    C++ 对象模型学习记录(3) 第1章 关于对象(未完)
    设计模式复习 之 代理模式
    大数运算
    effective C ++ 学习笔记之 item 31 将文件间的编译依赖关系降至最低(未完成)
    Java 复习 之1 多线程
    SQL中char varchar nchar nvarchar ntext区别和使用(资料汇总)
    .Net中的加密解密
  • 原文地址:https://www.cnblogs.com/tenghoo/p/Memcache_key_Depend.html
Copyright © 2011-2022 走看看