事實上,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對象 |