基本使用方法:

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 or Task<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 返回nullInt64返回0)。操作将会在后台继续执行。典型的使用方式是增加浏览页数

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

原文地址StackExchange.Redis

大部分为意译,如有不当还请指正

StackExchange.Redis 官方文档(一) Basics的更多相关文章

  1. StackExchange.Redis 官方文档

    原文:StackExchange.Redis 官方文档 时隔多年的翻译终于完成了第六个,也是很重要的的官方文档,是介绍有关链接管理,管道流水线和多路复用的 官方地址在这里:官方文档 下面做个汇总: S ...

  2. StackExchange.Redis 官方文档(六) PipelinesMultiplexers

    原文:StackExchange.Redis 官方文档(六) PipelinesMultiplexers 流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在 ...

  3. StackExchange.Redis 官方文档(五) Keys, Values and Channels

    原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...

  4. StackExchange.Redis 官方文档(四) KeysScan

    KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...

  5. StackExchange.Redis 官方文档(三) Events

    事件 ConnectionMultiplexer类型提供了很多可以用来了解表面状态下正在发生着什么的事件.这对日志是很有用的. ConfigurationChanged - ConnectionMul ...

  6. StackExchange.Redis 官方文档(二) Configuration

    配置 有多种方式可以配置redis,StackExchange.Redis提供了一个丰富的配置模型,在执行Connect (or ConnectAsync) 时被调用: var conn = Conn ...

  7. Redis官方文档》持久化

    原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...

  8. Redis官方文档资源

    官方文档: 如果要深入研究时,官方提供的文档是最权威的. 英文: https://redis.io/documentation 中文: http://www.redis.cn/documentatio ...

  9. 《Redis官方文档》用Redis构建分布式锁

    用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...

随机推荐

  1. AI 人工智能 探索 (十)

    呼叫事件图形结构如下 蓝色代表 警察局 红色代表警察 黄色代表 死亡人 蓝色球代表呼救人 黑色代表 敌人 警察目标是 攻击 黑色人,但 路中 会碰到 黄色人,如果警察有 救人功能 则会先救人去医院再看 ...

  2. hdu 3345 War Chess

    War Chess Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  3. heartbeat集群安装配置

    安装配置高可用集群需要注意:1.节点名称:集群每个节点的名称都得能互相解析 /etc/hosts hosts主机名的正反解析结果必须跟"uname -n"的结果保持一致2.时间必须 ...

  4. hdu_5726_GCD(线段树维护区间+预处理)

    题目链接:hdu_5726_GCD 题意: 给你n个数(n<=1e5)然后m个询问(m<=1e5),每个询问一个区间,问你这个区间的GCD是多少,并且输出从1到n有多少个区间的GCD和这个 ...

  5. ADB shell出现error:device offline提示

    解决办法: 1.adb kill-server 2.adb start-server 3.adb remount执行这3个命令然后重新键入adb shell应该就可以了

  6. 草,又学了个新命令,nc传文件。

    nc -l 5222 > aa nc 192.168.0.48 5222 < a http://www.linuxso.com/command/nc.html

  7. Android开源项目收集

    软件名:gaeproxy软件作用:Android手机配置GoAgentFQ.项目地址:https://github.com/madeye/gaeproxy.git 软件名:ProxyDroid软件作用 ...

  8. Linux 互斥锁的实现原理(pthread_mutex_t)

    本文参考--http://www.bitscn.com/os/linux/201608/725217.html 和http://blog.csdn.net/jianchaolv/article/det ...

  9. DNS与获取

    今天翻看twitter的源码的时候看到了一下内容: <link rel=”dns-prefetch” href=”http://a0.twimg.com”/> <link rel=” ...

  10. gcd timer

    //0.创建队列 dispatch_queue_t queue = dispatch_get_global_queue(, ); NSLog(@"%s",__func__); // ...