[C#] 使用 StackExchange.Redis 封装属于自己的 RedisHelper

目录

  • 核心类 ConnectionMultiplexer
  • 字符串(String)
  • 哈希(Hash)
  • 列表(List)
  • 有序集合(sorted set)
  • Key 操作
  • 发布订阅
  • 其他

 

简介

  目前 .NET 使用访问 Redis 的的类库主流应该是 StackExchange.Redis,自己参考网上的文章(也许是吃饱了撑着),也尝试做出简单的封装。

封装redis读写客户端 c# redis 封装_封装

封装redis读写客户端 c# redis 封装_字符串_02

 RedisHelepr.cs

 

核心类 ConnectionMultiplexer

  在 StackExchange.Redis 中最核心(中枢)的是 ConnectionMultiplexer 类,在所有调用之间它的实例对象应该被设计为在整个应用程序域中为共享和重用的,并不应该为每一个操作都创建一个 ConnectionMultiplexer 对象实例,也就是说我们可以使用常见的单例模式进行创建。

  虽然 ConnectionMultiplexer 实现了 IDisposable 接口,但这并不意味着需要使用 using 进行释放,因为创建一个 ConnectionMultiplexer 对象是十分昂贵的 , 所以最好的是我们一直重用一个 ConnectionMultiplexer 对象。

封装redis读写客户端 c# redis 封装_封装redis读写客户端_03

/// <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;
        }

封装redis读写客户端 c# redis 封装_封装redis读写客户端_03

 

  我选择让这些静态变量的字段在静态构造函数中进行统一的初始化,如连接字符串,ConnectionMultiplexer 对象和注册事件等。

封装redis读写客户端 c# redis 封装_封装redis读写客户端_03

#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读写客户端 c# redis 封装_封装redis读写客户端_03

封装redis读写客户端 c# redis 封装_字符串_02

 注册事件的代码

封装redis读写客户端 c# redis 封装_redis_08

 

  这里的 Redis.DefaultKey 和 RedisConnectionString 对应配置文件中 App.Config。

封装redis读写客户端 c# redis 封装_Redis_09

 

  DefaultKey(默认 Key)的作用是给 redisKey 值添加一个前缀,我这里使用了命名空间作为了前缀,在 Redis 可视化工具中可以更直观的进行显示(以“:”进行字符串的拼接)。

封装redis读写客户端 c# redis 封装_封装_10

 

字符串(String)

  存储字符串值。所有的同步方法都带有对应的异步方法,所以也进行了简单的封装。比较常用的应该是字符串操作,直接将 value 序列化存放到 redis 中。

封装redis读写客户端 c# redis 封装_字符串_02

 String 操作

封装redis读写客户端 c# redis 封装_字符串_12

 

哈希(Hash)

  哈希是一个 string 类型的 field 和 value 的映射表,哈希特别适合用于存储对象。

封装redis读写客户端 c# redis 封装_字符串_02

 Hash 操作

封装redis读写客户端 c# redis 封装_Redis_14

 

列表(List)

  列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

封装redis读写客户端 c# redis 封装_字符串_02

 List 操作

封装redis读写客户端 c# redis 封装_字符串_16

 

有序集合(sorted set)

  有序集合成员是唯一的,这就意味着集合中不能出现重复的数据。

封装redis读写客户端 c# redis 封装_字符串_02

 SortedSet 操作

封装redis读写客户端 c# redis 封装_封装_18

 

Key 操作

封装redis读写客户端 c# redis 封装_字符串_02

 key 操作

封装redis读写客户端 c# redis 封装_封装_20

 

发布订阅

  一般会使用第三方的 MQ,如 RabbitMQ。

封装redis读写客户端 c# redis 封装_字符串_02

 发布订阅

 

其他

  这里使用了二进制序列化器进行序列化操作。

封装redis读写客户端 c# redis 封装_封装redis读写客户端_03

/// <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;
            }
        }

封装redis读写客户端 c# redis 封装_封装redis读写客户端_03

 

  测试代码:

封装redis读写客户端 c# redis 封装_redis_24

 

  【备注】内部还有很多的接口和方法没有进行封装,还需要自己进行封装。 

 

【GitHub】https://github.com/liqingwen2015/Wen.Helpers  后续维护只在代码中