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 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
大部分为意译,如有不当还请指正

转载于:https://www.cnblogs.com/ArvinZhao/p/6000823.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: StackExchange.Redis 是一个.NET平台下的开源Redis客户端库,它提供了一种高性能、稳定和易于使用的方式来与Redis服务器进行通信。它支持异步和同步操作,并提供了一些高级特性,如管道、发布/订阅等。 StackExchange.Redis 具有以下特点: - 快速:通过使用高性能、低级别的Redis通信协议,StackExchange.Redis 可以实现高效的数据访问。 - 可扩展性:StackExchange.Redis 支持分区功能,使它能够在多个Redis节点上分布数据,并且可以在需要时轻松地添加或删除节点。 - 可靠性:StackExchange.Redis 有一个内置的连接池来管理与Redis服务器的连接,从而可以提高性能和可靠性,并避免了频繁的连接/断开开销。 - 易用性:StackExchange.Redis 提供了一个简单的API,使得开发人员能够轻松地与Redis进行交互。 总的来说,如果你在.NET平台上使用RedisStackExchange.Redis 应该是你的首选。 ### 回答2: StackExchange.Redis 是一个基于Redis的 .Net客户端库,由StackExchange团队开发和维护。Redis内存数据库是非常流行的键值对存储,支持复杂数据结构,速度快,有完善的集群方案,在web应用程序、消息系统等应用场景中被广泛使用。 StackExchange.Redis提供了方便易用、高性能、可扩展的API,可以直接向Redis发送命令、订阅和发布消息、连接Redis集群等。他进一步扩展了Redis命令,使其更加简单易用,并支持事务、管道和多线程操作。同时,StackExchange.Redis支持Redis的高级特性,如SortedSet和Hash;而且,它还能够在运行时自动检测Redis服务状态,支持Redis Sentinel、Cluster和多节点环境。 此外,StackExchange.Redis还支持应用程序跟踪(application tracing),采用异步API调用,从而提高了性能和可伸缩性。与其他Redis客户端库不同,StackExchange.Redis实现了连接池、序列化和反序列化器等高级功能,使用起来更加方便和优雅,可以减少代码量和复杂性。 总的来说,StackExchange.Redis是一个很不错的Redis客户端库,它提供了强大而与Redis完全兼容的API,打破了语言壁垒,使得开发者可以在自己喜欢的语言环境(例如.Net)中使用 Redis 。 许多一流的公司如 StackOverflow和GitHub都使用 StackExchange.Redis,证明了它的可靠性和性能优势。 ### 回答3: StackExchange.RedisRedis数据库的一个适用于 .NET 编程语言的客户端。它提供了一组丰富的功能,用于在 .NET 框架内与Redis数据库进行交互。 StackExchange.Redis旨在为 .NET 开发人员提供最佳的Redis集成体验。StackExchange.Redis提供了许多优点,其中最主要的有: 高度优化的读写操作。StackExchange.Redis客户端库具有非常高的效率,用于从Redis服务器读取和写入数据时,可大大减少网络流量和延迟。这使得它成为处理高吞吐量负载的很好的选择。 支持许多复杂数据类型。除了提供基本的字符串和整数类型之外,StackExchange.Redis还支持许多复杂的数据类型,例如哈希表、排序集合和列表数据类型。这些数据类型将极大地帮助开发人员设计和实施高效的Redis应用程序。 易于使用和集成。StackExchange.Redis具有完美的适配性,可以很简单地与 .NET 中的 ASP.NET 应用程序、Windows 服务、控制台应用程序等相集成。此外,它具有丰富的文档、教程和API reference,可以让开发者轻松入手。 另外,StackExchange.Redis还包括许多其他特性,如:连接复用、事务支持、发布与订阅、管道等。这使得它成为在 .NET 编程语言中使用Redis数据库的非常好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值