C# 封装 Memcached 缓存策略接口
本文通过定义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的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













