1. 程式人生 > >StackExchange.Redis 官方文檔(五) Keys, Values and Channels

StackExchange.Redis 官方文檔(五) Keys, Values and Channels

null 存儲 command som man www 數值 區分 並且

原文:StackExchange.Redis 官方文檔(五) Keys, Values and Channels

Keys, Values and Channels

在使用redis的過程中,要註意到 keyeverthing 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的類型.他會把在stringbyte[]類型之間進行隱式的轉換,從而允許使用字符串和二進制數據作為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 and ARGV)
  • 返回的格式沒有預先定義的,不同的腳本可能有不同的格式

因此,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中用到的數據類型都是用來區分 從keyvalue 而精挑細選出來的。但是,實際情況中你並不會直接接觸這些類型。

StackExchange.Redis 官方文檔(五) Keys, Values and Channels