標籤:des blog http io ar os 使用 sp for
事實上,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對象 |
ServiceStack.Redis之IRedisClient<第三篇>