之前,简单介绍了一下基于StackExchange.Redis下ConnectionMultiplexer对象怎样封装,主要用到单例模式,现在从Redis中跳出来,看看缓存。
缓存的机制很简单,从代码角度来将,所有的缓存都是Dictionary结构的,即一个key对应一个value,无论存储方式如何,无论value的结构如何。我们对缓存的操作无非四种,增;删;改;查。那我们能不能针对所有的缓存操作做一个封装呢?
ok,我们为了以后扩展其他的缓存,先预留接口,在项目中除了Redise缓存之外,我们可能还会用到LocalCache以及HttpCache等等的缓存机制。正如上文中所说,缓存几乎全都是Dictionary结构的,即key=>value;,废话不说了,直接贴代码:
/// <summary>
/// 实现锁以及其他业务
/// </summary>
public interface IBaseChacheStrategy
{
}
先定义一个接口,方便扩展,主要扩展缓存锁等基于缓存的其他操作;
public interface IBaseChacheStrategy<TKey, TValue> : IBaseChacheStrategy
{
/// <summary>
/// 获取缓存中最终的键,如Container建议格式: return String.Format("{0}:{1}", "缓存key的前缀", key);
/// </summary>
/// <param name="key"></param>
/// <param name="isFullKey">是否已经是完整的Key,如果不是,则会调用一次GetFinalKey()方法</param>
/// <returns></returns>
string GetFinalKey(string key, bool isFullKey = false);
/// <summary>
/// 添加指定ID的对象
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="value">缓存值</param>
void InsertToCache(TKey key, TValue value);
/// <summary>
/// 移除指定缓存键的对象
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="isFullKey">是否已经是完整的Key,如果不是,则会调用一次GetFinalKey()方法</param>
void RemoveFromCache(TKey key, bool isFullKey = false);
/// <summary>
/// 返回指定缓存键的对象
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="isFullKey">是否已经是完整的Key,如果不是,则会调用一次GetFinalKey()方法</param>
/// <returns></returns>
TValue Get(TKey key, bool isFullKey = false);
TValue Get<TValue>(TKey key, bool isFullKey = false);
/// <summary>
/// 获取所有缓存信息集合
/// </summary>
/// <returns></returns>
IDictionary<TKey, TValue> GetAll();
/// <summary>
/// 检查是否存在Key及对象
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="isFullKey">是否已经是完整的Key,如果不是,则会调用一次GetFinalKey()方法</param>
/// <returns></returns>
bool CheckExisted(TKey key, bool isFullKey = false);
/// <summary>
/// 获取缓存集合总数(注意:每个缓存框架的计数对象不一定一致!)
/// </summary>
/// <returns></returns>
long GetCount();
/// <summary>
/// 更新缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="value">缓存值</param>
/// <param name="isFullKey">是否已经是完整的Key,如果不是,则会调用一次GetFinalKey()方法</param>
void Update(TKey key, TValue value, bool isFullKey = false);
}
对接口中的方法做个简单阐述,
string GetFinalKey:为了方便缓存key的管理,我们往往会对缓存key前加前缀,以便标识,如:User_{key},用于标识用户,Msg_{Key},用于标识短信验证码等等;我们对缓存进行操作时,需要一个完整的key,故增加GetFinalKey方法;
void InsertToCache:插入缓存;
void RemoveFromCache:从缓存中移除;
TValue Get,TValue Get<TValue>,定义两个Get方法,是为了反序列化的需要;
IDictionary<TKey, TValue> GetAll(); 获得缓存中所有的值
bool CheckExisted;根据key校验值是否存在
GetCount;获取总条数
void Update;更新缓存;
好了,总体的接口架构大致如此,以后会对针对接口的实现进行一一阐述;希望大家提供宝贵意见;