StackExchange.Redis 官方文档(一) Basics
基本使用方法:
StackExchange.Redis的核心是 StackExchange.Redis
命名空间的 ConnectionMultiplexer
类;它隐藏了多服务器的实现细节.ConnectionMultiplexer
被设计成可以在多个客户端之间分享和复用.不用每次操作都创建一个对象实例.对于这种使用方式,它是足够的线程安全和完备的.以后所有的示例都会假设已经创建了一个 ConnectionMultiplexer
实例对象,并且可以存储出来以备复用.但是现在,我们需要创建一个ConnectionMultiplexer
实例对象。使用 ConnectionMultiplexer.Connect
或者 ConnectionMultiplexer.ConnectAsync
方法,参数可以是一个配置字符串,也可以是一个 ConfigurationOptions
对象.配置字符串采用一系列被逗号分隔的节点的组成形式.接下来链接本地redis服务器的默认端口(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");
如果发现两个节点都是master,可以指定一个tie-beaker key来解决这个问题,当然这种情况是很少见的。
当你有一个 ConnectionMultiplexer
,你可能想要做的事:
- 连接到redis数据库(注意:在集群的情况下,一个逻辑数据库可以分布到多个节点服务器上)
- 使用redis的pub/sub功能
- 为了维护/监控需要连接到单个的服务器
使用redis数据库
连接数据库的方法:
IDatabase db = redis.GetDatabase();
GetDatabase
返回一个 cheap pass-thru 对象,不需要存储起来(类似于静态化?)。注意 redis 支持多数据库(非集群状态下);在调用此方法时可以指定特定的数据库,同样适用于异步调用:
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...
前缀指的是String redis type,和 .NET String type 有很大的不同,尽管两者都可以存储字符串。另外,redis的key和value都支持二进制数据-使用方法完全相同:
byte[] key = ..., value = ...;
db.StringSet(key, value);
...
byte[] value = db.StringGet(key);
支持redis所有的redis database commands和所有的数据类型。
使用Redis的 pub/sub(发布/订阅)
另外一种较为常用的Redis使用方式是把它作为一种pub/sub message工具:使用方法同样很简单,当链接出现错误时,ConnectionMultiplexer
会处理重新订阅频道所有的工作。
ISubscriber sub = redis.GetSubscriber();
同样的, GetSubscriber
返回的是一个 cheap pass-thru 对象并且不需要存储起来。pub/sub API 没有数据库的概念,同样支持异步状态。注意所有的订阅是全局的:他们的生存周期不会限制于 ISubscriber
对象的生存周期。发布/订阅的是"channels"(频道):channels不需要在在服务器上提前订阅(一种有意思的使用方式是作为一种个人通知类似的东西,Stack Overflow实时更新的部分实现就是用这个做出来的)。和在 .NET 相似,发布采用回调委托的形式,参数是channel-name和message:
sub.Subscribe("messages", (channel, message) => {
Console.WriteLine((string)message);
});
此时,在另外一个客户端你可以对这个频道发布消息:
sub.Publish("messages", "hello");
几乎会在同时你会在订阅的客户端打印出 "hello"
.频道名称和小心支持而进制数据。
其它的功能,请参考Pub / Sub Message Order
链接特定的服务器
维护时,有时有必要使用到特定的服务器命令:
IServer server = redis.GetServer("localhost", 6379);
GetServer
使用的参数可以是一个 EndPoint
或者是一对 name/value 来区分不同的服务器。方法返回的对象不要存储,支持异步。此外可以使用如下方法获取到所有的endpoints:
EndPoint[] endpoints = redis.GetEndPoints();
服务器命令详见Server commands,例如:
DateTime lastSave = server.LastSave();
ClientInfo[] clients = server.ClientList();
同步 vs 异步 vs Fire-and-Forget
StackExchange.Redis 三种主要的使用机制:
- 同步的 - 操作在方法返回客户端之前完成(注意这样会阻塞客户端,但是不会阻塞其他线程:StackExchange.Redis的核心思想是在并发的客户端之间分享链接)
- 异步的 - 操作在将来的某个时刻完成,并且马上会返回一个
Task
orTask<T>
,之后可以进行的操作:
- be
.Wait()
ed (阻塞当前线程直到得到返回结果)- 使用(
ContinueWith
in the TPL(任务并行库)) 添加回调函数- be awaited (简化后者的语法功能,当收到回复之后继续执行下面的语句)
- Fire-and-Forget - 不在意返回结果,得到一个类型的默认结果
同步的使用方法在上面例子当中已经给出,这只是最简单的使用方法,并且不会涉及到TPL
对于异步的使用方法,最主要的区别是方法添加了 Async
后缀,并且可以await
的语法功能,举个例子来说:
string value = "abcdefg";
await db.StringSetAsync("mykey", value);
...
string value = await db.StringGetAsync("mykey");
Console.WriteLine(value); // writes: "abcdefg"
fire-and-forget的使用方式是所有方法当中的可选参数 CommandFlags flags
。使用这种方式将会立即得到一个默认的放回结果(String
返回null
,Int64
返回0
)。操作将会在后台继续执行。典型的使用方式是增加浏览页数
db.StringIncrement(pageKey, flags: CommandFlags.FireAndForget);
原文地址:StackExchange.Redis
大部分为意译,如有不当还请指正
StackExchange.Redis 官方文档(一) Basics的更多相关文章
- StackExchange.Redis 官方文档
原文:StackExchange.Redis 官方文档 时隔多年的翻译终于完成了第六个,也是很重要的的官方文档,是介绍有关链接管理,管道流水线和多路复用的 官方地址在这里:官方文档 下面做个汇总: S ...
- StackExchange.Redis 官方文档(六) PipelinesMultiplexers
原文:StackExchange.Redis 官方文档(六) PipelinesMultiplexers 流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在 ...
- StackExchange.Redis 官方文档(五) Keys, Values and Channels
原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...
- StackExchange.Redis 官方文档(四) KeysScan
KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...
- StackExchange.Redis 官方文档(三) Events
事件 ConnectionMultiplexer类型提供了很多可以用来了解表面状态下正在发生着什么的事件.这对日志是很有用的. ConfigurationChanged - ConnectionMul ...
- StackExchange.Redis 官方文档(二) Configuration
配置 有多种方式可以配置redis,StackExchange.Redis提供了一个丰富的配置模型,在执行Connect (or ConnectAsync) 时被调用: var conn = Conn ...
- Redis官方文档》持久化
原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...
- Redis官方文档资源
官方文档: 如果要深入研究时,官方提供的文档是最权威的. 英文: https://redis.io/documentation 中文: http://www.redis.cn/documentatio ...
- 《Redis官方文档》用Redis构建分布式锁
用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...
随机推荐
- lucene中Field.Index,Field.Store的一些设置
lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZE ...
- POJ 1365 Prime Land(整数拆分)
题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致. 思路:素数打表以后正常拆分即可. ...
- cocos2d CCLOG格式符号表
使用示例: CCLOG(); CCLOG(, 650000L); CCLOG(); CCLOG(); CCLOG(, , , , ); CCLOG("Floats: %4.2f %.0e % ...
- Linux学习 -- 文件系统管理
1 分区和文件系统 分区类型 主分区:<= 4个 扩展分区:只能有一个,也算主分区的一种 不能存储数据和格式化,只能用来包含逻辑分区 逻辑分区:扩展分区中划分的 IDE--最多59个 ...
- 转:LoadRunner常用函数列表
Web相关函数 函 数 功 能 描 述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击图片操作的函数 web_link ...
- PAT1014
Suppose a bank has N windows open for service. 一个银行有N个服务的窗口 There is a yellow line in front of the w ...
- iOS触摸事件深入
转载自:http://www.cnblogs.com/wengzilin/p/4720550.html 概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分 ...
- kali系统安装
kali live 安装到U盘 http://www.backtrack.org.cn/thread-17197-1-1.html 用Live U盘安装Kali Linux http://cn.doc ...
- IMCP网际控制协议
IP协议是TCP/IP协议使用的在网络层传输机制,它是一种不可靠的无连接的数据报协议,但是IP协议假定了底层是不可靠的,因此,要尽最大的努力传输到目的地,但正因为如此,IP协议则没有了保证,也就是说, ...
- FatMouse's Speed 基础DP
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...