目录

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

 

简介

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper

RedisHelper.cs

 

核心类 ConnectionMultiplexer

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

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper
        /// <summary>
        /// 连接字符串
        /// </summary>
        private static readonly string ConnectionString;

        /// <summary>
        /// redis 连接对象
        /// </summary>
        private static readonly 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)
                        ConnectionMultiplexer.Connect(ConnectionString);
                }
            }

            return ConnMultiplexer;
        }
使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper
        #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 构造函数
使用 StackExchange.Redis 封装属于自己的 RedisHelper
注册事件的代码

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

字符串(String)

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

String 操作

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

哈希(Hash)

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

Hash 操作

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

列表(List)

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

List 操作

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

有序集合(sorted set)

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

SortedSet 操作

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

Key 操作

key 操作

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

发布订阅

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

发布订阅

 

其他

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

使用 StackExchange.Redis 封装属于自己的 RedisHelper
        /// <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;
            }
        }
使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

  测试代码:

使用 StackExchange.Redis 封装属于自己的 RedisHelper

 

 

【GitHub】https://github.com/liqingwen2015/Wen.Helpers

相关文章: