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是一个开源的内存数据存储,可以用来做数据库,缓 ...
随机推荐
- unity3d 免费好用的数据库处理框架 数据库直连框架
一.概述 前不久有一个哥们做PC游戏开发的.使用到Unity3d, 正好找到我. 我给他提供了Unity3d如何Moon.Orm来智能化编程的方式. 我们先看看怎么更加便捷sqlite. http:/ ...
- scikit-learn一般实例之六:构建评估器之前进行缺失值填充
本例将会展示对确实值进行填充能比简单的对样例中缺失值进行简单的丢弃能获得更好的结果.填充不一定能提升预测精度,所以请通过交叉验证进行检验.有时删除有缺失值的记录或使用标记符号会更有效. 缺失值可以被替 ...
- Razor基础语法一
目录: 什么是Razor? 渲染HTML Razor语法 隐式 Razor 表达式 显式 Razor 表达式 什么是Razor? Razor是基于服务端代码转换成网页的标记语法.语法主要包括Razor ...
- 使用do{ } while(0)的好处
经常看到好多程序,尤其是linux相关的,使用do{}while(0)的写法,很明显内部程序最多只能执行一次,这样写的原因是什么呢?个人认为主要的原因是,如果不使用do{}while(0),那么当一个 ...
- Java下载文件(流的形式)
@RequestMapping("download") @ResponseBody public void download(HttpServletResponse respons ...
- Mybatis框架的多对一关联关系(六)
一.一对多的关联映射 一对多关联查询多表数据 1接口 public interface IDeptDAO { //根据部门编号查询该部门单个查询 public Emp getEmpById(Integ ...
- linux使用wkhtmltopdf报错error while loading shared libraries:
官网提示 linux需要这些动态库.depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) 在li ...
- 配置rsync服务,数据同步。
这部分设计服务器端和客户端. [服务器端] 如果服务器没有安装rsync服务则使用yum安装rsync服务. yum install rsync 然后 vim /etc/xinetd.d/rsync ...
- 菜鸟快飞之JavaScript函数
1.复制变量值 在说函数前,我觉得需要先说说关于变量值的复制,以便后面的理解. 复制基本类型的值: 当一个变量复制另外一个值为基本类型的变量时,两个变量可以参与任何操作而不会互相影响 var num1 ...
- maven常用插件集
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...