ServiceStack.Redis之IRedisClient常用方法说明[第三篇]

事实上,IRedisClient里面的很多方法,其实就是Redis的命令名。只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这些方法。

一、属性

IRedisClient的属性如下:

属性说明
ConnectTimeout连接超时
Db当前数据库的ID或下标
DbSize当前数据库的 key 的数量
HadExceptions
Hashes存储复杂对象,一个value中有几个field
HostRedis的Server服务器主机地址
Info返回关于 Redis 服务器的各种信息和统计数值
LastSave最近一次 Redis 成功将数据保存到磁盘上的时间
Lists当前数据库中所有的List集合
Password密码
PortRedis的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对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值