[Redis]用StackExchange來完成在.net裡的redis操作
前言
這篇想來記錄一下如何使用StackExchange來操作redis,然後記錄一些crud的操作,還有各種資料型態的對應。
導覽
我們可以直接使用網址來做連線,因為預設的port都是6379,所以如果不設定的話,就會照預設值,但值得注意的是,官方聲稱此連線最好是用分享並重用的,而不要去關閉它,所以當一個連線已開啟了,除非伺服器重新開啟,不然就一直保持此connection是連線的吧。
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
你也可以指定多個位址和多個port
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:3396,localhost:7799");
接著我們可使用此connection去取得database,並且直接塞個字串進redis,並取出來放在一個變數
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase(0);
db.StringSet("test1","this is test1");
var result=db.StringGet("test1");
接著來看一下用redis desktop manager這樣的快取資料會是長什麼樣子呢?
如果我們想修改這個key值的value呢?一樣對到同一個key值去set就行了,而刪除呢?就是把key刪除就行了
db.KeyDelete("test1");
string還有另一個比較常操作的api,就是Increment和Decrement,可以針對一個數值做遞增或遞減,比如說訪客人數的運用,第二個參數則是要遞增或遞減的數量,不指定的話預設就是1
db.StringIncrement("visitCount");
db.StringDecrement("visitCount");
這個在很多方法都可以看到這個參數,這個參數有很多的選項,比較常使用的則是類似不等待即回傳一個數值給我們,如果有些操作可能比較久,但我們又不想要等待,因為此結果對系統來說不是很重要的話,就可以如下方式去操作
db.StringIncrement("visitCount",1,CommandFlags.FireAndForget);
這個就有點像C#的HashSet,我們可以設定一個key值,然後裡面就只存放著這個key值的value,實際應用情境可以想像我們存進了一些queue的值,然後一筆一筆去消化,全部消化完這個key裡的value就都會全部清空,接著來看一下相關語法怎麼寫吧,首先是insert
db.SetAdd("event", "001");
db.SetAdd("event", "002");
db.SetAdd("event", "003");
接著我們取出資料,如下範例,就有點像用sql like的方式去取值,或者完全符合的也行
//* 取出全部
//00* 前面兩個字符合,在此一樣是取出全部
//*1* 取出001
//2* 取出002
//001 取出001
var result=db.SetScan("event","00*");
result.ToList().ForEach(x=>Console.WriteLine(x));
然後是刪除的部份
db.SetRemove("event","002");
最後來看一下這種資料由desktop manager顯示會是什麼樣子的呢,簡單來說我們可以存一些guid或session的快取資料
這個其實就很像dictionary的概念,我們可以存key值和一個value值,由於強迫是唯一key值的方式,所以效率也非常的快,簡單範例如下
db.HashSet("employee", new HashEntry[] {
new HashEntry("1","anson"),
new HashEntry("2","kin"),
new HashEntry("3","jacky"),
});
取出全部
db.HashGetAll("employee").ToList().ForEach(x=>Console.WriteLine(x));
取出某筆
db.HashGet("employee",2)
刪除某筆
db.HashDelete("employee",2).Dump();
修改資料
db.HashSet("employee",3,"anson");
來看一下HashSet在gui怎麼呈現吧
從後面新增
db.ListRightPush("company", "apple");
db.ListRightPush("company", "google");
從前面新增
db.ListLeftPush("company","microsoft");
取得全部
db.ListRange("company").ToList().ForEach(d => Console.WriteLine(d));
這邊也可以by index去設區間,比方說如下
db.ListRange("company",0,1).ToList().ForEach(d => Console.WriteLine(d));
或者用index去搜尋某筆
db.ListGetByIndex("company",0)
從後刪除
db.ListRightPop("company");
從前面刪除
db.ListLeftPop("company");
刪除資料用指定的方式
db.ListRemove("company","apple");
最後來看一下list的gui顯示,是跟set很像的,但差異點是list可以輸入重覆的值,但set不行,所以list放log就會很合適,舉例一些會重覆的值都可以是比較適合放在list裡面的。