您的位置:首页 > 数据库 > Redis

Redis缓存项目应用架构设计一

2017-09-01 17:18 483 查看
一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点。

一、基础结构介绍

/// <summary>
/// 队列提供类
/// Author:taiyonghai
/// CreateTime:2017-08-31
/// </summary>
public class MQProvider
{
#region MQ 添加

/// <summary>
/// 添加一条消息到队列
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="msg">内容</param>
/// <returns></returns>
public long SetMsg<T>(KeyNames name, T msg) where T : class, new()
{
return SetMsg<T>(name, msg, null);
}
/// <summary>
/// 添加一条消息到队列
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="msg">内容</param>
/// <param name="identities">Key标识(用于替换Key中的{0}占位符)</param>
/// <returns></returns>
public long SetMsg<T>(KeyNames name, T msg, params string[] identities) where T : class, new()
{
//如果value为null直接缓存无需序列化
string tmpMsg = null == msg ? null : JsonSerializer.SerializeToString<T>(msg);
return SetMsg(name, tmpMsg, identities);
}
/// <summary>
/// 添加一条消息到队列
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="msg">内容</param>
/// <returns></returns>
public long SetMsg(KeyNames name, string msg)
{
return SetMsg(name, msg, null);
}
/// <summary>
/// 添加一条消息到队列[核心]
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="msg">内容</param>
/// <param name="identities">Key标识(用于替换Key中的{0}占位符)</param>
/// <returns>添加消息后的队列长度</returns>
public long SetMsg(KeyNames name, string msg, params string[] identities)
{
var entity = KeyManager.Get(name, identities);
//向队列右侧插入新的消息
return RedisManager.GetClient().ListRightPush(entity.Key, msg);
}

#endregion

#region MQ 获取

/// <summary>
/// 从队列中获取一条消息,并将其在队列中移除
/// </summary>
/// <param name="name">Key名称</param>
/// <returns>没有消息返回NULL</returns>
public T GetMsg<T>(KeyNames name) where T : class, new()
{
return GetMsg<T>(name, null);
}
/// <summary>
/// 从队列中获取一条消息,并将其在队列中移除
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="identities">Key标识(用于替换Key中的{0}占位符)</param>
/// <returns>没有消息返回NULL</returns>
public T GetMsg<T>(KeyNames name, params string[] identities) where T : class, new()
{
string tmpStr = GetMsg(name, identities);
return null == tmpStr ? default(T) : JsonSerializer.DeserializeFromString<T>(tmpStr);
}
/// <summary>
/// 从队列中获取一条消息,并将其在队列中移除
/// </summary>
/// <param name="name">Key名称</param>
/// <returns>没有消息返回NULL</returns>
public string GetMsg(KeyNames name)
{
return GetMsg(name, null);
}
/// <summary>
/// 从队列中获取一条消息,并将其在队列中移除[核心]
/// </summary>
/// <param name="name">Key名称</param>
/// <param name="identities">Key标识(用于替换Key中的{0}占位符)</param>
/// <returns>没有消息返回NULL</returns>
public string GetMsg(KeyNames name, params string[] identities)
{
var entity = KeyManager.Get(name, identities);
//从队列左侧队列头部取出消息
return RedisManager.GetClient().ListLeftPop(entity.Key);
}

#endregion
}


View Code

三、项目调用代码

Redis如果遇到同样Key且同类型(String、Hash、List)时是直接覆盖值,如果不同类型的话就会报错了,我偷懒使用了同一个KeyNames就使用加前缀的方式来区分同类型不重复

CacheProvider cache = new CacheProvider();
MQProvider mq = new MQProvider();
//基础类型
cache.SetString(KeyNames.Cache_Admin_User_Session, "taiyonghai", "100");
var str = cache.GetString(KeyNames.Cache_Admin_User_Session);
//Hash类型
var dict = new Dictionary<string, string>();
dict.Add("1", "待处理");
dict.Add("2", "处理中");
dict.Add("3", "处理完成");
cache.SetHash(KeyNames.Cache_Hash_Admin_User_List, dict);
var tmpDict = cache.GetHash(KeyNames.Cache_Hash_Admin_User_List);
//List队列
mq.SetMsg(KeyNames.Msg_Admin_User_Search, "Hello");
mq.GetMsg(KeyNames.Msg_Admin_User_Search);


附录:配置参数解析

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: