游戏技术文章

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

时间:2017-4-6 13:27:06  作者:棋牌资源网  来源:棋牌资源网  查看:9103  评论:0
内容摘要:使用 StackExchange.Redis 封装属于自己的 RedisHelper目录核心类 ConnectionMultiplexer字符串(String)哈希(Hash)列表(List)有序集合(sorted set)Key 操作发布订阅其他 简介  目...

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

目录

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

 

简介

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper RedisHelper.cs

 

核心类 ConnectionMultiplexer

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

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

复制代码
        /// <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;
        }
复制代码

 

  我选择让这些静态变量的字段在静态构造函数中进行统一的初始化,如连接字符串,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 构造函数
复制代码
[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper 注册事件的代码

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

字符串(String)

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper String 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

哈希(Hash)

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper Hash 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

列表(List)

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper List 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

有序集合(sorted set)

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

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper SortedSet 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

Key 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper key 操作

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

发布订阅

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

[C#]_使用_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;
            }
        }
复制代码

 

  测试代码:

[C#]_使用_StackExchange.Redis_封装属于自己的_RedisHelper

 

 

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

标签:C#使用StackExchange.Redis封装属于自己的RedisHelper 

欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2022 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved