zoukankan      html  css  js  c++  java
  • 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
    大部分为意译,如有不当还请指正

    转载:

    http://www.cnblogs.com/ArvinZhao/p/6000823.html

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/sunice/p/7100896.html
Copyright © 2011-2022 走看看