Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术

回到目录

两雄争霸

使用StackExchange.Redis的原因是因为它开源,免费,而对于商业化的ServiceStack.Redis,它将一步步被前者取代,开源将是一种趋势,商业化也值得被我们尊重,毕竟人家研究代码也不容易,做商品也很正常,当然这不是我们今天的重要,今天主要说一下对StackExchange.Redis的封装,它与ServicesStack.redis最大的不同就是,它没有线程池的概念,这对于初学者绝对是个坑,大家使用时一定要注册,StackExchange.redis的对象一定要做成静态化的,或者单例的,不然,你的服务器的CPU将在不久的将来出现瓶颈,可以设想一下,网络socket只建立连接,而不被释放,是个什么味道!(平凡建立连接,用完释放,也是一种资料的浪费)

一家独占-多路复用

数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个信号组合起来在一条物理信道上进行传输,在远距离传输时可大大节省电缆的安装和维护费用。

大叔定义:简单的说,就是一个连接,一个链路,供多个线程使用,发数据包,收数据包等!

Lind.DDD.RedisClient就简单了

   /// <summary>
    /// StackExchange.Redis管理者
    /// 注意:这个客户端没有连接池的概念,而是有了多路复用技术
    /// </summary>
    public class RedisManager
    {
        /// <summary>
        /// 锁对象
        /// </summary>
        private static object _locker = new object();
        /// <summary>
        /// StackExchange.Redis对象
        /// </summary>
        private static ConnectionMultiplexer instance;

        /// <summary>
        /// 得到StackExchange.Redis单例对象
        /// </summary>
        public static ConnectionMultiplexer Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (_locker)
                    {
                        if (instance != null)
                            return instance;

                        instance = GetManager();
                        return instance;
                    }
                }

                return instance;
            }
        }

        /// <summary>
        /// 构建链接,返回对象
        /// </summary>
        /// <param name="connectionString"></param>
        /// <returns></returns>
        private static ConnectionMultiplexer GetManager()
        {
            string connectionString = ConfigConstants.ConfigManager.Config.Redis.Host;
            if (string.IsNullOrEmpty(connectionString))
            {
                throw new ArgumentNullException("请配置Redis连接串!");
            }
            return ConnectionMultiplexer.Connect(connectionString);
        }

    }

对于多路利用的并发测试

        [TestMethod]
        public void Redis_Async()
        {
            List<Action> actionList = new List<Action>();
            actionList.Add(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test01", i.ToString());
                    Thread.Sleep(100);
                    Console.WriteLine("test011" + i);
                }
            });
            actionList.Add(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test02", i.ToString());
                    Thread.Sleep(10);
                    Console.WriteLine("test012" + i);
                }
            });
            Parallel.Invoke(actionList.ToArray());
        }

通过测试和观察,我们可以看到,这个并发的线程同时使用一个RedisManager的实例,并没有出现阻塞的情况,即同一个链路,处理了多个任务!

回到目录

时间: 2024-10-12 02:38:51

Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术的相关文章

StackExchange.Redis Client

StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceStack.Redis这个.net客户端,但是这个的最新版本目前已经变成了商业软件.对于ServiceStack.Redis这种行为,我们没有什么好说的,留给我们的选择是使用低版本的开源版本或者转向其他的客户端. 要说到StackExchange.

StackExchange Redis如何实现BRPOP/BLPOP

今天在使用StackExchange Redis客户端时.我想要使用BRPOP,但是我发现StackExchange Redis并没有提供API,没办法只好找资料看文档了. 原来StackExchange Redis使用的是Multiplexing(多路复用),也就是说它只跟redis server维持单个连接.当有并发请求时,它会自动使用管道(pipeline)发送每个请求,每个请求都需要等待直到先前的请求执行完毕.基于这个原因,StackExchange Redis不提供BRPOP/BLPO

StackExchange.Redis.Extensions.Core 源码解读之 Configuration用法

前言 之前接触到Redis,然后选用了对StackExchange.Redis又一层封装的StackExchange.Redis.Extensions.Core类库.阅读源代码的过程中发现了他使用Configuration实现读取自定义配置的方法.特此学习并记录.在我们日常开发中,最常用的自定义配置读取方式莫过于如下两种方式,尤其是连接数据库. //读取appsetting var appSettingValue = ConfigurationManager.AppSettings["KEY&q

Redis项目实战 .net StackExchange.Redis

StackExchange.Redis 免费.支持异步.用的最多 常用对象 源码地址:https://github.com/StackExchange/StackExchange.Redis    用vs2017打开 ConnectionMultiplexer 中文意思  连接复用器 注释:Represents an inter-related group of connections to redis servers      表示一群相互关联的redis服务,就相当于一个对redis数据库操

StackExchange.Redis 之 hash 类型示例

StackExchange.Redis 的组件封装示例网上有很多,自行百度搜索即可. 这里只演示如何使用Hash类型操作数据: 1 // 在 hash 中存入或修改一个值 并设置order_hashkey有效期1分钟,过期自动删除:null为不过期 2 stopwatch.Start(); 3 var isok = RedisCacheHelper.Instance.HashSet("order_hashkey", "order_hashfield", "

Lind.DDD.Repositories.Redis层介绍

回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席之地,作为当今最红的key/value存储机制,它在nosql的阵营中发挥着无可代替的作用! 下面是redis文章系列的目录,大家可以进行参考,看目录 Redis学习笔记~Redis在windows环境下的安装 Redis学习笔记~Redis在.net中的应用 Redis学习笔记~Redis提供的五

StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)

本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多提建议和指正.关于更多详细介绍,请到github上看Docs,下面附上地址. 关于Redis基础控制它台操作有疑问的,欢迎阅读本人Redis系列命令拾遗分享 http://www.cnblogs.com/tdws/tag/NoSql/ 如今StackService.Redis已经转向商业版本.4.0

RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Redis发布订阅—Pub/Sub模式或者说是观察者模式.我想大家即使没有使用过,也已经耳熟能详了. 先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪. 比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式.当然如果只将报

Lind.DDD.Authorization用户授权介绍

回到目录 Lind.DDD.Authorization是Lind.DDD框架的组成部分,之所以把它封装到框架里,原因就是它的通用性,几乎在任何一个系统中,都少不了用户授权功能,用户授权对于任何一个系统来说都是必要的,像管理型的页面都需要用户先去登陆,然后拿到凭证,才可以进行访问,这在MVC和WebApi体系结构里是很容易实现的,像过滤器里的AuthorizeAttribute和ActionFilterAttribute都可以实现用户授权的功能. AuthorizeAttribute和Action