[C#] 使用 StackExchange.Redis 封装属于自己的 RedisHelper
目录
- 核心类 ConnectionMultiplexer
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 有序集合(sorted set)
- Key 操作
- 发布订阅
- 其他
简介
目前 .NET 使用访问 Redis 的的类库主流应该是 StackExchange.Redis,自己参考网上的文章(也许是吃饱了撑着),也尝试做出简单的封装。
RedisHelepr.cs
核心类 ConnectionMultiplexer
在 StackExchange.Redis 中最核心(中枢)的是 ConnectionMultiplexer 类,在所有调用之间它的实例对象应该被设计为在整个应用程序域中为共享和重用的,并不应该为每一个操作都创建一个 ConnectionMultiplexer 对象实例,也就是说我们可以使用常见的单例模式进行创建。
虽然 ConnectionMultiplexer 实现了 IDisposable 接口,但这并不意味着需要使用 using 进行释放,因为创建一个 ConnectionMultiplexer 对象是十分昂贵的 , 所以最好的是我们一直重用一个 ConnectionMultiplexer 对象。
/// <summary>
/// 连接字符串
/// </summary>
private static readonly string ConnectionString;
/// <summary>
/// redis 连接对象
/// </summary>
private static IConnectionMultiplexer _connMultiplexer;
/// <summary>
/// 默认的 Key 值(用来当作 RedisKey 的前缀)
/// </summary>
private static readonly string DefaultKey;
/// <summary>
/// 锁
/// </summary>
private static readonly object Locker = new object();
/// <summary>
/// 数据库
/// </summary>
private readonly IDatabase _db;
/// <summary>
/// 获取 Redis 连接对象
/// </summary>
/// <returns></returns>
public IConnectionMultiplexer GetConnectionRedisMultiplexer()
{
if ((_connMultiplexer == null) || !_connMultiplexer.IsConnected)
{
lock (Locker)
{
if ((_connMultiplexer == null) || !_connMultiplexer.IsConnected)
_connMultiplexer = ConnectionMultiplexer.Connect(ConnectionString);
}
}
return _connMultiplexer;
}
我选择让这些静态变量的字段在静态构造函数中进行统一的初始化,如连接字符串,ConnectionMultiplexer 对象和注册事件等。
#region 构造函数
static RedisHelper()
{
ConnectionString = ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString;
_connMultiplexer = ConnectionMultiplexer.Connect(ConnectionString);
DefaultKey = ConfigurationManager.AppSettings["Redis.DefaultKey"];
AddRegisterEvent();
}
public RedisHelper(int db = -1)
{
_db = _connMultiplexer.GetDatabase(db);
}
#endregion 构造函数
注册事件的代码
这里的 Redis.DefaultKey 和 RedisConnectionString 对应配置文件中 App.Config。
DefaultKey(默认 Key)的作用是给 redisKey 值添加一个前缀,我这里使用了命名空间作为了前缀,在 Redis 可视化工具中可以更直观的进行显示(以“:”进行字符串的拼接)。
字符串(String)
存储字符串值。所有的同步方法都带有对应的异步方法,所以也进行了简单的封装。比较常用的应该是字符串操作,直接将 value 序列化存放到 redis 中。
String 操作
哈希(Hash)
哈希是一个 string 类型的 field 和 value 的映射表,哈希特别适合用于存储对象。
Hash 操作
列表(List)
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
List 操作
有序集合(sorted set)
有序集合成员是唯一的,这就意味着集合中不能出现重复的数据。
SortedSet 操作
Key 操作
key 操作
发布订阅
一般会使用第三方的 MQ,如 RabbitMQ。
发布订阅
其他
这里使用了二进制序列化器进行序列化操作。
/// <summary>
/// 添加 Key 的前缀
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private static string AddKeyPrefix(string key)
{
return $"{DefaultKey}:{key}";
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
private static byte[] Serialize(object obj)
{
if (obj == null)
return null;
var binaryFormatter = new BinaryFormatter();
using (var memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, obj);
var data = memoryStream.ToArray();
return data;
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="data"></param>
/// <returns></returns>
private static T Deserialize<T>(byte[] data)
{
if (data == null)
return default(T);
var binaryFormatter = new BinaryFormatter();
using (var memoryStream = new MemoryStream(data))
{
var result = (T)binaryFormatter.Deserialize(memoryStream);
return result;
}
}
测试代码:
【备注】内部还有很多的接口和方法没有进行封装,还需要自己进行封装。
【GitHub】https://github.com/liqingwen2015/Wen.Helpers 后续维护只在代码中