ServiceStack.Redis之IRedisClient<第三篇>

  事實上,IRedisClient裏面的不少方法,其實就是Redis的命令名。只要對Redis的命令熟悉一點就可以很是快速地理解和掌握這些方法,趁着如今對Redis不是特別瞭解,我也對着命令來了解一下這些方法。html

1、屬性

  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);
        }

 

2、IRedisClient數據操做

  一、ICacheClient接口服務器

  IRedisClient實現了接口ICacheClient,其中ICacheClient主要提供的功能以下:dom

方法 說明
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失效點:通過該時間段,當即失效;

  簡單示例:ui

        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("");
        }

  二、簡單功能this

  固然,除了實現ICacheClient接口的功能外,對於基本操做,實際上也還有不少功能spa

方法 說明
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獲取當前存儲的值是什麼類型:code

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

  

  

  三、內置集合

  好比,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);    //輸出 
        }

   三、內置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);

  

  四、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

  五、事務

  Redis中的事務

方法 說明
Watch 監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷。
UnWatch 取消 WATCH 命令對全部 key 的監視
AcquireLock 申請對一個Key加鎖(期間其餘對象不能訪問)
CreateTransaction 建立一個事務,返回一個IRedisTransaction對象
CreateSubscription 建立一個訂閱事件返回一個IRedisSubscription對象
CreatePipeline 返回一個IRedisPipeline對象
相關文章
相關標籤/搜索