热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ServiceStack.Redis之IRedisClient<第三篇>

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

 事实上,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集合
SortedSets  当前数据库中所有的SortedSet集合
this[string key] 通过索引的方式(key)访问一个字符串类型值

  代码示例:

,
        RClient.AddItemToSet("蜀国", "刘备");
        RClient.AddItemToSet("蜀国", "关羽");
        RClient.AddItemToSet("蜀国", "张飞");

        IHasNamed rr = RClient.Sets;
        HashSet 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() { "127.0.0.1" }, new List() { "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("c1"));
                RClient.Remove("c1");
                Response.Write(RClient.Get("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
  • 排序的List(.Net 4.0后的SortedSet)
  • HashSet

  关于如下4种类型数据的操作:

方法 说明
AddItemToList 添加一个项到内部的List
AddItemToSet 添加一个项到内部的HashSet
AddItemToSortedSet 添加一个项到内部的排序List,其中重载方法多了个score:排序值。优先按照score从小->大排序,否则按值小到大排序
AddRangeToList 一次过将参数中的List中的多个值添加入内部的List
AddRangeToSet 一次过将参数中的HashSet中的多个值添加入内部的HashSet
AddRangeToSortedSet 一次过将参数中的List中的多个值添加到内部List,重载方法的score表示排序值。
GetAllItemsFromList 获取指定ListId的内部List的所有值
GetAllItemsFromSet 获取指定SetId的内部HashSet的所有值
GetAllItemsFromSortedSet 获取指定ListId的内部已排序List的所有值
GetAllItemsFromSortedSetDesc 获取指定ListId的内部已排序List的所有值,不过获取的值是倒序排列后的。
GetRangeFromList 获取指定ListId的内部List中指定下标范围的数据
GetRangeFromSortedList 获取指定ListId的内部已排序List中指定下标范围的数据
GetRangeFromSortedSet 获取指定SetId的内部HashSet中指定下标范围的数据
GetRangeFromSortedSetByHighestScore 获取指定SetId的内部HashSet中按照score由高->低排序后的分值范围的数据,并且支持skip、take
GetRangeFromSortedSetByLowestScore 同上,只不过是按score分值由低->高取一定范围内的数据
GetRangeFromSortedSetDesc 按倒序获取内部HashSet的指定下标范围内的数据
GetRangeWithScoresFromSortedSet 与From相同,只不过获取的是键值对,数据中带分值score
GetRangeWithScoresFromSortedSetByHighestScore 同上
GetRangeWithScoresFromSortedSetByLowestScore 同上
GetRangeWithScoresFromSortedSetDesc 同上
GetAllWithScoresFromSortedSet 获取指定ListId的已排序的内部List与其score
GetSortedItemsFromList 从指定ListId的List中获取按指定排序的集合,支持Skip,Take
GetSortedEntryValues 从指定ListId的List中获取经过排序指定开始位置与个数的项
RemoveAllFromList 移除指定ListId的内部List
RemoveItemFromList 移除指定ListId的内部List中第二个参数值相等的那一项
RemoveItemFromSet 从指定SetId的内部HashSet中移除与第二个参数值相等的那一项
RemoveItemFromSortedSet 从指定ListId中已排序的内部List中移除值相等的那一项
RemoveRangeFromSortedSet 从指定ListId已排序的List中移除指定下标范围的项
RemoveRangeFromSortedSetByScore 从指定ListId已排序的List中移除指定score范围的项
RemoveStartFromList 从指定ListId移除开头那一项
RemoveEndFromList 从指定ListId移除末尾那项
BlockingRemoveStartFromList 阻塞地从指定ListId移除开头那一项
BlockingRemoveStartFromLists  
RemoveEntry 根据传入的多个ListId,清除多个内部List
RemoveAllLuaScripts 清除所有的 Lua 脚本缓存
RemoveEntryFromHash  
GetItemFromList 根据ListId和下标获取一项
GetItemIndexInSortedSet 根据List和值,获取内置的排序后的List的下标
GetItemIndexInSortedSetDesc 同上,不过顺序相反
GetItemScoreInSortedSet 根据传入的ListId和值获取内置List项的score
GetListCount 根据ListId,获取内置的List的项数
GetSetCount 根据SetId,获取内置的HashSet的项数
GetIntersectFromSets 从输入的多个HashSet的Id中获取交集
GetUnionFromSets 从输入的多个HashSet的Id中获取并集
GetRandomItemFromSet 从指定ListId的集合中获取随机项
StoreUnionFromSets 将多个HashSet,合并为第一个参数中的一个大HashSet,第一个参数中的HashSet原本可以不存在
StoreUnionFromSortedSets 将多个SortedSet,合并为第一个参数中的一个大SortedSet,第一个参数中的SortedSet原本可以不存在
StoreIntersectFromSets 将交集结果保存在第一个参数的集合中,对HastSet作用
StoreIntersectFromSortedSets 将交集结果保存在第一个参数的集合中,对SortedSet作用
EnqueueItemOnList 将一个元素存入指定ListId的List的头部
DequeueItemFromList 将指定ListId的List末尾的那个元素出列,返回出列元素
BlockingDequeueItemFromList 将指定ListId的List末尾的那个元素出列,区别是:会阻塞该List,支持超时时间,返回出列元素
BlockingDequeueItemFromLists  
BlockingPopItemFromList 阻塞地将指定ListId的List末尾的哪一个元素移除
BlockingPopItemFromLists  
BlockingPopAndPushItemBetweenLists 将第一个集合的元素移除并添加到第二个集合的头部,返回该元素,会同时阻塞两个集合
PopItemFromList 从指定ListId的List末尾移除一项并返回
PopItemFromSet 从指定SetId的HashSet末尾移除一项并返回
PopItemWithHighestScoreFromSortedSet 从指定SetId的HashSet移除score最高的那一项
PopItemWithLowestScoreFromSortedSet 从指定SetId的HashSet移除score最低的那一项
PopAndPushItemBetweenLists 将第一个集合的元素移除并添加到第二个集合的头部
SetContainsItem 判断指定SetId的HashSet中是否包含指定的value(仅仅支持字符串)
SortedSetContainsItem 判断SortedSet是否包含一个键
TrimList 根据ListId裁剪内置集合,保留下去from->at之间(包含from于at)的元素,其余的裁去
IncrementItemInSortedSet 为指定ListId的集合中的value的分值score加上指定分值
SetItemInList 重新设置指定ListId和下标的value为指定值
PushItemToList 在指定ListId的内置List中入列一个键值对,在末尾
PrependItemToList 将一个值插入到List的最前面
PrependRangeToList 一次性添加多个值到指定ListId的内置List
GetDifferencesFromSet 返回存在于第一个集合,但是不存在于其他集合的数据。差集
StoreDifferencesFromSet 将求差集的结果保存在第一个参数的集合中
MoveBetweenSets 将元素从一个集合移动到另一个集合的开头。(删除与添加)

  下面仅给出一个List与HashSet的示例:

,
        //内部维护一个List集合
        RClient.AddItemToList("蜀国", "刘备");
        RClient.AddItemToList("蜀国", "关羽");
        RClient.AddItemToList("蜀国", "张飞");
        List ListString = RClient.GetAllItemsFromList("蜀国");
        foreach (string str in ListString)
        {
            Response.Write(str);    //输出 刘备 关羽 张飞
        }
               
        RClient.AddItemToSet("魏国", "曹操");
        RClient.AddItemToSet("魏国", "曹操");
        RClient.AddItemToSet("魏国", "典韦");
        HashSet HashSetString = RClient.GetAllItemsFromSet("魏国");
        foreach (string str in HashSetString)
        {
            Response.Write(str);    //输出 典韦 曹操
        }
,

   下面再给一个范围Range操作示例:

,
        //内部维护一个List集合
        RClient.AddItemToSortedSet("蜀国", "刘备", 5);
        RClient.AddItemToSortedSet("蜀国", "关羽", 2);
        RClient.AddItemToSortedSet("蜀国", "张飞", 3);
        IDictionary 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>一次性设置多个值,当内部Hash的key不存在则添加,存在则覆盖

  代码示例:

        RClient.SetEntryInHash("xxx","key","123");
        List> keyValuePairs = new List>();
        KeyValuePair kvp = new KeyValuePair("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对象

," href="http://www./infodetail-220582.html" target=_blank>ServiceStack.Redis之IRedisClient<第三篇>,,

,mamicode.com" target="_blank">ServiceStack.Redis之IRedisClient<第三篇>


推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
但须g婚后
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有