.net程序开发时你可以在nuget里面下载ServiceStackRedis包来完成操作redis的工作;
一、连接redis
(1)RedisClient RedisClient = new RedisClient("10.0.4.227", 6379);//redis服务IP和端口
(2)使用PooledRedisClientManager 连接缓冲池中获取连接,使用完毕后还给连接池
//[email protected]:6379 redis服务器和端口@前的是密码 string[] writeHosts = new string[] { "[email protected]:6379" }; string[] readerHosts = new string[] { "[email protected]:6379" }; PooledRedisClientManager RedisClientManager = new PooledRedisClientManager(writeHosts, readerHosts, new RedisClientManagerConfig { MaxWritePoolSize = 128,//“写”链接池链接数 MaxReadPoolSize = 128,//“读”链接池链接数 AutoStart = true, }); RedisClientManager.GetClient(); RedisClientManager.GetReadOnlyClient();//获取只读连接
redis所有的操作在IRedisClient里面:
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
HashSet
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
using (IRedisClient RClient = prcm.GetClient())
{
RClient.Add("c1", "缓存1");
RClient.Set("c1", "缓存2");
RClient.Replace("c1", "缓存3");
Response.Write(RClient.Get
RClient.Remove("c1");
Response.Write(RClient.Get
}
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
- 排序的List
(.Net 4.0后的SortedSet) - HashSet
关于如下4种类型数据的操作:
方法 |
说明 |
AddItemToList |
添加一个项到内部的List |
AddItemToSet |
添加一个项到内部的HashSet |
AddItemToSortedSet |
添加一个项到内部的排序List |
AddRangeToList |
一次过将参数中的List |
AddRangeToSet |
一次过将参数中的HashSet |
AddRangeToSortedSet |
一次过将参数中的List |
GetAllItemsFromList |
获取指定ListId的内部List |
GetAllItemsFromSet |
获取指定SetId的内部HashSet |
GetAllItemsFromSortedSet |
获取指定ListId的内部已排序List |
GetAllItemsFromSortedSetDesc |
获取指定ListId的内部已排序List |
GetRangeFromList |
获取指定ListId的内部List |
GetRangeFromSortedList |
获取指定ListId的内部已排序List |
GetRangeFromSortedSet |
获取指定SetId的内部HashSet |
GetRangeFromSortedSetByHighestScore |
获取指定SetId的内部HashSet |
GetRangeFromSortedSetByLowestScore |
同上,只不过是按score分值由低->高取一定范围内的数据 |
GetRangeFromSortedSetDesc |
按倒序获取内部HashSet |
GetRangeWithScoresFromSortedSet |
与From相同,只不过获取的是键值对,数据中带分值score |
GetRangeWithScoresFromSortedSetByHighestScore |
同上 |
GetRangeWithScoresFromSortedSetByLowestScore |
同上 |
GetRangeWithScoresFromSortedSetDesc |
同上 |
GetAllWithScoresFromSortedSet |
获取指定ListId的已排序的内部List |
GetSortedItemsFromList |
从指定ListId的List |
GetSortedEntryValues |
从指定ListId的List |
RemoveAllFromList |
移除指定ListId的内部List |
RemoveItemFromList |
移除指定ListId的内部List |
RemoveItemFromSet |
从指定SetId的内部HashSet |
RemoveItemFromSortedSet |
从指定ListId中已排序的内部List |
RemoveRangeFromSortedSet |
从指定ListId已排序的List |
RemoveRangeFromSortedSetByScore |
从指定ListId已排序的List |
RemoveStartFromList |
从指定ListId移除开头那一项 |
RemoveEndFromList |
从指定ListId移除末尾那项 |
BlockingRemoveStartFromList |
阻塞地从指定ListId移除开头那一项 |
BlockingRemoveStartFromLists |
|
RemoveEntry |
根据传入的多个ListId,清除多个内部List |
RemoveAllLuaScripts |
清除所有的 Lua 脚本缓存 |
RemoveEntryFromHash |
|
GetItemFromList |
根据ListId和下标获取一项 |
GetItemIndexInSortedSet |
根据List和值,获取内置的排序后的List |
GetItemIndexInSortedSetDesc |
同上,不过顺序相反 |
GetItemScoreInSortedSet |
根据传入的ListId和值获取内置List |
GetListCount |
根据ListId,获取内置的List |
GetSetCount |
根据SetId,获取内置的HashSet |
GetIntersectFromSets |
从输入的多个HashSet |
GetUnionFromSets |
从输入的多个HashSet |
GetRandomItemFromSet |
从指定ListId的集合中获取随机项 |
StoreUnionFromSets |
将多个HashSet |
StoreUnionFromSortedSets |
将多个SortedSet |
StoreIntersectFromSets |
将交集结果保存在第一个参数的集合中,对HastSet |
StoreIntersectFromSortedSets |
将交集结果保存在第一个参数的集合中,对SortedSet |
EnqueueItemOnList |
将一个元素存入指定ListId的List |
DequeueItemFromList |
将指定ListId的List |
BlockingDequeueItemFromList |
将指定ListId的List |
BlockingDequeueItemFromLists |
|
BlockingPopItemFromList |
阻塞地将指定ListId的List |
BlockingPopItemFromLists |
|
BlockingPopAndPushItemBetweenLists |
将第一个集合的元素移除并添加到第二个集合的头部,返回该元素,会同时阻塞两个集合 |
PopItemFromList |
从指定ListId的List |
PopItemFromSet |
从指定SetId的HashSet |
PopItemWithHighestScoreFromSortedSet |
从指定SetId的HashSet |
PopItemWithLowestScoreFromSortedSet |
从指定SetId的HashSet |
PopAndPushItemBetweenLists |
将第一个集合的元素移除并添加到第二个集合的头部 |
SetContainsItem |
判断指定SetId的HashSet |
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
//内部维护一个List
RClient.AddItemToList("蜀国", "刘备");
RClient.AddItemToList("蜀国", "关羽");
RClient.AddItemToList("蜀国", "张飞");
List
foreach (string str in ListString)
{
Response.Write(str); //输出 刘备 关羽 张飞
}
RClient.AddItemToSet("魏国", "曹操");
RClient.AddItemToSet("魏国", "曹操");
RClient.AddItemToSet("魏国", "典韦");
HashSet
foreach (string str in HashSetString)
{
Response.Write(str); //输出 典韦 曹操
}
下面再给一个范围Range操作示例:
//内部维护一个List
RClient.AddItemToSortedSet("蜀国", "刘备", 5);
RClient.AddItemToSortedSet("蜀国", "关羽", 2);
RClient.AddItemToSortedSet("蜀国", "张飞", 3);
IDictionary
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 |
代码示例:
RClient.SetEntryInHash("xxx","key","123");
List
KeyValuePair
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对象 |
IRedisTypedClient
IRedisTypedClient类相当于IRedicClient的强类型版,其方法与属性大多数与IRedisClient类似。
它支持在Redis中使用Linq查询的强大的类,它本身是一个泛型,IRedisClient的泛型方法As获得对象。
其方法原型如下:
IRedisTypedClient
1、IEntityStore
其中IRedisTypedClient这个类实现了这个接口IEntityStore
方法 | 说明 |
Delete | 根据实体删除一条记录 |
DeleteAll | 全部删除 |
DeleteById | 根据Id删除一条记录 |
DeleteByIds | 根据输入的多个Id删除多条记录 |
GetAll | 获取所有该类型的记录 |
GetById | 根据Id获取一条记录 |
GetByIds | 根据输入的多个Id获取多条记录 |
Store | 根据传入的实体,添加一条记录 |
StoreAll | 根据传入的实体集合,添加多条记录 |
Linq查询(针对于GetAll方法返回的IList
public ActionResult Index() { Person p1 = new Person() { Id = 1, Name = "刘备" }; Person p2 = new Person() { Id = 2, Name = "关羽" }; Person p3 = new Person() { Id = 3, Name = "张飞" }; Person p4 = new Person() { Id = 4, Name = "曹操" }; Person p5 = new Person() { Id = 5, Name = "典韦" }; Person p6 = new Person() { Id = 6, Name = "郭嘉" }; ListListPerson = new List () { p2,p3,p4,p5,p6 }; using (IRedisClient RClient = prcm.GetClient()) { IRedisTypedClient IRPerson = RClient.As (); IRPerson.DeleteAll(); //------------------------------------------添加-------------------------------------------- //添加单条数据 IRPerson.Store(p1); //添加多条数据 IRPerson.StoreAll(ListPerson); //------------------------------------------查询-------------------------------------------- //Linq支持 Response.Write(IRPerson.GetAll().Where(m => m.Id == 1).First().Name); //刘备 //注意,用IRedisTypedClient的对象IRPerson的Srore()添加的才能用IRPerson()方法读取 Response.Write(IRPerson.GetAll().First(m => m.Id == 2).Name); //关羽 //------------------------------------------删除-------------------------------------------- IRPerson.Delete(p1); //删除 刘备 Response.Write(IRPerson.GetAll().Count()); //5 IRPerson.DeleteById(2); //删除 关羽 Response.Write(IRPerson.GetAll().Count()); //4 IRPerson.DeleteByIds(new List { 3,4 }); //删除张飞 曹操 Response.Write(IRPerson.GetAll().Count()); //2 IRPerson.DeleteAll(); //全部删除 Response.Write(IRPerson.GetAll().Count()); //0 } return Content(""); }
另外,由于该接口并没有实现修改的方法,所以修改还得通过IRedisClient的实例:
public ActionResult Index() { PooledRedisClientManager prcm = new PooledRedisClientManager(new List() { "127.0.0.1" }, new List () { "127.0.0.1" }, RedisConfig); Person p1 = new Person() { Id = 1, Name = "刘备" }; Person p2 = new Person() { Id = 2, Name = "关羽" }; Person p3 = new Person() { Id = 3, Name = "张飞" }; Person p4 = new Person() { Id = 4, Name = "曹操" }; Person p5 = new Person() { Id = 5, Name = "典韦" }; Person p6 = new Person() { Id = 6, Name = "郭嘉" }; List ListPerson = new List () { p2,p3,p4,p5,p6 }; using (IRedisClient RClient = prcm.GetClient()) { IRedisTypedClient IRPerson = RClient.As (); IRPerson.StoreAll(ListPerson); //读取所有的Key List ListKeys = IRPerson.GetAllKeys(); foreach (string key in ListKeys) { Response.Write(key + "
"); } //修改的话只能通过Key修改 //urn:person:3 //urn:person:4 //urn:person:5 //ids:Person //urn:person:1 //urn:person:6 //urn:person:2 Person p7 = new Person() { Id = 8, Name = "撼地神牛" }; RClient.Set("urn:person:1", p7); Response.Write(IRPerson.GetAll().First(m => m.Id == 8).Name); //输出 撼地神牛 } return Content(""); }