C# StackExchange.Redis 簡單使用

來源:互聯網
上載者:User

標籤:類型   順序   style   get   env   建立   ble   直接   需要   

安裝 StackExchange.Redis

在 NuGet 中搜尋 StackExchange.Redis 和 Newtonsoft.Json,直接點擊按鈕安裝即可。

StackExchange.Redis 是 C# 操作 Redis 資料庫的用戶端。

Newtonsoft.Json 用來序列化 Josn 字串及還原序列化拿到對象。

引用及初始化

引用

using StackExchange.Redis;using Newtonsoft.Json;

初始化 redis

ConnectionMultiplexer _conn = RedisConnectionHelp.Instance;//初始化var database = _conn.GetDatabase(0);//指定串連的庫 0
String(字串)

String 是最常用的一種資料類型,普通的 key/value 儲存都可以歸為此類 。

一個 Key 對應一個 Value,string 類型是二進位安全的。Redis 的 string 可以包含任何資料,比如 jpg 圖片(產生二進位)或者序列化的對象。

database.StringSet("name", "蒼");//設定StringSet(key, value)string str = database.StringGet("name");//結果:蒼database.StringSet("name_two", str, TimeSpan.FromSeconds(10));//設定時間,10s後到期。

存對象(對象需要序列化轉成字串,再存進庫中)

取對象(還原序列化)

//建立對象Demo demo = new Demo(){    Name = "蒼",    Age = 18,    Height = 1.83};string demojson = JsonConvert.SerializeObject(demo);//序列化database.StringSet("model", demojson);string model = database.StringGet("model");demo = JsonConvert.DeserializeObject<Demo>(model);//還原序列化

StringIncrement 增量、StringDecrement 減量(預設值同為1)

double increment = 0;double decrement = 0;for (int i = 0; i < 3; i++){    increment = database.StringIncrement("StringIncrement", 2);//增量,每次+2}for (int i = 0; i < 3; i++){    decrement = database.StringDecrement("StringIncrement");//減量,每次-1}
List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以添加一個元素到列表的頭部或者尾部。

一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過 40 億個元素)。

for (int i = 0; i < 10; i++){    database.ListRightPush("list", i);//入隊,先進先出,這裡是從底部插入資料}for (int i = 10; i < 20; i++){    database.ListLeftPush("list", i);//入棧,先進後出,這裡是從頂部插入資料}var length = database.ListLength("list");//長度 20var rightPop = database.ListRightPop("list");//出隊,這裡是從底部拿出資料

var leftpop = database.ListLeftPop("list");//出棧,這裡是從頂部拿出資料

var list = database.ListRange("list");

Hash(雜湊)

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於儲存物件。相對於將對象的每個欄位存成單個 string 類型。一個Object Storage Service在 hash 類型中會佔用更少的記憶體,並且可以更方便的存取整個對象。

Redis 中每個 hash 可以儲存 232 - 1 索引值對(40多億)。

Hash 的儲存,給我的感覺類似於關係型資料庫。以下面的例子為例,儲存一個 user 對象(關係型資料庫裡的表名), cang、shan、yun (關係型資料庫裡的資料的主鍵、唯一值),json(欄位)

string json = JsonConvert.SerializeObject(demo);//序列化database.HashSet("user", "cang", json);database.HashSet("user", "shan", json);database.HashSet("user", "yun", json);
//擷取Modelstring hashcang = database.HashGet("user", "cang");demo = JsonConvert.DeserializeObject<Demo>(hashcang);//還原序列化//擷取ListRedisValue[] values = database.HashValues("user");//擷取所有valueIList<Demo> demolist = new List<Demo>();foreach (var item in values){ Demo hashmodel = JsonConvert.DeserializeObject<Demo>(item); demolist.Add(hashmodel);}
發布訂閱

Redis 發布訂閱 (pub/sub) 是一種訊息通訊模式,可以用於訊息的傳輸,Redis 的發布訂閱機制包括三個部分,發行者,訂閱者和 Channel。適宜做線上聊天、訊息推送等。

發行者和訂閱者都是 Redis 用戶端,Channel 則為 Redis 伺服器端,發行者將訊息發送到某個的頻道,訂閱了這個頻道的訂閱者就能接收到這條訊息,用戶端可以訂閱任意數量的頻道。

ISubscriber sub = _conn.GetSubscriber();//訂閱 Channel1 頻道sub.Subscribe("Channel1", new Action<RedisChannel, RedisValue>((channel, message) =>{    Console.WriteLine("Channel1" + " 訂閱收到訊息:" + message);}));for (int i = 0; i < 10; i++){    sub.Publish("Channel1", "msg" + i);//向頻道 Channel1 發送資訊    if (i == 2)    {        sub.Unsubscribe("Channel1");//取消訂閱    }}

因為當 i == 2 的時候取消訂閱,所以收到的訂閱訊息只有3條。

事務

事物開啟後,會在調用 Execute 方法時把相應的命令操作封裝成一個請求發送給 Redis 一起執行。

這裡通過 CreateTransaction 函數(multi)來建立一個事物,調用其 Execute 函數(exec)提交事物。

其中的 "Condition.StringEqual("name", name)" 就相當於 Redis 命令中的 watch name。

string name = database.StringGet("name");string age = database.StringGet("age");var tran = database.CreateTransaction();//建立事物tran.AddCondition(Condition.StringEqual("name", name));//樂觀鎖tran.StringSetAsync("name", "海");tran.StringSetAsync("age", 25);database.StringSet("name", "Cang");//此時更改 name 值,提交事物的時候會失敗。bool committed = tran.Execute();//提交事物,true成功,false復原。

因為提交事物的過程中,name 值被修改,所以造成了復原,所有給 name 賦值海,age 賦值25都失敗了。

Batch 大量操作

batch 會把所需要執行的命令打包成一條請求發到 Redis,然後一起等待返回結果。減少網路開銷。

var batch = database.CreateBatch();//批量寫Task t1 = batch.StringSetAsync("name", "羽");Task t2 = batch.StringSetAsync("age", 22);batch.Execute();Task.WaitAll(t1, t2);Console.WriteLine("Age:" + database.StringGet("age"));Console.WriteLine("Name:" + database.StringGet("name"));            //批量寫for (int i = 0; i < 100000; i++){    batch.StringSetAsync("age" + i, i);}batch.Execute();//批量讀List<Task<RedisValue>> valueList = new List<Task<RedisValue>>();for (int i = 0; i < 10000; i++){    Task<RedisValue> tres = batch.StringGetAsync("age" + i);    valueList.Add(tres);}batch.Execute();foreach (var redisValue in valueList){string value = redisValue.Result;//取出對應的value值}
Lock(分布式鎖)

由於 Redis 是單執行緒模式,命令操作原子性,所以利用這個特性可以很容易的實現分布式鎖。

RedisValue token = Environment.MachineName;//lock_key表示的是redis資料庫中該鎖的名稱,不可重複。 
//token用來標識誰擁有該鎖並用來釋放鎖。
//TimeSpan表示該鎖的有效時間。10秒後自動釋放,避免死結。if (database.LockTake("lock_key", token, TimeSpan.FromSeconds(10))){ try { //TODO:開始做你需要的事情 Thread.Sleep(5000); } finally { database.LockRelease("lock_key", token);//釋放鎖 }}
StackExchange.Redis 封裝

連結: https://pan.baidu.com/s/1rT9z567MVtfzQtnvdUxffw 密碼: 5k1b

環境:vs2013 + .NET framework 4.5

C# StackExchange.Redis 簡單使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.