Redis 详解 (一) StackExchange.Redis Client
这期我们来看StackExchange.Redis
,这是redis 的.net客户端之一。Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务。目前有不少人在使用ServiceStack.Redis
这个.net客户端,但是这个的最新版本目前已经变成了商业软件。对于ServiceStack.Redis
这种行为,我们没有什么好说的,留给我们的选择是使用低版本的开源版本或者转向其他的客户端。
要说到StackExchange.Redis,就不得不说它和BookSleeve的关系。BookSleeve已经是比较完善的redis sdk,但是为什么 BookSleeve 的作者要重新写一个redis 的客户端sdk呢? 有兴趣的同学可以看这里why i wrote another redis client 归纳起来其实就一句话:觉得不爽就推倒重来。
(╯◕◞౪◟◕‵)╯︵ ┴─┴ (╯-_-)╯╧╧ (╯‵□′)╯︵┴─┴ (╯' - ')╯︵ ┻━┻ ┬─┬ ノ
StackExchange.Redis 安装
直接命令或者手动NuGet。
PM> Install-Package StackExchange.Redis
如果需要强签名的版本走下面的命令,当然作者对于强签名的事也是充满了怨念
PM> Install-Package StackExchange.Redis.StrongName
ConnectionMultiplexer
ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,你不要在每个操作中不停的创建该对象的实例,所以使用单例来创建和存放这个对象是必须的。
public static ConnectionMultiplexer Manager
{
get
{
if (_redis == null)
{
lock (_locker)
{
if (_redis != null) return _redis;
_redis = GetManager();
return _redis;
}
}
return _redis;
}
}
private static ConnectionMultiplexer GetManager(string connectionString = null)
{
if (string.IsNullOrEmpty(connectionString))
{
connectionString = GetDefaultConnectionString();
}
return ConnectionMultiplexer.Connect(connectionString);
}
虽然ConnectionMultiplexer是实现了IDisposable接口的,但是我们基于重用的考虑,一般不需要去释放它。
当作内存数据库使用
IDatabase db = redis.GetDatabase();
这里的GetDatabase() 返回的db对象是很轻量级别的,不需要被缓存起来,每次用每次拿即可。IDatabase 的所有方法都有同步和异步的实现。其中的异步实现都是可以await的。
一些基础的操作的封装。
public bool Remove(string key)
{
key = MergeKey(key);
var db = RedisManager.Manager.GetDatabase(Database);
return db.KeyDelete(key);
}
public string Get(string key)
{
key = this.MergeKey(key);
var db = RedisManager.Manager.GetDatabase(Database);
return db.StringGet(key);
}
public bool Set(string key, string value, int expireMinutes = 0)
{
key = MergeKey(key);
var db = RedisManager.Manager.GetDatabase(Database);
if (expireMinutes > 0)
{
db.StringSet(key, value, TimeSpan.FromMinutes(expireMinutes));
}
else
{
db.StringSet(key, value);
}
return db.StringSet(key, value);
}
public bool HasKey(string key)
{
key = MergeKey(key);
var db = RedisManager.Manager.GetDatabase(Database);
return db.KeyExists(key);
}
这里的MergeKey
用来拼接Key
的前缀,具体不同的业务模块使用不同的前缀。
这里有个和ServiceStack.Redis
大的区别是没有默认的连接池管理了。没有连接池自然有其利弊,最大的好处在于等待获取连接的等待时间没有了,也不会因为连接池里面的连接由于没有正确释放等原因导致无限等待而处于死锁状态。缺点在于一些低质量的代码可能导致服务器资源耗尽。不过提供连接池等阻塞和等待的手段是和作者的设计理念相违背的。StackExchange.Redis这里使用管道和多路复用的技术来实现减少连接,这里后续展开再讨论。
当作消息代理中间件使用
消息组建中,重要的概念便是生产者,消费者,消息中间件。
ISubscriber sub = redis.GetSubscriber();
首先,先拿到一个ISubscriber对象。在生产者端我们发布一条消息:
sub.Publish("messages", "hello");
,在消费者端得到该消息并输出
sub.Subscribe("messages", (channel, message) => {
Console.WriteLine((string)message);
});
一般使用更专业的消息队列来处理这种业务场景,因此这里就略过了。
三种命令模式
Sync vs Async vs Fire-and-Forget
最后,这里有三种命令模式分别对应StackExchange.Redis
的三类不同的使用场景。
Sync,同步模式会直接阻塞调用者,但是显然不会阻塞其他线程。
Async,异步模式直接走的是Task模型。
Fire-and-Forget,就是发送命令,然后完全不关心最终什么时候完成命令操作。
db.StringIncrement(pageKey, flags: CommandFlags.FireAndForget);
这里值得注意的是,在Fire-and-Forget模式下,所有命令都会立即得到返回值,当然该值都是该返回值类型的默认值,比如操作返回类型是bool将会立即得到false,因为false = default(bool)。
当当当当 - つづく
Redis 详解 (一) StackExchange.Redis Client的更多相关文章
- .Net使用Redis详解之ServiceStack.Redis(七) 转载https://www.cnblogs.com/knowledgesea/p/5032101.html
.Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现 ...
- .Net使用Redis详解之ServiceStack.Redis(7)
Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中 ...
- .Net使用Redis详解之ServiceStack.Redis(七)
序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redi ...
- .Net使用Redis详解之ServiceStack.Redis
序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redi ...
- Spring Boot 之 Redis详解
Redis是目前业界使用最广泛的内存数据存储. Redis支持丰富的数据结构,同时支持数据持久化. Redis还提供一些类数据库的特性,比如事务,HA,主从库. REmote DIctionary S ...
- 基础拾遗------redis详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- Spring Data操作Redis详解
Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...
- Redis详解入门篇
Redis详解入门篇 [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介 ...
- redis详解(二)-- 数据类型详解
Redis常用数据类型详解 1,Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据 ...
随机推荐
- CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
一.前言 IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...
- jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)
Deferred的概念请看第一篇 http://www.cnblogs.com/aaronjs/p/3348569.html ******************构建Deferred对象时候的流程图* ...
- PC使用网线上网的条件下,通过PC的Wifi共享提供手机上网教程
场景和目标 你有一个笔记本(或装有无线网卡的PC),可以通过网线上网,但是没有无线路由器.现在想要通过笔记本的无线网,让手机也能共享wifi上网. 环境 Win7 操作系统.带有无线网卡的PC或笔记本 ...
- .NET 新标准介绍
本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移.文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意味着什么. 如果你对细节感兴趣,这篇文章 ...
- WCF服务创建与抛出强类型SOAP Fault
原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...
- Worktile协同特色之一:无处不在的关注
团队沟通中常见问题 在回答这个问题之前,我们不妨先来思考一下,团队成员之间互相配合沟通的几个问题:1. 任务的执行者在完成这个任务时,如何通知到此任务相关联的其他成员,比如该任务的后续任务执行者?2. ...
- oracle数据库的安装、配置与无残留卸载
安装配置 :关闭专用网络防火墙 2 :以管理员身份运行安装文件 ——“setup.exe” 3 :设置口令 其中SYS 用户权限大于 SYSTEM 4 :先决条件检查,若验证成功,点击 ”下 ...
- Android开发学习之路-回调机制学习笔记
不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...
- KnockoutJS 3.X API 第六章 组件(1) 组件和自定义元素 - 概述
Components (组件)是一个强大的,干净的方式组织您的UI代码,可重复使用的块. : -可以表示单独的控件/窗口小部件或应用程序的整个部分 -包含自己的视图,通常(但可选)自己的视图模型 -可 ...
- Android开发-之五大布局
在html中大家都知道布局是什么意思了,简单来说就是将页面划分模块,比如html中的div.table等.那么Android中也是这样的.Android五大布局让界面更加美化,开发起来也更加方便.当然 ...