C# 封装 Memcached 缓存策略接口

山海之间
山海之间
发布时间:2026-10-14 | 3人浏览过
原创

本文通过定义ICacheStrategy接口和实现类MemcachedStrategy,展示在C#项目中如何封装Memcached客户端。涵盖添加带过期时间的缓存、基于Key依赖与文件依赖的缓存机制、缓存的查询与删除等常用操作,为后端系统提供统一的缓存访问入口。

定义缓存策略接口

为了使代码具有良好的可扩展性,首先定义一个 ICacheStrategy 接口,规定缓存系统的核心操作方法:

public interface ICacheStrategy
{
    /// <summary>
    /// 添加数据到缓存
    /// </summary>
    /// <param name="objId">缓存名称</param>
    /// <param name="o">缓存内容</param>
    /// <param name="second">缓存时间(秒)</param>
    void Add(string objId, object o, int second);

    /// <summary>
    /// 添加数据到缓存 (依赖其它缓存)
    /// </summary>
    void AddCacheDepend(string objId, object o, int second, string[] dependKey);

    /// <summary>
    /// 添加数据到缓存 (依赖文件)
    /// </summary>
    void AddFileDepend(string objId, object o, int second, string[] files);

    /// <summary>
    /// 删除指定缓存
    /// </summary>
    void RemoveCache(string objId);

    /// <summary>
    /// 删除所有缓存
    /// </summary>
    void RemoveCacheAll();

    /// <summary>
    /// 删除匹配到的缓存 (使用正则表达式)
    /// </summary>
    void RemoveCacheRegex(string pattern);

    /// <summary>
    /// 获取所有缓存键
    /// </summary>
    IList<string> GetCacheKeys();

    /// <summary>
    /// 搜索 匹配到的缓存
    /// </summary>
    IList<string> SearchCacheRegex(string pattern);

    /// <summary>
    /// 获得缓存数据
    /// </summary>
    object GetCacheData(string objId);

    /// <summary>
    /// 判断此缓存是否有效
    /// </summary>
    bool HasCache(string objID);
}

Memcached 策略实现类

接下来实现具体的 MemcachedStrategy 类,其中大部分逻辑直接调用 Memcached 管理类的 Client 接口。此外,针对 Memcached 原生不提供的依赖特性,该实现类结合了 .NET 内置的 HttpRuntime.Cache 来模拟这一行为。

第1步:添加普通缓存数据

目的:将数据存入 Memcached,并根据传入的时间设置有效期。
动作:

  • 若超时时间 second 大于0,则使用绝对过期时间 DateTime.Now.AddSeconds(second)。
  • 否则视为永久缓存。
public void Add(string objId, object o, int second)
{
    if (second > 0)
    {
        MemcachedManager.CacheClient.Set(objId, o, DateTime.Now.AddSeconds(second));
    }
    else
    {
        MemcachedManager.CacheClient.Set(objId, o);
    }
}

第2步:添加带有依赖关系的缓存

注意:Memcached 本身不支持 Cache Dependency(缓存依赖),此处的实现是借用 ASP.NET 的本地内存缓存机制作为替代方案。
依赖其它缓存:利用 CacheDependency 的构造函数传递依赖的其他 Key 数组。
依赖文件:传入文件系统路径数组,当这些文件变更时触发缓存失效。

#region 缓存依赖没有用到memcached
/// <summary>
/// 添加数据到缓存 (依赖其它缓存)
/// </summary>
public void AddCacheDepend(string objId, object o, int second, string[] dependKey)
{
    CacheDependency dependencies = new CacheDependency(null, dependKey, DateTime.Now);
    HttpRuntime.Cache.Insert(objId, o, dependencies, DateTime.Now.AddSeconds((double)second), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}

/// <summary>
/// 添加数据到缓存 (依赖文件)
/// </summary>
public void AddFileDepend(string objId, object o, int second, string[] files)
{
    CacheDependency dependencies = new CacheDependency(files, DateTime.Now);
    HttpRuntime.Cache.Insert(objId, o, dependencies, DateTime.Now.AddSeconds((double)second), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
}
#endregion

第3步:缓存数据的增删查改

删除指定缓存:先检查 Key 是否存在,再进行删除操作以节省网络开销。
模糊查找与批量删除:通过正则表达式遍历所有 Keys 进行匹配,找到匹配的 Key 后逐个执行 Delete。
获取数据与状态检查:直接读取并返回对象,或通过 KeyExists 验证缓存有效性。

/// <summary>
/// 删除指定缓存
/// </summary>
public void RemoveCache(string objId)
{
    if (MemcachedManager.CacheClient.KeyExists(objId))
        MemcachedManager.CacheClient.Delete(objId);
}

/// <summary>
/// 删除所有缓存
/// </summary>
public void RemoveCacheAll()
{
    MemcachedManager.CacheClient.FlushAll();
}

/// <summary>
/// 删除匹配到的缓存
/// </summary>
public void RemoveCacheRegex(string pattern)
{
    IList<string> list = SearchCacheRegex(pattern);
    foreach (var item in list)
    {
        MemcachedManager.CacheClient.Delete(item);
    }
}

/// <summary>
/// 获取所有缓存键
/// </summary>
public IList<string> GetCacheKeys()
{
    return MemcachedManager.GetAllKeys();
}

/// <summary>
/// 搜索 匹配到的缓存
/// </summary>
public IList<string> SearchCacheRegex(string pattern)
{
    List<string> l = new List<string>();
    IList<string> cacheKeys = MemcachedManager.GetAllKeys();
    foreach (var item in cacheKeys)
    {
        if (Regex.IsMatch(item, pattern))
        {
            l.Add(item);
        }
    }
    return l.AsReadOnly();
}

/// <summary>
/// 获得缓存数据
/// </summary>
public object GetCacheData(string objId)
{
    return MemcachedManager.CacheClient.Get(objId);
}

/// <summary>
/// 判断此缓存是否有效
/// </summary>
public bool HasCache(string objID)
{
    return MemcachedManager.CacheClient.KeyExists(objID);
}

总结

上述代码展示了如何在 C# 应用程序中对第三方缓存组件进行二次封装。通过引入策略模式,可以在不修改业务逻辑的前提下灵活切换不同的存储后端。需要注意的是,“依赖缓存”功能的模拟依赖于内存缓存,在实际分布式场景中应谨慎评估其一致性与性能影响。

以上就是C# Memcached缓存用法实例详解的详细内容,更多关于C# Memcached的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表