ServiceStack.Redis之IRedisClient第三篇
事實(shí)上,IRedisClient里面的很多方法,其實(shí)就是Redis的命令名。只要對Redis的命令熟悉一點(diǎn)就能夠非常快速地理解和掌握這些方法,趁著現(xiàn)在對Redis不是特別了解,我也對著命令來了解一下這些方法。
一、屬性
IRedisClient的屬性如下:
| 屬性 | 說明 |
| ConnectTimeout? | 連接超時(shí) |
| Db | 當(dāng)前數(shù)據(jù)庫的ID或下標(biāo) |
| DbSize? | 當(dāng)前數(shù)據(jù)庫的 key 的數(shù)量 |
| HadExceptions? | ? |
| Hashes? | 存儲(chǔ)復(fù)雜對象,一個(gè)value中有幾個(gè)field? |
| Host? | Redis的Server服務(wù)器主機(jī)地址 |
| Info? | 返回關(guān)于 Redis 服務(wù)器的各種信息和統(tǒng)計(jì)數(shù)值 |
| LastSave? | 最近一次 Redis 成功將數(shù)據(jù)保存到磁盤上的時(shí)間 |
| Lists? | 當(dāng)前數(shù)據(jù)庫中所有的List集合 |
| Password? | 密碼 |
| Port? | Redis的Server端口 |
| RetryCount? | 重試次數(shù) |
| RetryTimeout? | 重試超時(shí) |
| SendTimeout? | 發(fā)送超時(shí) |
| Sets? | 當(dāng)前數(shù)據(jù)庫中所有的HashSet<T>集合 |
| SortedSets? | 當(dāng)前數(shù)據(jù)庫中所有的SortedSet<T>集合 |
| this[string key] | 通過索引的方式(key)訪問一個(gè)字符串類型值 |
代碼示例:
RClient.AddItemToSet("蜀國", "劉備");RClient.AddItemToSet("蜀國", "關(guān)羽");RClient.AddItemToSet("蜀國", "張飛");IHasNamed<IRedisSet> rr = RClient.Sets;HashSet<string> HashSetString = rr["蜀國"].GetAll();foreach (string str in HashSetString){Response.Write(str);}?
二、IRedisClient數(shù)據(jù)操作
1、ICacheClient接口
IRedisClient實(shí)現(xiàn)了接口ICacheClient,其中ICacheClient主要提供的功能如下:
| 方法 | 說明 |
| Add | 根據(jù)傳入的key-value添加一條記錄,當(dāng)key已存在返回false |
| FlushAll | 使所有緩存失效(清除Redis所有數(shù)據(jù)庫的所有Key) |
| Get | 根據(jù)傳入的key獲取一條記錄的值 |
| GetAll | 根據(jù)傳入的多個(gè)key獲取多條記錄的值 |
| Remove | 根據(jù)傳入的key移除一條記錄 |
| RemoveAll | 根據(jù)傳入的多個(gè)key移除多條記錄 |
| Replace | 根據(jù)傳入的key覆蓋一條記錄的值,當(dāng)key不存在不會(huì)添加 |
| Set | 根據(jù)傳入的key修改一條記錄的值,當(dāng)key不存在則添加 |
| SetAll | 根據(jù)傳入的多個(gè)key覆蓋多條記錄 |
| Increment | ? |
| Decrement | ? |
特別說明,比如添加的主要方法包括兩個(gè)重載,一個(gè)多了個(gè)DateTime類型參數(shù),一個(gè)多了TimeSpan類型的參數(shù)。這兩個(gè)都是緩存失效的時(shí)間(相當(dāng)于緩存依賴?yán)锏慕^對過期時(shí)間)。
- DateTime失效點(diǎn):到達(dá)該時(shí)間點(diǎn),立即失效;
- TimeSpan失效點(diǎn):經(jīng)過該時(shí)間段,立即失效;
簡單示例:
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、簡單功能
當(dāng)然,除了實(shí)現(xiàn)ICacheClient接口的功能外,對于基本操作,實(shí)際上也還有很多功能
| 方法 | 說明 |
| AppendToValue | 根據(jù)Key將參數(shù)value追加到原有值的結(jié)尾 |
| ContainsKey | 判斷Key在本數(shù)據(jù)庫內(nèi)是否已被使用(包括各種類型、內(nèi)置集合等等) |
| GetAllKeys | 獲取所有的Keys集合 |
| DecrementValue | 根據(jù)指定的Key,將值減1(僅整型有效) |
| DecrementValueBy | 根據(jù)指定的Key,將值減去指定值(僅整型有效) |
| IncrementValue | 根據(jù)指定的Key,將值加1(僅整型有效) |
| IncrementValueBy | 根據(jù)指定的Key,將值加上指定值(僅整型有效) |
| RenameKey | 重命名一個(gè)Key,值不變 |
| SearchKeys | 從數(shù)據(jù)庫中查找名稱相等的Keys的集合,特殊模式如h[ae]llo,僅英文有效。 |
| GetRandomKey | 隨機(jī)獲取一個(gè)已經(jīng)被使用的Key |
| GetValue | 根據(jù)Key獲取值,只對string類型有效 |
| GetValues | 根據(jù)輸入的多個(gè)Key獲取多個(gè)值,支持泛型 |
| GetTimeToLive | 獲取指定Key的項(xiàng)距離失效點(diǎn)的TimeSpan |
| GetSortedSetCount | 獲取已排序集合的項(xiàng)的數(shù)目,參數(shù)支持下標(biāo)以及score篩選 |
| ExpireEntryAt | 根據(jù)指定的key設(shè)置一項(xiàng)的到期時(shí)間(DateTime) |
| ExpireEntryIn | 根據(jù)指定的key設(shè)置一項(xiàng)的到期時(shí)間(TimeSpan) |
| FlushDb | 清除本數(shù)據(jù)庫的所有數(shù)據(jù) |
| FlushAll | 清除所有數(shù)據(jù)庫的所有數(shù)據(jù) |
| Shutdown | 停止所有客戶端,保存,關(guān)閉Redis服務(wù) |
| Save | 保存數(shù)據(jù)DB文件到硬盤 |
| SaveAsync | 異步保存 |
| RewriteAppendOnlyFileAsync | 只在異步情況下將數(shù)據(jù)追加到服務(wù)器文件 |
| WriteAll | ? |
| PublishMessage | 將Message發(fā)送到指定的頻道 |
| StoreObject | ? |
| GetValuesMap | 以鍵值對的方式返回值類型相同的多條數(shù)據(jù),支持泛型與返回字符串。 |
| 字符串 | ? |
| SetEntry | 根據(jù)Key修改一個(gè)值,存在則覆蓋。(只能設(shè)置字符串) |
| SetEntryIfNotExists | 根據(jù)Key設(shè)置一個(gè)值,僅僅當(dāng)Key不存在時(shí)有效,如Key已存在則不修改(只支持字符串) |
| SetEntryIfNotExists | 根據(jù)Key設(shè)置一個(gè)值,返回舊值。 |
| GetEntryType | 根據(jù)Key獲取當(dāng)前存儲(chǔ)的值是什么類型: None = 0 |
3、內(nèi)置集合
比如,IRedisClient支持在內(nèi)部維護(hù)如下集合類型的數(shù)據(jù):
- List<T>
- 排序的List<T>(.Net 4.0后的SortedSet)
- HashSet<T>
關(guān)于如下4種類型數(shù)據(jù)的操作:
| 方法 | 說明 |
| AddItemToList | 添加一個(gè)項(xiàng)到內(nèi)部的List<T> |
| AddItemToSet | 添加一個(gè)項(xiàng)到內(nèi)部的HashSet<T> |
| AddItemToSortedSet | 添加一個(gè)項(xiàng)到內(nèi)部的排序List<T>,其中重載方法多了個(gè)score:排序值。優(yōu)先按照score從小->大排序,否則按值小到大排序 |
| AddRangeToList | 一次過將參數(shù)中的List<T>中的多個(gè)值添加入內(nèi)部的List<T> |
| AddRangeToSet | 一次過將參數(shù)中的HashSet<T>中的多個(gè)值添加入內(nèi)部的HashSet<T> |
| AddRangeToSortedSet | 一次過將參數(shù)中的List<T>中的多個(gè)值添加到內(nèi)部List<T>,重載方法的score表示排序值。 |
| GetAllItemsFromList | 獲取指定ListId的內(nèi)部List<T>的所有值 |
| GetAllItemsFromSet | 獲取指定SetId的內(nèi)部HashSet<T>的所有值 |
| GetAllItemsFromSortedSet | 獲取指定ListId的內(nèi)部已排序List<T>的所有值 |
| GetAllItemsFromSortedSetDesc | 獲取指定ListId的內(nèi)部已排序List<T>的所有值,不過獲取的值是倒序排列后的。 |
| GetRangeFromList | 獲取指定ListId的內(nèi)部List<T>中指定下標(biāo)范圍的數(shù)據(jù) |
| GetRangeFromSortedList | 獲取指定ListId的內(nèi)部已排序List<T>中指定下標(biāo)范圍的數(shù)據(jù) |
| GetRangeFromSortedSet | 獲取指定SetId的內(nèi)部HashSet<T>中指定下標(biāo)范圍的數(shù)據(jù) |
| GetRangeFromSortedSetByHighestScore | 獲取指定SetId的內(nèi)部HashSet<T>中按照score由高->低排序后的分值范圍的數(shù)據(jù),并且支持skip、take |
| GetRangeFromSortedSetByLowestScore | 同上,只不過是按score分值由低->高取一定范圍內(nèi)的數(shù)據(jù) |
| GetRangeFromSortedSetDesc | 按倒序獲取內(nèi)部HashSet<T>的指定下標(biāo)范圍內(nèi)的數(shù)據(jù) |
| GetRangeWithScoresFromSortedSet | 與From相同,只不過獲取的是鍵值對,數(shù)據(jù)中帶分值score |
| GetRangeWithScoresFromSortedSetByHighestScore | 同上 |
| GetRangeWithScoresFromSortedSetByLowestScore | 同上 |
| GetRangeWithScoresFromSortedSetDesc | 同上 |
| GetAllWithScoresFromSortedSet | 獲取指定ListId的已排序的內(nèi)部List<T>與其score |
| GetSortedItemsFromList | 從指定ListId的List<T>中獲取按指定排序的集合,支持Skip,Take |
| GetSortedEntryValues | 從指定ListId的List<T>中獲取經(jīng)過排序指定開始位置與個(gè)數(shù)的項(xiàng) |
| RemoveAllFromList | 移除指定ListId的內(nèi)部List<T> |
| RemoveItemFromList | 移除指定ListId的內(nèi)部List<T>中第二個(gè)參數(shù)值相等的那一項(xiàng) |
| RemoveItemFromSet | 從指定SetId的內(nèi)部HashSet<T>中移除與第二個(gè)參數(shù)值相等的那一項(xiàng) |
| RemoveItemFromSortedSet | 從指定ListId中已排序的內(nèi)部List<T>中移除值相等的那一項(xiàng) |
| RemoveRangeFromSortedSet | 從指定ListId已排序的List<T>中移除指定下標(biāo)范圍的項(xiàng) |
| RemoveRangeFromSortedSetByScore | 從指定ListId已排序的List<T>中移除指定score范圍的項(xiàng) |
| RemoveStartFromList | 從指定ListId移除開頭那一項(xiàng) |
| RemoveEndFromList | 從指定ListId移除末尾那項(xiàng) |
| BlockingRemoveStartFromList | 阻塞地從指定ListId移除開頭那一項(xiàng) |
| BlockingRemoveStartFromLists | ? |
| RemoveEntry | 根據(jù)傳入的多個(gè)ListId,清除多個(gè)內(nèi)部List<T> |
| RemoveAllLuaScripts | 清除所有的?Lua 腳本緩存 |
| RemoveEntryFromHash | ? |
| GetItemFromList | 根據(jù)ListId和下標(biāo)獲取一項(xiàng) |
| GetItemIndexInSortedSet | 根據(jù)List和值,獲取內(nèi)置的排序后的List<T>的下標(biāo) |
| GetItemIndexInSortedSetDesc | 同上,不過順序相反 |
| GetItemScoreInSortedSet | 根據(jù)傳入的ListId和值獲取內(nèi)置List<T>項(xiàng)的score |
| GetListCount | 根據(jù)ListId,獲取內(nèi)置的List<T>的項(xiàng)數(shù) |
| GetSetCount | 根據(jù)SetId,獲取內(nèi)置的HashSet<T>的項(xiàng)數(shù) |
| GetIntersectFromSets | 從輸入的多個(gè)HashSet<T>的Id中獲取交集 |
| GetUnionFromSets | 從輸入的多個(gè)HashSet<T>的Id中獲取并集 |
| GetRandomItemFromSet | 從指定ListId的集合中獲取隨機(jī)項(xiàng) |
| StoreUnionFromSets | 將多個(gè)HashSet<T>,合并為第一個(gè)參數(shù)中的一個(gè)大HashSet<T>,第一個(gè)參數(shù)中的HashSet<T>原本可以不存在 |
| StoreUnionFromSortedSets | 將多個(gè)SortedSet<T>,合并為第一個(gè)參數(shù)中的一個(gè)大SortedSet<T>,第一個(gè)參數(shù)中的SortedSet<T>原本可以不存在 |
| StoreIntersectFromSets | 將交集結(jié)果保存在第一個(gè)參數(shù)的集合中,對HastSet<T>作用 |
| StoreIntersectFromSortedSets | 將交集結(jié)果保存在第一個(gè)參數(shù)的集合中,對SortedSet<T>作用 |
| EnqueueItemOnList | 將一個(gè)元素存入指定ListId的List<T>的頭部 |
| DequeueItemFromList | 將指定ListId的List<T>末尾的那個(gè)元素出列,返回出列元素 |
| BlockingDequeueItemFromList | 將指定ListId的List<T>末尾的那個(gè)元素出列,區(qū)別是:會(huì)阻塞該List<T>,支持超時(shí)時(shí)間,返回出列元素 |
| BlockingDequeueItemFromLists | ? |
| BlockingPopItemFromList | 阻塞地將指定ListId的List<T>末尾的哪一個(gè)元素移除 |
| BlockingPopItemFromLists | ? |
| BlockingPopAndPushItemBetweenLists | 將第一個(gè)集合的元素移除并添加到第二個(gè)集合的頭部,返回該元素,會(huì)同時(shí)阻塞兩個(gè)集合 |
| PopItemFromList | 從指定ListId的List<T>末尾移除一項(xiàng)并返回 |
| PopItemFromSet | 從指定SetId的HashSet<T>末尾移除一項(xiàng)并返回 |
| PopItemWithHighestScoreFromSortedSet | 從指定SetId的HashSet<T>移除score最高的那一項(xiàng) |
| PopItemWithLowestScoreFromSortedSet | 從指定SetId的HashSet<T>移除score最低的那一項(xiàng) |
| PopAndPushItemBetweenLists | 將第一個(gè)集合的元素移除并添加到第二個(gè)集合的頭部 |
| SetContainsItem | 判斷指定SetId的HashSet<T>中是否包含指定的value(僅僅支持字符串) |
| SortedSetContainsItem | 判斷SortedSet是否包含一個(gè)鍵 |
| TrimList | 根據(jù)ListId裁剪內(nèi)置集合,保留下去from->at之間(包含from于at)的元素,其余的裁去 |
| IncrementItemInSortedSet | 為指定ListId的集合中的value的分值score加上指定分值 |
| SetItemInList | 重新設(shè)置指定ListId和下標(biāo)的value為指定值 |
| PushItemToList | 在指定ListId的內(nèi)置List<T>中入列一個(gè)鍵值對,在末尾 |
| PrependItemToList | 將一個(gè)值插入到List<T>的最前面 |
| PrependRangeToList | 一次性添加多個(gè)值到指定ListId的內(nèi)置List<T>中 |
| GetDifferencesFromSet | 返回存在于第一個(gè)集合,但是不存在于其他集合的數(shù)據(jù)。差集 |
| StoreDifferencesFromSet | 將求差集的結(jié)果保存在第一個(gè)參數(shù)的集合中 |
| MoveBetweenSets | 將元素從一個(gè)集合移動(dòng)到另一個(gè)集合的開頭。(刪除與添加) |
下面僅給出一個(gè)List<T>與HashSet<T>的示例:
//內(nèi)部維護(hù)一個(gè)List<T>集合RClient.AddItemToList("蜀國", "劉備");RClient.AddItemToList("蜀國", "關(guān)羽");RClient.AddItemToList("蜀國", "張飛");List<string> ListString = RClient.GetAllItemsFromList("蜀國");foreach (string str in ListString){Response.Write(str); //輸出 劉備 關(guān)羽 張飛}RClient.AddItemToSet("魏國", "曹操");RClient.AddItemToSet("魏國", "曹操");RClient.AddItemToSet("魏國", "典韋");HashSet<string> HashSetString = RClient.GetAllItemsFromSet("魏國");foreach (string str in HashSetString){Response.Write(str); //輸出 典韋 曹操}? 下面再給一個(gè)范圍Range操作示例:
//內(nèi)部維護(hù)一個(gè)List<T>集合RClient.AddItemToSortedSet("蜀國", "劉備", 5);RClient.AddItemToSortedSet("蜀國", "關(guān)羽", 2);RClient.AddItemToSortedSet("蜀國", "張飛", 3);IDictionary<String,double> DicString = RClient.GetRangeWithScoresFromSortedSet("蜀國", 0, 2);foreach (var r in DicString){Response.Write(r.Key + ":" + r.Value); //輸出 }? 3、內(nèi)置Hash
內(nèi)部維護(hù)一個(gè)HashTable
| 方法 | 說明 |
| SetEntryInHash | 設(shè)置一個(gè)鍵值對入Hash表,如果哈希表的key存在則覆蓋 |
| SetEntryInHashIfNotExists | 當(dāng)哈希表的key未被使用時(shí),設(shè)置一個(gè)鍵值對如Hash表 |
| GetHashValues | 根據(jù)HashId獲取多個(gè)改HashId下的多個(gè)值 |
| GetValuesFromHash | 根據(jù)HashId和Hash表的Key獲取多個(gè)值(支持多個(gè)key) |
| GetValueFromHash | 根據(jù)HashId和Hash表的Key獲取單個(gè)值 |
| GetHashKeys | 獲取指定HashId下的所有Key |
| GetHashValues | 獲取指定HashId下的所有值 |
| GetHashCount | 獲取指定HashId下的所有Key數(shù)量 |
| HashContainsEntry | 判斷指定HashId的哈希表中是否包含指定的Key |
| IncrementValueInHash | 將指定HashId的哈希表中的值加上指定值 |
| StoreAsHash | 將一個(gè)對象存入Hash(支持泛型) |
| GetFromHash | 根據(jù)Id從Hash表中取出對象(支持泛型) |
| SetRangeInHash | 通過IEnumerable<KeyValuePair<string, string>>一次性設(shè)置多個(gè)值,當(dāng)內(nèi)部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 版本開始,通過內(nèi)置的 Lua 解釋器,可以執(zhí)行各種Lua腳本。IRedisClient支持執(zhí)行Lua腳本,其供用于執(zhí)行Lua腳本的方法如下:
| 方法 | 說明 |
| LoadLuaScript | 將一個(gè)腳本裝入腳本緩存,但并不立即運(yùn)行它 |
| KillRunningLuaScript | 停止正在運(yùn)行的指定Id的腳本 |
| ExecLuaAsInt | ? |
| ExecLuaAsList | ? |
| ExecLuaAsString | ? |
| ExecLuaShaAsInt | ? |
| ExecLuaShaAsList | ? |
| ExecLuaShaAsString | ? |
| HasLuaScript | 判斷Lua腳本是否在腳本緩存里 |
| CalculateSha1 | ? |
| WhichLuaScriptsExists | ? |
關(guān)于Lua腳本可以到這里去了解:http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html
5、事務(wù)
Redis中的事務(wù)
| 方法 | 說明 |
| Watch | 監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷。 |
| UnWatch | 取消 WATCH 命令對所有 key 的監(jiān)視 |
| AcquireLock | 申請對一個(gè)Key加鎖(期間其他對象不能訪問) |
| CreateTransaction | 創(chuàng)建一個(gè)事務(wù),返回一個(gè)IRedisTransaction對象 |
| CreateSubscription | 創(chuàng)建一個(gè)訂閱事件返回一個(gè)IRedisSubscription對象 |
| CreatePipeline | 返回一個(gè)IRedisPipeline對象 |
轉(zhuǎn)載于:https://www.cnblogs.com/YuanZhaoBest/p/4095525.html
總結(jié)
以上是生活随笔為你收集整理的ServiceStack.Redis之IRedisClient第三篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置兼容性[指定IE浏览器渲染方式]
- 下一篇: (MariaDB/MySQL)之DML(