StackExchange.Redis 官方文檔(五) Keys, Values and Channels
Keys, Values and Channels
在使用redis的過程中,要註意到 key 和 everthing else 有很大不同.一個key是在同一個數據庫當中一個數據片段(可能是String、List、Hash,或者其他的redis數據類型)所特有的名稱。key並不會被執行。進一步來說,在使用集群或者其他的分片系統時,key定義了哪一個節點存儲了這個數據。所以key對於 routing command 是很重要的
而 value 有很大的不同:value是key對應的存儲的數據 - 也許是一個獨立的數據(像 String 數據),也許是多個value組成的一個群體。value不會影響routing command(註意:除了 SORT
BY
or GET
參數,其中的邏輯很難去解釋).相對應的是 value 經常被redis作為操作的目標來解釋執行:
incr
(和其他幾個相似的命令) 將 String 類型的 value 作為數據類型來執行- 排序(使用數據 或者 unicode的排序規則)
- 其他
關鍵點是api需要理解什麽是key和什麽是value。這在 StackExchange.Redis Api 中得到充分的表現,但是好消息是在大部分情況下你根本不需要知道它是什麽。
在使用 pub/sub時,我們會使用到 channels:channel不會影響routing command (所以它們並不是key),但是和通常value也有很大的不同,所有它們被單獨進行處理。
Keys
StackExchange.Redis 使用RedisKey
代表key的類型.他會把在string
和 byte[]
類型之間進行隱式的轉換,從而允許使用字符串和二進制數據作為key,避免復雜化。舉個例子來說,StringIncrement
方法使用RedisKey
作為第一個參數,但是你根本不需要知道它是需要什麽類型的,例:
string key = ...
db.StringIncrement(key);
or
byte[] key = ...
db.StringIncrement(key);
同時,它會在某些操作返回的key作為 RedisKey
string someKey = db.KeyRandom();
Values
StackExchange.Redis 使用RedisValue
類型作為值的類型.正如RedisKey
,這些轉換都是在隱式進行的,所以在大部分時間,你都不會看到這個數據類型,例:
db.StringSet("mykey", "myvalue");
除了字符串和二進制的數據,value支持.net中大部分的原始數據類型 Int32
, Int64
, Double
or Boolean
:
db.StringSet("mykey", 123); // this is still a RedisKey and RedisValue
...
int i = (int)db.StringGet("mykey");
註意:從原始數據類型到RedisValue
類型是隱式的,但是從RedisValue
轉換到原始數據類型是顯示的:這是以為數據在沒有合適的值的時候轉換會失敗。
註意:在操作數值類型時,redis會把不存在的key的值作為0處理;為了保持一致性,nil返回值將會認為0值:
db.KeyDelete("abc");
int i = (int)db.StringGet("abc"); // this is ZERO
如果你要檢測nil的情況,你可以使用下面的方法:
db.KeyDelete("abc");
var value = db.StringGet("abc");
bool isNil = value.IsNull; // this is true
或者更簡單點,使用Nullable<T>
:
db.KeyDelete("abc");
var value = (int?)db.StringGet("abc"); // behaves as you would expect
Hashes
field的名稱不是key,數據類型可以是字符串或者是二進制;所以,在api中它們被當作value來處理。
Channels
pub/sub的頻道名稱是 RedisChannel
類型
Scripting
Lua scripting in redis 有兩個顯著的特點:
- 輸入必須將key和value分開 (在script中各自將會變成
KEYS
andARGV
) - 返回的格式沒有預先定義的,不同的腳本可能有不同的格式
因此,ScriptEvaluate
方法接受兩個分開的參數數組: RedisKey[]
和 RedisValue[]
(兩個都是可選的,如果省略將會認為空),這可能是少數幾種需要指定RedisKey
或者RedisValue
類型的情況之一:
var result = db.ScriptEvaluate(TransferScript,
new RedisKey[] { from, to }, new RedisValue[] { quantity });
(TransferScript
是包含Lua加班呢的string
,這裏將不做展示)
返回類型RedisResult
(對於腳本所特有的:通常api將會盡可能直接和清楚的表示返回結果)。之前,RedisResult
提供了一系列的轉換操作-比RedisValue
更多:
string[] items = db.ScriptEvaluate(...);
總結
api中用到的數據類型都是用來區分 從key 到 value 而精挑細選出來的。但是,實際情況中你並不會直接接觸這些類型。
StackExchange.Redis 官方文檔(五) Keys, Values and Channels