[Redis]用StackExchange來完成在.net裡的redis操作

[Redis]用StackExchange來完成在.net裡的redis操作

前言

這篇想來記錄一下如何使用StackExchange來操作redis,然後記錄一些crud的操作,還有各種資料型態的對應。

導覽

  1. 連線和操作string
  2. CommandFlags的參數設定
  3. Sets Datatype
  4. HashSet
  5. List

連線和操作string

我們可以直接使用網址來做連線,因為預設的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");

CommandFlags的參數設定

這個在很多方法都可以看到這個參數,這個參數有很多的選項,比較常使用的則是類似不等待即回傳一個數值給我們,如果有些操作可能比較久,但我們又不想要等待,因為此結果對系統來說不是很重要的話,就可以如下方式去操作

db.StringIncrement("visitCount",1,CommandFlags.FireAndForget);

Sets Datatype

這個就有點像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的快取資料

HashSet

這個其實就很像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怎麼呈現吧

List

從後面新增

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裡面的。