通过nuget安装ServiceStack.Redis
demo
using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RedisApp
{
public class RedisStore
{
public static bool Save(string host, string key, string value)
{
bool isSuccess = false;
using (RedisClient redisClient = new RedisClient(host))
{
//if (redisClient.Get<string>(key) == null)
//{
isSuccess = redisClient.Set(key, value);
//}
}
return isSuccess;
}
public static bool hash(string host, string key, string value)
{
bool isSuccess = false;
using (RedisClient redisClient = new RedisClient(host))
{
isSuccess = redisClient.SetEntryInHash("test", "test", "{\"name\":\"chen\"}");
}
return isSuccess;
}
public static string Get(string host, string key)
{
using (RedisClient redisClient = new RedisClient(host))
{
return redisClient.Get<string>(key);
}
}
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RedisApp
{
class Program
{
static void Main(string[] args)
{
string host = "127.0.0.1";
int port = 6379;
RedisStore.Save(host, "123", "123");
RedisStore.hash(host, "123", "123");
}
}
}
一、属性
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)访问一个字符串类型值
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)访问一个字符串类型值 |
2、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 |
简单功能
当然,除了实现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
| 方法 | 说明 |
|---|---|
| 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 | 将元素从一个集合移动到另一个集合的开头。(删除与添加) |
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不存在则添加,存在则覆盖 |
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对象 |