ServiceStack.Redis之IRedisClient
阿新 • • 發佈:2019-02-15
事實上,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 |
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物件 |