1. 程式人生 > >StackExchange.Redis 官方文檔(一) Basics

StackExchange.Redis 官方文檔(一) Basics

pass abc ocs 維護 cpp ber mas msd nds

基本使用方法:

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

StackExchange.Redis 官方文檔(一) Basics