• 基本用法


    基本用法

    ConnectionMultiplexer 类是StackExchange.Redis的中枢对象,它在StackExchange.Redis名称空间中; 这个对象封装了很多基础服务对象的详细信息。由于 ConnectionMultiplexer 做了很多底层处理,它在调用者之间被设计为共享和重用。你不应该为每一个操作都创建一个 ConnectionMultiplexer 对象。该对象是完全线程安全的。在随后所有的示例中,ConnectionMultiplexer 被假定成一个存储起来且可供重用的对象。 现在,让我们来创建一个。我们可以使用ConnectionMultiplexer.Connect 或者 ConnectionMultiplexer.ConnectAsync 并且传递一个配置字符串或者ConfigurationOptions 对象来完成创建。配置字符串可以被逗号分隔成一系列的节点形式,让我们在本地机器上使用默认端口 6379 来连接到一个实例。

    using StackExchange.Redis;
    ...
    ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
    // ^^^ 存储并重用该对象
    

    注意:ConnectionMultiplexer 实现了 IDisposable 接口,当不在需要的时候,我们可以释放它。但是,我故意不显示的使用using 语句。由于该对象是一个很耗费资源的对象,因此最好是重用该对象。

    一个更复杂的场景可能涉及到主/从服务的设定。对于这种用法,只需要简单的设定一个连接字符串,该字符串包含主从服务器。(它能够自动的识别出主服务器)

    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结尾,并且全部都是可等待的。

    最简单的操作是存储并且取回一个值:

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

    注意:String前缀表示的是Redis的String类型,并且它与.Net的Sting类型在很大程度上是不同的。尽管这两者都能存储文本数据。 然而,redis允许Key和Value都为原生的字节数据。示例如下:

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

    Redis数据库命令所覆盖的Redis数据类型都是可用的。

    使用Redis发布/订阅功能

    Redis另一个常用的功能是作为发布/订阅消息的分发工具;这也是很简单的, 在连接失败时,ConnectionMultiplexer 将会处理所有的重订阅细节。

    ISubscriber sub = redis.GetSubscriber();
    

    GetSubscriber 返回了一个不需要存储的廉价对象。 发布/订阅API没有数据库的概念,但正如之前所提到的,我们可以提供一个异步状态(async-state)。注意:所有的订阅都是全局的。它们不局限于 ISubscriber 的生命周期。发布订阅功能在Redis中叫做通道"channels";通道不需要预先定义在服务器上(一个令人关注的使用是每个用户的通知通道,例如:Stack Overflow 实时驱动更新部分)。这在.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 的服务器端命令都是可用的;例如:

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

    同步 VS 异步 VS 即发即弃

    在StackExchange.Redis中,有3个主要的使用机制:

    • 同步 - 在操作完成之前方法会返回给调用者(注意:尽管这可能会阻塞调用者,但是决不会阻塞其他线程;StackExchange.Redis的关键理念就是它积极共享并发调用方之间的连接)

    • 异步 - 操作将在未来的某个时间完成,并且以 Task 或者 Task<T> 类型立即返回;可以用以下方式实现:

      • 使用 Wait 方法 (阻塞当前线程直到响应可用)
      • 使用 ContinueWith 方法(添加一个延续性的回调函数)
      • 使用 await 运算符 (这是一个简化之后的语言级功能)
    • 即发即弃 - 对答复不感兴趣并且乐于忽略响应

    从上面我们看到了同步使用的例子,这是最简单的使用,并且不涉及TPL

    对于异步使用,关键的区别是方法后缀 Async,并且使用 awiat 运算符。例如:

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

    在所有的方法中,使用即发即弃访问是通过可选参数 CommandFlags flags (默认是传入该参数)来实现的。这样使用时,方法会立即返回默认值(因此通常返回一个字符串的方法会一直返回 null,而返回一个 Int64 方法会一直返回0)。该操作将会在后台继续执行。一个典型的用例是页面点击率统计:

    db.StringIncrement(pageKey, flags: CommandFlags.FireAndForget);
  • 相关阅读:
    delphi string.split 按照任意字符串分割语句
    学习 TTreeView [16]
    学习 TTreeView [15]
    delphi TClientDatset资料
    delphi7 clientdataset 详解
    为TMenuItem增加指针Data属性
    构建一个用于产品介绍的WEB应用
    图片延迟加载技术-Lazyload的应用
    你想不到的压缩方法:将javascript文件压缩成PNG图像存储
    如何更快速加载你的JS页面
  • 原文地址:https://www.cnblogs.com/carldai/p/5496903.html
Copyright © 2020-2023  润新知