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對象
發佈了46 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章