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 = ; i < ; i++)
{
RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test01", i.ToString());
Thread.Sleep();
Console.WriteLine("test011" + i);
}
});
actionList.Add(() =>
{
for (int i = ; i < ; i++)
{
RedisClient.RedisManager.Instance.GetDatabase().SetAdd("test02", i.ToString());
Thread.Sleep();
Console.WriteLine("test012" + i);
}
});
Parallel.Invoke(actionList.ToArray());
}
通过测试和观察,我们可以看到,这个并发的线程同时使用一个RedisManager的实例,并没有出现阻塞的情况,即同一个链路,处理了多个任务!
Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术的更多相关文章
- StackExchange.Redis使用和封装小试
StackExchange.Redis使用和封装小试 https://git.oschina.net/Ultralisk/ThorActor/blob/ThorActor/DBUtility/Redi ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- StackExchange.Redis 二次封装
在NuGet直接搜索StackExchange.Redis,下载引用包: 帮助类: public class RedisUtils { /// <summary> /// redis配置文 ...
- StackExchange.Redis使用以及封装
来源:http://www.cnblogs.com/qtqq/p/5951201.html Redis安装:http://www.runoob.com/redis/redis-install.html ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现
回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...
- Redis 详解 (一) StackExchange.Redis Client
这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...
- StackExchange.Redis 访问封装类
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...
- StackExchange.Redis Client
StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...
随机推荐
- IL实现简单的IOC容器
既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...
- css3+jquery制作3d旋转相册
首先来看一下今天的炫酷效果: 首先分析一下这张图片: 1.每张图片都有倒影 2.这11张图片呈圆形均匀排列 3.可旋转,上下移动(当然这是效果做出来以后,图片是分析不出来的) 那下面就开始吧. 一.准 ...
- arcgis api for js共享干货系列之一自写算法实现地图量算工具
众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/s ...
- KOTLIN开发语言文档(官方文档) -- 入门
网页链接:https://kotlinlang.org/docs/reference/basic-syntax.html 1. 入门 1.1. 基本语法 1.1.1. 定义包 包说明应该在源 ...
- Android数据库相关整理
今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅.主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一.原生数据库 ...
- 因为没用过,所以没想过的--goto
今天读了读 Rui Maciel 大神写的 mjson parser,mjson 解析器是一个使用 ISO C 实现的小型 JSON 解析器.嵌入式项目中使用到了该解析器,随即拿出来看看. 看到如下代 ...
- ViewPager之Fragment页面切换
一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPa ...
- iOS开发--弹窗多选、单选框架
最近刚毕业...因为个毕设,都离职了又得重新找工作了,这是之前自己没事开直播写的一个小框架,后来各种趋于稳定后,简单的封装了下,写了个小demo,这里就不废话了,直接贴地址,也不编辑了,自己复制过去看 ...
- 安卓---Toast工具类,有点懒
package com.liunan.myfirstapp.util; import android.content.Context; import android.widget.Toast; /** ...
- Redis五种基本数据结构
1.字符串 示例: 2.列表 示例: 3.集合 示例: 4.散列 示例: 5.有序集合 待续...