【譯】StackExchange.Redis中文使用文檔--基本使用

基本使用

StackExchange.Redis 中核心對象是在 StackExchange.Redis 命名空間中的 ConnectionMultiplexer 類,這個對象隱藏了多個服務器的詳細信息。
因為ConnectionMultiplexer要做很多事,它被設計為在調用者之間可以共享重用
你不應該在執行每一個操作的時候就創建一個 ConnectionMultiplexer. 它完全是線程安全的,并準備好這種用法(多線程)。
在后續所有的例子中,我們假設你有一個ConnectionMultiplexer類的實例保存以重用。
但現在,讓我們來先創建一個。 這是使用 ConnectionMultiplexer.ConnectConnectionMultiplexer.ConnectAsync 完成的,傳遞配置字符串或ConfigurationOptions 對象。
配置字符串可以采用逗號分隔的一系列節點的形式,所以讓我們在默認端口(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");

如果它發現兩個節點都是主節點,則可以可選地指定可以用于解決問題的仲裁密鑰,然而幸運地是這樣的條件是非常罕見的。

一旦你有一個 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(...) 結尾,并且完全是可以等待的 await 等。

最簡單的操作也許是存儲和檢索值:

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

需要注意的是,這里的 String... 前綴表示 redis 的 String 類型,盡管它和 .NET 的字符串類型 都可以保存文本, 它們還是有較大差別的。
然而,redis 還允許鍵和值使用原始的二進制數據,用法和字符串是一樣的:

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

覆蓋所有redis數據類型的所有 [redis數據庫命令](http://redis.io/commands)的都是可以使用的。

使用 redis 發布/訂閱

redis的另一個常見用法是作為 發布/訂閱消息分發工具;
這也很簡單,并且在連接失敗的情況下, ConnectionMultiplexer 將處理重新訂閱所請求的信道的所有細節。

ISubscriber sub = redis.GetSubscriber();

同樣,從 GetSubscriber 返回的對象是一個不需要存儲的低成本的通道對象。
發布/訂閱 API沒有數據庫的概念,但和之前一樣,我們可以選擇的提供一個異步狀態。
注意,所有訂閱都是全局的:它們不限于 ISubscriber 實例的生命周期。
redis中的 發布/訂閱 功能使用命名的“channels”; channels 不需要事先在服務器上定義(這里有一個有趣的用法是利用每個用戶的通知渠道類驅動部分的實時更新)
如在.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 實例是可以使用服務器命令的 Server commands,例如:

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

同步 vs 異步 vs 執行后不理

StackExchange.Redis有3種主要使用機制:

  • 同步 - 適用于操作在方法返回到調用者之前完成(注意,盡管這可能阻止調用者,但它絕對不會阻止其他線程:StackExchange.Redis的關鍵思想是它積極地與并發調用者共享連接)

  • Asynchronous - where the operation completes some time in the future, and a Task or Task<T> is returned immediately, which can later:

  • 異步 - 操作在將來完成一些時間,并且立即返回一個 Task 或 'Task<T>' 對象,也可以稍后再返回:

  • 是可以等待的(阻塞當前線程,直到響應可用) .Wait()

  • 可以增加一個后續的回調 (TPL 中的 ContinueWith)

  • awaited 可等待的(這是簡化后者的語言級特性,同時如果答復已經知道也立即繼續)

  • 執行后不理 - 適用于你真的對這個回復不感興趣,并且樂意繼續不管回應

同步的用法已經在上面的示例中展示了。這是最簡單的用法,并且不涉及 TPL

對于異步使用,關鍵的區別是方法名稱上的 Async 后綴,以及(通常)使用“await”語言特性。例如:

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

執行后不理 的用法可以通過所有方法上的可選參數 CommandFlags flags (默認值為 null)來訪問使用。
這種用法中,方法會立即方法一個默認值(所以通常返回一個 String 的方法總是返回 null,而一個通常返回一個 Int64 的方法總是返回 0)。
操作會在后臺繼續執行。這種情況的典型用例可能是增加頁面瀏覽數量:

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

查看原文

More

作者水平有限,若有疏漏或錯誤還望提醒,十分感謝。

您可以在這里 提出問題

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,825評論 18 139
  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會跳舞的機器人閱讀 66,954評論 2 21
  • 配置 因為有很多不同配置 redis 的方式,StackExchange.Redis 提供了一個豐富的配置模型,當...
    天天向上卡索閱讀 7,835評論 0 2
  • 繁雪荒涼滿地 黑暗籠罩四周 心臟在跳動 寂寞在向我壓來 只愿鮮血灼熱 將孤單沸騰成氣體
    天下滄海閱讀 452評論 0 0
  • 正是那些往日時光 雖然窮得只剩下快樂 身上穿著舊衣裳 海拉爾多雪的冬天 傳來三套車的歌唱 伊敏河旁溫柔的夏夜 手風...
    薇糖糖糖閱讀 568評論 0 0