C#?StackExchange.Redis?用法匯總
安裝StackExchange.Redis
在 NuGet 中搜索StackExchange.Redis 和 Newtonsoft.Json,直接點(diǎn)擊按鈕安裝即可。
StackExchange.Redis 是 C# 操作 Redis 數(shù)據(jù)庫的客戶端。
Newtonsoft.Json 用來序列化 Josn 字符串及反序列化拿到對(duì)象。
引用及初始化
引用
using StackExchange.Redis; using Newtonsoft.Json;
初始化 redis
ConnectionMultiplexer _conn = RedisConnectionHelp.Instance;//初始化 var database = _conn.GetDatabase(0);//指定連接的庫 0
String(字符串)
String 是最常用的一種數(shù)據(jù)類型,普通的 key/value 存儲(chǔ)都可以歸為此類。
一個(gè) Key 對(duì)應(yīng)一個(gè) Value,string 類型是二進(jìn)制安全的。Redis 的 string 可以包含任何數(shù)據(jù),比如 jpg 圖片(生成二進(jìn)制)或者序列化的對(duì)象。
database.StringSet("name", "蒼");//設(shè)置StringSet(key, value) string str = database.StringGet("name");//結(jié)果:蒼 database.StringSet("name_two", str, TimeSpan.FromSeconds(10));//設(shè)置時(shí)間,10s后過期。
存對(duì)象(對(duì)象需要序列化轉(zhuǎn)成字符串,再存進(jìn)庫中)
取對(duì)象(反序列化)
//創(chuàng)建對(duì)象 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 減量(默認(rèn)值同為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 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部或者尾部。
一個(gè)列表最多可以包含 232 - 1 個(gè)元素 (4294967295, 每個(gè)列表超過 40 億個(gè)元素)。
for (int i = 0; i < 10; i++) { database.ListRightPush("list", i);//從底部插入數(shù)據(jù) } for (int i = 10; i < 20; i++) { database.ListLeftPush("list", i);//從頂部插入數(shù)據(jù) } var length = database.ListLength("list");//長度 20 var rightPop = database.ListRightPop("list");//從底部拿出數(shù)據(jù)var leftpop = database.ListLeftPop("list");//從頂部拿出數(shù)據(jù)var list = database.ListRange("list");
Hash(哈希)
Redis hash 是一個(gè) string 類型的 field 和 value 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象。相對(duì)于將對(duì)象的每個(gè)字段存成單個(gè) string類型。一個(gè)對(duì)象存儲(chǔ)在 hash 類型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。
Redis 中每個(gè) hash 可以存儲(chǔ) 232- 1 鍵值對(duì)(40多億)。
Hash 的存儲(chǔ),給我的感覺類似于關(guān)系型數(shù)據(jù)庫。以下面的例子為例,存儲(chǔ)一個(gè) user 對(duì)象(關(guān)系型數(shù)據(jù)庫里的表名), cang、shan、yun (關(guān)系型數(shù)據(jù)庫里的數(shù)據(jù)的主鍵、唯一值),json(字段)
string json = JsonConvert.SerializeObject(demo);//序列化 database.HashSet("user", "cang", json); database.HashSet("user", "shan", json); database.HashSet("user", "yun", json); //獲取Model string hashcang = database.HashGet("user", "cang"); demo = JsonConvert.DeserializeObject<Demo>(hashcang);//反序列化 //獲取List RedisValue[] values = database.HashValues("user");//獲取所有value IList<Demo> demolist = new List<Demo>(); foreach (var item in values) { Demo hashmodel = JsonConvert.DeserializeObject<Demo>(item); demolist.Add(hashmodel); }
發(fā)布訂閱
Redis 發(fā)布訂閱 (pub/sub) 是一種消息通信模式,可以用于消息的傳輸,Redis 的發(fā)布訂閱機(jī)制包括三個(gè)部分,發(fā)布者,訂閱者和 Channel。適宜做在線聊天、消息推送等。
發(fā)布者和訂閱者都是 Redis 客戶端,Channel 則為 Redis 服務(wù)器端,發(fā)布者將消息發(fā)送到某個(gè)的頻道,訂閱了這個(gè)頻道的訂閱者就能接收到這條消息,客戶端可以訂閱任意數(shù)量的頻道。
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 發(fā)送信息 if (i == 2) { sub.Unsubscribe("Channel1");//取消訂閱 } }
因?yàn)楫?dāng) i == 2 的時(shí)候取消訂閱,所以收到的訂閱消息只有3條。
事務(wù)
事物開啟后,會(huì)在調(diào)用 Execute 方法時(shí)把相應(yīng)的命令操作封裝成一個(gè)請求發(fā)送給 Redis 一起執(zhí)行。
這里通過 CreateTransaction 函數(shù)(multi)來創(chuàng)建一個(gè)事物,調(diào)用其 Execute 函數(shù)(exec)提交事物。
其中的 "Condition.StringEqual("name", name)" 就相當(dāng)于 Redis 命令中的 watch name。
string name = database.StringGet("name"); string age = database.StringGet("age"); var tran = database.CreateTransaction();//創(chuàng)建事物 tran.AddCondition(Condition.StringEqual("name", name));//樂觀鎖 tran.StringSetAsync("name", "海"); tran.StringSetAsync("age", 25); database.StringSet("name", "Cang");//此時(shí)更改 name 值,提交事物的時(shí)候會(huì)失敗。 bool committed = tran.Execute();//提交事物,true成功,false回滾。
因?yàn)樘峤皇挛锏倪^程中,name 值被修改,所以造成了回滾,所有給 name 賦值海,age 賦值25都失敗了。
Batch 批量操作
batch 會(huì)把所需要執(zhí)行的命令打包成一條請求發(fā)到 Redis,然后一起等待返回結(jié)果。減少網(wǎng)絡(luò)開銷。
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;//取出對(duì)應(yīng)的value值 }
Lock(分布式鎖)
由于 Redis 是單線程模型,命令操作原子性,所以利用這個(gè)特性可以很容易的實(shí)現(xiàn)分布式鎖。
RedisValue token = Environment.MachineName; //lock_key表示的是redis數(shù)據(jù)庫中該鎖的名稱,不可重復(fù)。 //token用來標(biāo)識(shí)誰擁有該鎖并用來釋放鎖。//TimeSpan表示該鎖的有效時(shí)間。10秒后自動(dòng)釋放,避免死鎖。 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/17Yh2L_57SJfOvo8Vxj504w 提取碼: tcw3
環(huán)境:vs2013 +.NET framework 4.5
相關(guān)文章:
Redis 可視化工具 Redis Desktop Manager
到此這篇關(guān)于C# StackExchange.Redis 用法總結(jié)的文章就介紹到這了,更多相關(guān)C# StackExchange.Redis 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ScriptControl控件執(zhí)行自定義VBS腳本示例分析
這篇文章主要介紹ScriptControl控件 msscript.ocx msscript.oca執(zhí)行自定義VBS腳本的示例代碼,需要的朋友可以參考下2013-04-04