1. 程式人生 > >ServiceStack.Redis之IRedisClient

ServiceStack.Redis之IRedisClient

事實上,IRedisClient裡面的很多方法,其實就是Redis的命令名。只要對Redis的命令熟悉一點就能夠非常快速地理解和掌握這些方法,趁著現在對Redis不是特別瞭解,我也對著命令來了解一下這些方法。

一、屬性

  IRedisClient的屬性如下:

屬性 說明
ConnectTimeout  連線超時
Db 當前資料庫的ID或下標
DbSize  當前資料庫的 key 的數量
HadExceptions 
Hashes  儲存複雜物件,一個value中有幾個field 
Host  Redis的Server伺服器主機地址
Info  返回關於 Redis 伺服器的各種資訊和統計數值
LastSave  最近一次 Redis 成功將資料儲存到磁碟上的時間
Lists  當前資料庫中所有的List集合
Password  密碼
Port  Redis的Server埠
RetryCount  重試次數
RetryTimeout  重試超時
SendTimeout  傳送超時
Sets  當前資料庫中所有的HashSet<T>集合
SortedSets  當前資料庫中所有的SortedSet<T>集合
this[string key] 通過索引的方式(key)訪問一個字串型別值

  程式碼示例:

複製程式碼
        RClient.AddItemToSet("蜀國", "劉備");
        RClient.AddItemToSet("蜀國", "關羽");
        RClient.AddItemToSet("蜀國", "張飛");

        IHasNamed
<IRedisSet> rr = RClient.Sets; HashSet<string> HashSetString = rr["蜀國"].GetAll(); foreach (string str in HashSetString) { Response.Write(str); }
複製程式碼

二、IRedisClient資料操作

  1、ICacheClient介面

  IRedisClient實現了介面ICacheClient,其中ICacheClient主要提供的功能如下:

方法 說明
Add 根據傳入的key-value新增一條記錄,當key已存在返回false
FlushAll 使所有快取失效(清除Redis所有資料庫的所有Key)
Get 根據傳入的key獲取一條記錄的值
GetAll 根據傳入的多個key獲取多條記錄的值
Remove 根據傳入的key移除一條記錄
RemoveAll 根據傳入的多個key移除多條記錄
Replace 根據傳入的key覆蓋一條記錄的值,當key不存在不會新增
Set 根據傳入的key修改一條記錄的值,當key不存在則新增
SetAll 根據傳入的多個key覆蓋多條記錄
Increment
Decrement

  特別說明,比如新增的主要方法包括兩個過載,一個多了個DateTime型別引數,一個多了TimeSpan型別的引數。這兩個都是快取失效的時間(相當於快取依賴裡的絕對過期時間)。

  • DateTime失效點:到達該時間點,立即失效;
  • TimeSpan失效點:經過該時間段,立即失效;

  簡單示例:

複製程式碼
        public ActionResult Index()
        {
            RedisClientManagerConfig RedisConfig = new RedisClientManagerConfig();
            RedisConfig.AutoStart = true;
            RedisConfig.MaxReadPoolSize = 60;
            RedisConfig.MaxWritePoolSize = 60;

            PooledRedisClientManager prcm = new PooledRedisClientManager(new List<string>() { "127.0.0.1" }, new List<string>() { "127.0.0.1" }, RedisConfig);

            using (IRedisClient RClient = prcm.GetClient())
            {
                RClient.Add("c1", "快取1");
                RClient.Set("c1", "快取2");
                RClient.Replace("c1", "快取3");
                Response.Write(RClient.Get<string>("c1"));
                RClient.Remove("c1");
                Response.Write(RClient.Get<string>("c1") == null);
            }

            return Content("");
        }
複製程式碼

  2、簡單功能

  當然,除了實現ICacheClient介面的功能外,對於基本操作,實際上也還有很多功能

方法 說明
AppendToValue 根據Key將引數value追加到原有值的結尾
ContainsKey 判斷Key在本資料庫內是否已被使用(包括各種型別、內建集合等等)
GetAllKeys 獲取所有的Keys集合
DecrementValue 根據指定的Key,將值減1(僅整型有效)
DecrementValueBy 根據指定的Key,將值減去指定值(僅整型有效)
IncrementValue 根據指定的Key,將值加1(僅整型有效)
IncrementValueBy 根據指定的Key,將值加上指定值(僅整型有效)
RenameKey 重新命名一個Key,值不變
SearchKeys 從資料庫中查詢名稱相等的Keys的集合,特殊模式如h[ae]llo,僅英文有效。
GetRandomKey 隨機獲取一個已經被使用的Key
GetValue 根據Key獲取值,只對string型別有效
GetValues 根據輸入的多個Key獲取多個值,支援泛型
GetTimeToLive 獲取指定Key的項距離失效點的TimeSpan
GetSortedSetCount 獲取已排序集合的項的數目,引數支援下標以及score篩選
ExpireEntryAt 根據指定的key設定一項的到期時間(DateTime)
ExpireEntryIn 根據指定的key設定一項的到期時間(TimeSpan)
FlushDb 清除本資料庫的所有資料
FlushAll 清除所有資料庫的所有資料
Shutdown 停止所有客戶端,儲存,關閉Redis服務
Save 儲存資料DB檔案到硬碟
SaveAsync 非同步儲存
RewriteAppendOnlyFileAsync 只在非同步情況下將資料追加到伺服器檔案
WriteAll
PublishMessage 將Message傳送到指定的頻道
StoreObject
GetValuesMap 以鍵值對的方式返回值型別相同的多條資料,支援泛型與返回字串。
字串
SetEntry 根據Key修改一個值,存在則覆蓋。(只能設定字串)
SetEntryIfNotExists 根據Key設定一個值,僅僅當Key不存在時有效,如Key已存在則不修改(只支援字串)
SetEntryIfNotExists 根據Key設定一個值,返回舊值。
GetEntryType

根據Key獲取當前儲存的值是什麼型別:

None = 0
String = 1
List = 2
Set = 3
SortedSet = 4
Hash = 5

  3、內建集合

  比如,IRedisClient支援在內部維護如下集合型別的資料:

  • List<T>
  • 排序的List<T>(.Net 4.0後的SortedSet)
  • HashSet<T>

  關於如下4種類型資料的操作:

方法 說明
AddItemToList 新增一個項到內部的List<T>
AddItemToSet 新增一個項到內部的HashSet<T>
AddItemToSortedSet 新增一個項到內部的排序List<T>,其中過載方法多了個score:排序值。優先按照score從小->大排序,否則按值小到大排序
AddRangeToList 一次過將引數中的List<T>中的多個值新增入內部的List<T>
AddRangeToSet 一次過將引數中的HashSet<T>中的多個值新增入內部的HashSet<T>
AddRangeToSortedSet 一次過將引數中的List<T>中的多個值新增到內部List<T>,過載方法的score表示排序值。
GetAllItemsFromList 獲取指定ListId的內部List<T>的所有值
GetAllItemsFromSet 獲取指定SetId的內部HashSet<T>的所有值
GetAllItemsFromSortedSet 獲取指定ListId的內部已排序List<T>的所有值
GetAllItemsFromSortedSetDesc 獲取指定ListId的內部已排序List<T>的所有值,不過獲取的值是倒序排列後的。
GetRangeFromList 獲取指定ListId的內部List<T>中指定下標範圍的資料
GetRangeFromSortedList 獲取指定ListId的內部已排序List<T>中指定下標範圍的資料
GetRangeFromSortedSet 獲取指定SetId的內部HashSet<T>中指定下標範圍的資料
GetRangeFromSortedSetByHighestScore 獲取指定SetId的內部HashSet<T>中按照score由高->低排序後的分值範圍的資料,並且支援skip、take
GetRangeFromSortedSetByLowestScore 同上,只不過是按score分值由低->高取一定範圍內的資料
GetRangeFromSortedSetDesc 按倒序獲取內部HashSet<T>的指定下標範圍內的資料
GetRangeWithScoresFromSortedSet 與From相同,只不過獲取的是鍵值對,資料中帶分值score
GetRangeWithScoresFromSortedSetByHighestScore 同上
GetRangeWithScoresFromSortedSetByLowestScore 同上
GetRangeWithScoresFromSortedSetDesc 同上
GetAllWithScoresFromSortedSet 獲取指定ListId的已排序的內部List<T>與其score
GetSortedItemsFromList 從指定ListId的List<T>中獲取按指定排序的集合,支援Skip,Take
GetSortedEntryValues 從指定ListId的List<T>中獲取經過排序指定開始位置與個數的項
RemoveAllFromList 移除指定ListId的內部List<T>
RemoveItemFromList 移除指定ListId的內部List<T>中第二個引數值相等的那一項
RemoveItemFromSet 從指定SetId的內部HashSet<T>中移除與第二個引數值相等的那一項
RemoveItemFromSortedSet 從指定ListId中已排序的內部List<T>中移除值相等的那一項
RemoveRangeFromSortedSet 從指定ListId已排序的List<T>中移除指定下標範圍的項
RemoveRangeFromSortedSetByScore 從指定ListId已排序的List<T>中移除指定score範圍的項
RemoveStartFromList 從指定ListId移除開頭那一項
RemoveEndFromList 從指定ListId移除末尾那項
BlockingRemoveStartFromList 阻塞地從指定ListId移除開頭那一項
BlockingRemoveStartFromLists
RemoveEntry 根據傳入的多個ListId,清除多個內部List<T>
RemoveAllLuaScripts 清除所有的 Lua 指令碼快取
RemoveEntryFromHash
GetItemFromList 根據ListId和下標獲取一項
GetItemIndexInSortedSet 根據List和值,獲取內建的排序後的List<T>的下標
GetItemIndexInSortedSetDesc 同上,不過順序相反
GetItemScoreInSortedSet 根據傳入的ListId和值獲取內建List<T>項的score
GetListCount 根據ListId,獲取內建的List<T>的項數
GetSetCount 根據SetId,獲取內建的HashSet<T>的項數
GetIntersectFromSets 從輸入的多個HashSet<T>的Id中獲取交集
GetUnionFromSets 從輸入的多個HashSet<T>的Id中獲取並集
GetRandomItemFromSet 從指定ListId的集合中獲取隨機項
StoreUnionFromSets 將多個HashSet<T>,合併為第一個引數中的一個大HashSet<T>,第一個引數中的HashSet<T>原本可以不存在
StoreUnionFromSortedSets 將多個SortedSet<T>,合併為第一個引數中的一個大SortedSet<T>,第一個引數中的SortedSet<T>原本可以不存在
StoreIntersectFromSets 將交集結果儲存在第一個引數的集合中,對HastSet<T>作用
StoreIntersectFromSortedSets 將交集結果儲存在第一個引數的集合中,對SortedSet<T>作用
EnqueueItemOnList 將一個元素存入指定ListId的List<T>的頭部
DequeueItemFromList 將指定ListId的List<T>末尾的那個元素出列,返回出列元素
BlockingDequeueItemFromList 將指定ListId的List<T>末尾的那個元素出列,區別是:會阻塞該List<T>,支援超時時間,返回出列元素
BlockingDequeueItemFromLists
BlockingPopItemFromList 阻塞地將指定ListId的List<T>末尾的哪一個元素移除
BlockingPopItemFromLists
BlockingPopAndPushItemBetweenLists 將第一個集合的元素移除並新增到第二個集合的頭部,返回該元素,會同時阻塞兩個集合
PopItemFromList 從指定ListId的List<T>末尾移除一項並返回
PopItemFromSet 從指定SetId的HashSet<T>末尾移除一項並返回
PopItemWithHighestScoreFromSortedSet 從指定SetId的HashSet<T>移除score最高的那一項
PopItemWithLowestScoreFromSortedSet 從指定SetId的HashSet<T>移除score最低的那一項
PopAndPushItemBetweenLists 將第一個集合的元素移除並新增到第二個集合的頭部
SetContainsItem 判斷指定SetId的HashSet<T>中是否包含指定的value(僅僅支援字串)
SortedSetContainsItem 判斷SortedSet是否包含一個鍵
TrimList 根據ListId裁剪內建集合,保留下去from->at之間(包含from於at)的元素,其餘的裁去
IncrementItemInSortedSet 為指定ListId的集合中的value的分值score加上指定分值
SetItemInList 重新設定指定ListId和下標的value為指定值
PushItemToList 在指定ListId的內建List<T>中入列一個鍵值對,在末尾
PrependItemToList 將一個值插入到List<T>的最前面
PrependRangeToList 一次性新增多個值到指定ListId的內建List<T>中
GetDifferencesFromSet 返回存在於第一個集合,但是不存在於其他集合的資料。差集
StoreDifferencesFromSet 將求差集的結果儲存在第一個引數的集合中
MoveBetweenSets 將元素從一個集合移動到另一個集合的開頭。(刪除與新增)

  下面僅給出一個List<T>與HashSet<T>的示例:

複製程式碼
        //內部維護一個List<T>集合
        RClient.AddItemToList("蜀國", "劉備");
        RClient.AddItemToList("蜀國", "關羽");
        RClient.AddItemToList("蜀國", "張飛");
        List<string> ListString = RClient.GetAllItemsFromList("蜀國");
        foreach (string str in ListString)
        {
            Response.Write(str);    //輸出 劉備 關羽 張飛
        }
               
        RClient.AddItemToSet("魏國", "曹操");
        RClient.AddItemToSet("魏國", "曹操");
        RClient.AddItemToSet("魏國", "典韋");
        HashSet<string> HashSetString = RClient.GetAllItemsFromSet("魏國");
        foreach (string str in HashSetString)
        {
            Response.Write(str);    //輸出 典韋 曹操
        }
複製程式碼

   下面再給一個範圍Range操作示例:

複製程式碼
        //內部維護一個List<T>集合
        RClient.AddItemToSortedSet("蜀國", "劉備", 5);
        RClient.AddItemToSortedSet("蜀國", "關羽", 2);
        RClient.AddItemToSortedSet("蜀國", "張飛", 3);
        IDictionary<String,double> DicString = RClient.GetRangeWithScoresFromSortedSet("蜀國", 0, 2);
        foreach (var r in DicString)
        {
            Response.Write(r.Key + ":" + r.Value);    //輸出 
        }
複製程式碼

   3、內建Hash

  內部維護一個HashTable

方法 說明
SetEntryInHash 設定一個鍵值對入Hash表,如果雜湊表的key存在則覆蓋
SetEntryInHashIfNotExists 當雜湊表的key未被使用時,設定一個鍵值對如Hash表
GetHashValues 根據HashId獲取多個改HashId下的多個值
GetValuesFromHash 根據HashId和Hash表的Key獲取多個值(支援多個key)
GetValueFromHash 根據HashId和Hash表的Key獲取單個值
GetHashKeys 獲取指定HashId下的所有Key
GetHashValues 獲取指定HashId下的所有值
GetHashCount 獲取指定HashId下的所有Key數量
HashContainsEntry 判斷指定HashId的雜湊表中是否包含指定的Key
IncrementValueInHash 將指定HashId的雜湊表中的值加上指定值
StoreAsHash 將一個物件存入Hash(支援泛型)
GetFromHash 根據Id從Hash表中取出物件(支援泛型)
SetRangeInHash 通過IEnumerable<KeyValuePair<string, string>>一次性設定多個值,當內部Hash的key不存在則新增,存在則覆蓋

  程式碼示例:

        RClient.SetEntryInHash("xxx","key","123");
        List<KeyValuePair<string, string>> keyValuePairs = new List<KeyValuePair<string, string>>();
        KeyValuePair<string, string> kvp = new KeyValuePair<string, string>("key", "1");
        keyValuePairs.Add(kvp);
        RClient.SetRangeInHash("xxx", keyValuePairs);

  4、Lua Script

  從 Redis 2.6.0 版本開始,通過內建的 Lua 直譯器,可以執行各種Lua指令碼。IRedisClient支援執行Lua指令碼,其供用於執行Lua指令碼的方法如下:

方法 說明
LoadLuaScript 將一個指令碼裝入指令碼快取,但並不立即執行它
KillRunningLuaScript 停止正在執行的指定Id的指令碼
ExecLuaAsInt
ExecLuaAsList
ExecLuaAsString
ExecLuaShaAsInt
ExecLuaShaAsList
ExecLuaShaAsString
HasLuaScript 判斷Lua指令碼是否在指令碼快取裡
CalculateSha1
WhichLuaScriptsExists

  關於Lua指令碼可以到這裡去了解:http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html

  5、事務

  Redis中的事務

方法 說明
Watch 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
UnWatch 取消 WATCH 命令對所有 key 的監視
AcquireLock 申請對一個Key加鎖(期間其他物件不能訪問)
CreateTransaction 建立一個事務,返回一個IRedisTransaction物件
CreateSubscription 建立一個訂閱事件返回一個IRedisSubscription物件
CreatePipeline 返回一個IRedisPipeline物件