鍵 值以及通道

2022-10-10 14:48:10 字數 2606 閱讀 7283

在對待redis時候,鍵和其他的事物之間有個相當重要的區別。鍵是在資料庫中一段資料的唯一標識(可能string,list,hash或者其他的redis資料型別)。鍵是沒有任何實質意義,就是乙個簡單的名字。進一步說:當處理集群或者分片系統時,它就是定義在包含資料的節點上的key,所以對於命令傳送來說key是至關重要的。

值是相對於鍵來儲存的。要麼是單個(string資料)要麼一組組的。值不會影響命令的傳送(注意:除了sort命令,並且該命令與by或者get組合使用的時候,但是這個真的很難解釋說明;詳細可以去看redis的sort命令文件)。值通常會被redis以操作為目的來解讀:

關鍵點在於api需要明白什麼是key和什麼是value。這個涉及到stackexchange.redis的api,但是大多數時候你根本不需要知道這個。

當你在使用發布/訂閱時,我們是使用通道來處理的;通道不影響到命令傳送(所以它們不是keys),但是這與常規值是區別巨大的,所以應該分別考慮。

stackexchange.redis中鍵的型別是 rediskey。不過好在它會隱式的從 string 和 byte 轉換,允許使用文字和二進位制鍵。例如:stringincrement 方法將 rediskey 作為第乙個引數,但是你不需要自己去做轉換,例如:

string key = ...

db.stringincrement(key);

或者

byte key = ...

db.stringincrement(key);

同樣的,有一些方法能夠返回 rediskey 型別的key;如下所示:

string somekey = db.keyrandom();

stackexchange.redis中的值的型別是 redisvalue。與 rediskey 一樣,它也可以隱式轉換;這意味著你大多數時候都看不到該型別,例如:

db.stringset("mykey", "myvalue");

然而,除了文字和二進位制內容外,值還可以被表示為其他原生型別,如:int32, int64, double, boolean。正因為如此,redisvalue 提供了大量的隱式轉換支援,而 rediskey 則沒有這麼多:

db.stringset("mykey", 123); // 這仍舊是乙個rediskey 和 redisvalue

...int i = (int)db.stringget("mykey");

注意:從原生型別到 redisvalue 的轉換都是隱式的,但是從 redisvalue 轉換為原生型別是顯示轉換:如果資料沒有乙個適當的值,這些轉換很有可能會失敗。

注意:當值是數值型別時,redis去獲取乙個不存在(no-existent)的鍵值時,該值會以數值0返回;為了一致性,nil響應被視作為0:

db.keydelete("abc");

int i = (int)db.stringget("abc"); // 這個會被作為0返回

如果你需要檢測nil條件,那麼你可以這樣做:

db.keydelete("abc");

var value = db.stringget("abc");

bool isnil = value.isnull; // 這個表示真

或者這樣做更簡單,使用 nullable:

db.keydelete("abc");

var value = (int?)db.stringget("abc"); // 正如你所期望的,會返回空

由於雜湊表中的欄位名不會影響到命令的傳送,他們也不是key,但是文字和二進位制可以作為名字使用;因此它們被視作為值。

發布/訂閱所使用的管道名字的型別是 redischannel;大致上來說和 rediskey 相同,但是被獨立處理的,因為管道名稱是頭等公民,它們不會影響命令的傳輸。

redis中的lua指令碼有兩個值得注意的特性:

由於這個原因,scriptevaluate 方法接受兩個單獨的輸入陣列:乙個是作為key的 rediskey,乙個是作為value的redisvalue (兩個都是可選的,如果省略則被假定為空)。這可能是少數幾次中的一次你真的需要在你的**中輸入rediskey或redisvalue,而這只是因為陣列變數的規則決定的。

var result = db.scriptevaluate(transferscript,

new rediskey , new redisvalue );

transferscript 是一些包含lua的字串,在這個例子中不會展示

響應使用型別的是 redisresult (這是指令碼所獨有的,通常api會試圖盡可能直接和清晰的表示響應)。之前,redisresult 提供了一系列的轉換操作,甚至超過了 redisvalue,因為除了被解釋為文字,二進位制,原生型別以及可空型別,響應也可以被解釋為陣列,例如:

string items = db.scriptevaluate(...);

api中使用的型別是非常刻意的被選擇的,以便區分redis的key和value。然而,幾乎在所有情況下,你不需要直接引用所涉及的基礎型別,預設提供了轉換操作。

Golang併發以及通道的使用

golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的 package main import fmt time func foo i int func main 輸出為 0 will sleep 0 wake up 1 will sleep 1 wake...

黑客的專用通道以及入侵方法

今天我們來講一下在windows入侵中,黑客的專用通道。黑客在入侵計算機時,往往會選擇計算機的開放埠來進行入侵,下面我們就來教大家如何入侵和防止入侵的辦法,以及被入侵以後最簡單的處理措施。黑客專用通道 埠 首先我們來看一下黑客的專用通道是什麼呢?也就是我們常說的埠,埠通俗來講就是計算機和外界通訊交流...

Golang 併發以及通道的使用方式

golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的 package main import f time func foo i int func main 輸出為0 will sleep 0 wake up 1 will sleep 1 wake up...