ServiceStack.Redis之IRedisClient第三篇

  事实上,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对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript深入浅出

第一章 数据类型 1&#xff0c;六种数据类型&#xff1a;原始类型&#xff08;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff09; object对象&#xff08;Function Array Date&#xff09; 2&#xff0c;隐式转换&#xff1a;Na…

mv命令:移动、重命名文件或文件夹

linux使用mv命令来移动、重命名文件或文件夹。 例如&#xff0c;将一个名为abc.txt的文件重命名为1234.txt&#xff1a;mv abc.txt 1234.txt 例如&#xff0c;将目录A重命名为B&#xff1a;mv A B 例如&#xff0c;将a.txt移动到/b下&#xff0c;并重命名为c.txt&#xff1a…

MTK优美代码赏析6:电话本里的快速排序和插入排序算法

MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实用的例子说明为什么要教我们这个,所以考完试就把这些没用的东东给忘了..…

Visual C++中最常用的类与API函数

这篇文章能让初学者快速了解visual C MFC中常见的核心的类与函数&#xff0c;虽然全部看下来有点枯燥&#xff0c;但对初学者快速了解MFC的框架结构很有好处。 常用类 CArchive类&#xff1a;用于二进制保存档案 CBitmap类&#xff1a;封装Windows的图形设备接口(GDI)位图 CBru…

vim编译器的使用方法(行号、删除、复制、查找等)

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 vim是在Linux环境下的编辑器&#xff0c;它的常见使用操作如下。 1、显示行号 编辑器默认不显示行号&#xff0c;有二种办法可以显示行号。 &#xff08;1&#xff09;第一种是&#xff0c;暂时显示。在vim…

Imagination

Imagination Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8 Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There are four matrixs blow ,…

Day19 练习题

1.列举布尔值为False的值 0,[],{},(),False,’’,None 列如&#xff1a; if 0: 2.写函数&#xff1a; 根据范围获取其中被3和7整除的所有数的和&#xff0c;符合条件的数字个数以及符合条件的数字的总和 3.函数传递参数时&#xff0c;是否用的同一内存地址 name “hairui” de…

error U1087: cannot have : and :: dependents for same target

DDK下build -c错误:error U1087: cannot have : and :: dependents for same target 被build的source code所在path不能含有空格. 转载于:https://www.cnblogs.com/vcerror/p/4289079.html

网络通信基础常识

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、网络通信属于进程间通信 进程间通信的一种方法是使用套接字socket&#xff0c;网络通信其实就是位于网络中不同主机上面的2个进程之间的通信。 2、网络通信的层次 网络通信的层次&#xff0c;即…

Android NDK工程创建与编译运行

首发地址&#xff1a;http://www.eoeandroid.com/thread-201993-1-1.html一、 工程创建1. 创建一个Android工程配置好开发环境并加载好对应版本sdk后&#xff0c;选择菜单File->New-> Project创建工程&#xff0c;工程类型选择Android Project&#xff0c;如下图所示&…

[Quatsch]Quantum Or Optics

小生预言&#xff0c;鉴于目前CG产业中学术界与生产界之间的差异&#xff0c;未来必将有一门独立的学科&#xff0c;专门用于研究自然界的材质特性与表现&#xff0c;从此艺术界与学术界将呈现完美之统一&#xff0c;应该先在MIT或者Cornell出现。本人姑且将这门学科命名为“应…

Numbers

表示实数&#xff0c;Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此&#xff0c;用实数代替整数不会有什么误差&#xff08;除非数字大于100,000,000,000,000&#xff09;。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用…

查询命令:find、grep,which、whereis

一、find&#xff0c;查找某个文件的存放路径 find用来查找某个文件的存放位置。即你知道文件名字&#xff0c;但不知道放在哪里。 使用格式&#xff1a;“ find 查找路径 -name "要查找的文件名" ” 使用举例&#xff1a;find /etc -name "interfaces" ro…

C#事件 的讲解

一、事件的本质事件是软件系统里的两个子系统之间&#xff0c;或者两个模块之间&#xff0c;或者两个对象之间发送消息&#xff0c;并处理消息的过程。在面向对象的世界里&#xff0c;就可以统一认为是两个对象之间的行为。两个对象之间发送的这种消息&#xff0c;对发送方来讲…

phpMyAdmin密码设置

2019独角兽企业重金招聘Python工程师标准>>> 在使用phpMyAdmin操作数据库时&#xff0c;首先需要设置mysql的root用户的密码。具体操作参考前一篇博文。设置完mysql的root密码之后&#xff0c;需要对phpMyAdmin的登录进行一些配置。 未经配置的phpMyAdmin很不安全&a…

openjdk:8u22-jre-alpine在java开发中的NullPointerException错误解决方案

问题描述 ** 在SpringBoot项目中使用了Ureport报表组件, 打包发布部署到docker中启动报错 ** java.lang.NullPointerExceptionat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:…

例程:Linux下的socket演示程序2

本程序完成学生信息注册功能&#xff08;将学生信息存放到服务器&#xff09;。 服务器端&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.…

关于VC++6.0中getline函数的一个bug

关于VC6.0中getline函数的一个bug 最近在调试程序时&#xff0c;发现getline函数在VC6.0和其他编译器上运行结果不一样&#xff0c;比如有如下这段程序&#xff1a; #include <iostream> #include <string>using namespace std;int main(void) {string str;getline…

Nagios添加主机监控失败-故障小结

如果在/usr/local/nagios/etc/object 下自建hosts.cfg和services.cfg文件定义主机和服务后&#xff0c;在web界面只能查看到localhost主机&#xff0c;而看不到所要检测主机&#xff0c;这时候就要查看有没有在/usr/local/nagios/etc/nagios.cfg文件中加入自建文件hosts.cfg和s…

postgresql 数据表【转】

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2011/12/16/2290803.html 一、表的定义&#xff1a; 对于任何一种关系型数据库而言&#xff0c;表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。 1. 创建表&#xff1a; CREATE…