【译】StackExchange.Redis中文使用文档--基本使用

基本使用

StackExchange.Redis 中核心对象是在 StackExchange.Redis 命名空间中的 ConnectionMultiplexer 类,这个对象隐藏了多个服务器的详细信息。
因为ConnectionMultiplexer要做很多事,它被设计为在调用者之间可以共享重用
你不应该在执行每一个操作的时候就创建一个 ConnectionMultiplexer. 它完全是线程安全的,并准备好这种用法(多线程)。
在后续所有的例子中,我们假设你有一个ConnectionMultiplexer类的实例保存以重用。
但现在,让我们来先创建一个。 这是使用 ConnectionMultiplexer.ConnectConnectionMultiplexer.ConnectAsync 完成的,传递配置字符串或ConfigurationOptions 对象。
配置字符串可以采用逗号分隔的一系列节点的形式,所以让我们在默认端口(6379)上连接到本地机器上的一个实例:

using StackExchange.Redis;
...
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
// ^^^ store and re-use this!!!

请注意,ConnectionMultiplexer 实现了 IDisposable 接口而且可以在不再需要的时候处理释放掉。
这是故意不展示使用 using 语句用法,因为你想要只是简单地使用一个ConnectionMultiplexer的情况是极少见的 ,因为想法是重用这个对象。

更复杂的情况可能涉及主/从设置; 对于此用法,只需简单的指定组成逻辑redis层的所有所需节点(它将自动标识主节点)

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");

如果它发现两个节点都是主节点,则可以可选地指定可以用于解决问题的仲裁密钥,然而幸运地是这样的条件是非常罕见的。

一旦你有一个 ConnectionMultiplexer ,你可能有3个主要想做的事:

  • 访问一个 redis 数据库(注意,在集群的情况下,单个逻辑数据库可以分布在多个节点上)
  • 使用 redis 的的 发布/订阅 功能
  • 访问单独的服务器以进行维护/监视

使用 redis 数据库

访问redis数据库非常简单:

IDatabase db = redis.GetDatabase();

GetDatabase 返回的对象是一个成本很低的通道对象,不需要存储。
注意,redis支持多个数据库(虽然“集群”不支持),这可以可选地在调用 GetDatabase 中指定。
此外,如果您计划使用异步API,您需要 Task.AsyncState 有一个值,也可以指定:

int databaseNumber = ...
object asyncState = ...
IDatabase db = redis.GetDatabase(databaseNumber, asyncState);

一旦你有了'IDatabase',它只是一个使用 redis API 的情况。
注意,所有方法都具有同步和异步实现。
根据微软的命名指导,异步方法都以 ...Async(...) 结尾,并且完全是可以等待的 await 等。

最简单的操作也许是存储和检索值:

string value = "abcdefg";
db.StringSet("mykey", value);
...
string value = db.StringGet("mykey");
Console.WriteLine(value); // writes: "abcdefg"

需要注意的是,这里的 String... 前缀表示 redis 的 String 类型,尽管它和 .NET 的字符串类型 都可以保存文本, 它们还是有较大差别的。
然而,redis 还允许键和值使用原始的二进制数据,用法和字符串是一样的:

byte[] key = ..., value = ...;
db.StringSet(key, value);
...
byte[] value = db.StringGet(key);

覆盖所有redis数据类型的所有 [redis数据库命令](http://redis.io/commands)的都是可以使用的。

使用 redis 发布/订阅

redis的另一个常见用法是作为 发布/订阅消息分发工具;
这也很简单,并且在连接失败的情况下, ConnectionMultiplexer 将处理重新订阅所请求的信道的所有细节。

ISubscriber sub = redis.GetSubscriber();

同样,从 GetSubscriber 返回的对象是一个不需要存储的低成本的通道对象。
发布/订阅 API没有数据库的概念,但和之前一样,我们可以选择的提供一个异步状态。
注意,所有订阅都是全局的:它们不限于 ISubscriber 实例的生命周期。
redis中的 发布/订阅 功能使用命名的“channels”; channels 不需要事先在服务器上定义(这里有一个有趣的用法是利用每个用户的通知渠道类驱动部分的实时更新)
如在.NET中常见的,订阅采用回调委托的形式,它接受通道名称和消息:

sub.Subscribe("messages", (channel, message) => {
    Console.WriteLine((string)message);
});

另外(通常在一个单独的机器上的一个单独的进程),你可以发布到该通道:

sub.Publish("messages", "hello");

这将(实际上瞬间)将“hello”写到订阅进程的控制台。 和之前一样,通道名和消息都可以是二进制的。

有关顺序和并发消息处理的使用文档说明,请参见 发布/订阅消息顺序

访问单独的服务器

出于维护目的,有时需要发出服务器特定的命令:

IServer server = redis.GetServer("localhost", 6379);

GetServer 方法会接受一个 EndPoint 终结点或者是一个可以唯一标识一个服务器的键/值对。

像之前介绍的那样, GetServer 方法返回的是一个不需要被存储的轻量级的通道对象,并且可以可选的指定 async-state(异步状态)。
需要注意的是,多个可用的节点也是可以的:

EndPoint[] endpoints = redis.GetEndPoints();

一个 IServer 实例是可以使用服务器命令的 Server commands,例如:

DateTime lastSave = server.LastSave();
ClientInfo[] clients = server.ClientList();

同步 vs 异步 vs 执行后不理

StackExchange.Redis有3种主要使用机制:

  • 同步 - 适用于操作在方法返回到调用者之前完成(注意,尽管这可能阻止调用者,但它绝对不会阻止其他线程:StackExchange.Redis的关键思想是它积极地与并发调用者共享连接)

  • Asynchronous - where the operation completes some time in the future, and a Task or Task<T> is returned immediately, which can later:

  • 异步 - 操作在将来完成一些时间,并且立即返回一个 Task 或 'Task<T>' 对象,也可以稍后再返回:

  • 是可以等待的(阻塞当前线程,直到响应可用) .Wait()

  • 可以增加一个后续的回调 (TPL 中的 ContinueWith)

  • awaited 可等待的(这是简化后者的语言级特性,同时如果答复已经知道也立即继续)

  • 执行后不理 - 适用于你真的对这个回复不感兴趣,并且乐意继续不管回应

同步的用法已经在上面的示例中展示了。这是最简单的用法,并且不涉及 TPL

对于异步使用,关键的区别是方法名称上的 Async 后缀,以及(通常)使用“await”语言特性。例如:

string value = "abcdefg";
await db.StringSetAsync("mykey", value);
...
string value = await db.StringGetAsync("mykey");
Console.WriteLine(value); // writes: "abcdefg"

执行后不理 的用法可以通过所有方法上的可选参数 CommandFlags flags (默认值为 null)来访问使用。
这种用法中,方法会立即方法一个默认值(所以通常返回一个 String 的方法总是返回 null,而一个通常返回一个 Int64 的方法总是返回 0)。
操作会在后台继续执行。这种情况的典型用例可能是增加页面浏览数量:

db.StringIncrement(pageKey, flags: CommandFlags.FireAndForget);

查看原文

More

作者水平有限,若有疏漏或错误还望提醒,十分感谢。

您可以在这里 提出问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 本文档翻译自 http://redis.io/topics/cluster-tutorial 。 本文档是 Red...
    会跳舞的机器人阅读 66,924评论 2 21
  • 配置 因为有很多不同配置 redis 的方式,StackExchange.Redis 提供了一个丰富的配置模型,当...
    天天向上卡索阅读 7,670评论 0 2
  • 繁雪荒凉满地 黑暗笼罩四周 心脏在跳动 寂寞在向我压来 只愿鲜血灼热 将孤单沸腾成气体
    天下沧海阅读 436评论 0 0
  • 正是那些往日时光 虽然穷得只剩下快乐 身上穿着旧衣裳 海拉尔多雪的冬天 传来三套车的歌唱 伊敏河旁温柔的夏夜 手风...
    薇糖糖糖阅读 560评论 0 0