来源: .net 5.0 – 使用CSRedisCore操作redis – gygtech – 博客园
为什么选择CSRedisCore
ServiceStack.Redis 是商业版,免费版有限制;
StackExchange.Redis 是免费版,但是内核在 .NETCore 运行有问题经常 Timeout,暂无法解决;
CSRedis于2016年开始支持.NETCore一直迭代至今,实现了低门槛、高性能,和分区高级玩法的.NETCore redis-cli SDK;
在v3.0版本更新中,CSRedis中的所有方法名称进行了调整,使其和redis-cli保持一致,如果你熟悉redis-cli的命令的话,CSRedis可以直接上手,这样学习成本就降低很多。
如何集成:引用和配置
- 引用包
|
1
|
CSRedisCore |
- appsettings.json
|
1
2
3
4
5
6
7
8
9
10
|
{ //Redis服务配置 "Redis": { "Default": { "Connection": "192.168.1.101:6379", "InstanceName": "local", "DefaultDB": 0 } }} |
如何集成:redis 控制台 引用方式
- 初始化
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using CSRedis;namespace RedisCommon{ public class RedisInit { public static void RedisInitialization() { string connection = Appsettings.Instance.GetByKey("Redis:Default:Connection"); string defaultDB = Appsettings.Instance.GetByKey("Redis:Default:DefaultDB"); var csRedis = new CSRedisClient($"{connection},defaultDatabase={defaultDB},prefix=test"); RedisHelper.Initialization(csRedis); } }} |
|
1
2
3
4
5
|
static void Main(string[] args){ //初始化Redis RedisInit.RedisInitialization(); } |
如何集成:redis webapi 引用方式
- StartUp类配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/// <summary>/// 初始化Redis缓存/// </summary>private void InitRedis(){ //redis缓存 var section = Configuration.GetSection("Redis:Default"); //连接字符串 string _connectionString = section.GetSection("Connection").Value; //默认数据库 int _defaultDB = int.Parse(section.GetSection("DefaultDB").Value ?? "0"); var csredis = new CSRedis.CSRedisClient($"{_connectionString},defaultDatabase={_defaultDB},idleTimeout=3000,poolsize=5,prefix=GYG-API:KEY_"); RedisHelper.Initialization(csredis);} |

链接字符串详解
127.0.0.1:6379,password=YourPassword,defaultDatabase=0,prefix=hr_
| Parameter | Default | Explain | 说明 |
| password | <Empty> | Redis server password | Redis服务器密码 |
| defaultDatabase | 0 | Redis server database | Redis服务器数据库 |
| asyncPipeline | false | The asynchronous method automatically uses pipeline, and the 10W concurrent time is 450ms (welcome to feedback) | 异步方式自动使用管道,10W并发时间450ms(欢迎反馈) |
| poolsize | 50 | Connection pool size | 连接池大小 |
| idleTimeout | 20000 | idle time of elements in the connection pool(MS),suitable for connecting to remote redis server | 连接池中元素的空闲时间(MS),适合连接到远程redis服务器 |
| connectTimeout | 5000 | Connection timeout(MS) | 连接超时(毫秒) |
| syncTimeout | 10000 | Send / receive timeout(MS) | 发送/接收超时(毫秒) |
| preheat | 5 | Preheat connections, receive values such as preheat = 5 preheat 5 connections | 预热连接,接收值,例如Preheat=5 Preheat 5 connections |
| autoDispose | true | Follow system exit event to release automatically | 跟随系统退出事件自动释放 |
| ssl | false | Enable encrypted transmission | 启用加密传输 |
| testcluster | true | 是否尝试集群模式,阿里云、腾讯云集群需要设置此选项为false | |
| tryit | 0 | Execution error, retry attempts | 执行错误,重试次数 |
| name | <Empty> | Connection name, use client list command to view | 连接名称,使用client list命令查看 |
| prefix | <Empty> | key前缀,所有方法都会附带此前缀,csredis.Set(prefix + “key”, 111); |
0、通用指令
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//查找所有分区节点中符合给定模式(pattern)的 keystring[] keyAll = RedisHelper.Keys("*"); //以秒为单位,返回给定 key 的剩余生存时间long ttl1 = RedisHelper.Ttl("keyString1");//用于在 key 存在时删除 keylong del1 = RedisHelper.Del("keyString1");//检查给定 key 是否存在bool isExists1 = RedisHelper.Exists("keyString1");//为给定 key 设置过期时间bool isExpire1 = RedisHelper.Expire("keyString1", 100);//为给定 key 设置过期时间RedisHelper.ExpireAt("keyString1", new DateTime(2021, 6, 11, 16, 0, 0)); |
1、string(字符串)
- 简单操作
|
1
2
3
4
5
6
7
8
9
10
11
|
// 设置指定 key 值,默认不过期bool set_string1 = RedisHelper.Set("keyString_String1", "测试值1");// 设置指定 key 值,并设置过期时间(单位:秒)bool set_string2 = RedisHelper.Set("keyString_String2", "测试值2", 1);// 获取指定 key 的值,不存在的 key,值返回nullstring get_string1 = RedisHelper.Get("keyString_String1");// 获取指定 key 的值,不存在的 key,或者指定的 key 不是int型,则返回int类型的默认值0int get_int1 = RedisHelper.Get<int>("keyString_String1"); |
- 对整数类型进行自增,自减操作
|
1
2
3
4
5
6
7
|
bool set_int1 = RedisHelper.Set("keyString_Num1", "23");// 将 key 所储存的值加上指定的增量值(increment)long incrBy1 = RedisHelper.IncrBy("keyString_Num1", 2);// #25// 将 key 所储存的值加上指定的增量值(increment),负数就是减量值long incrBy2 = RedisHelper.IncrBy("keyString_Num1", -1);// #24 |
- 在指定 key 的 value 末尾追加字符串
|
1
2
3
4
|
bool set_append1 = RedisHelper.Set("keyString_Append1", "qaz", 30);// 将指定的 value 追加到该 key 原来值(value)的末尾long append1 = RedisHelper.Append("keyString_Append1", "wsx");// #6 结果:key 中字符串的长度 |
2、hash(哈希)
- #HSet、HGet、HDel方法 [只能处理一个键值对]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 将哈希表 key 中的字段 field 的值设为 valuebool set_hash_user1_uname = RedisHelper.HSet("User:10001", "uname", "gongyg"); // 冒号的作用相当于创建一个文件夹bool set_hash_user1_upwd = RedisHelper.HSet("User:10001", "upassword", "123456");bool set_hash_user1_uid = RedisHelper.HSet("User:10001", "uid", "12");// 获取存储在哈希表中指定字段的值string uName = RedisHelper.HGet("User:10001", "uname");// 获取存储在哈希表中指定字段的值,并指定类型int uId = RedisHelper.HGet<int>("User:10001", "uid");// 删除一个或多个哈希表字段,不能删除keylong hDel1 = RedisHelper.HDel("User:10001", "uname"); |
- #HGetAll、HKeys、HVals
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 获取在哈希表中指定 key 的所有字段和值Dictionary<string, string> user10001 = RedisHelper.HGetAll("User:10001");foreach (var item in user10001){ string key = item.Key; string value = item.Value;}// 获取所有哈希表中的字段 [虽然使用HGetAll可以取出所有的value,但是有时候散列包含的值可能非常大,容易造成服务器的堵塞,为了避免这种情况,我们可以使用HKeys取到散列的所有键(HVals可以取出所有值),然后再使用HGet方法一个一个地取出键对应的值。]string[] fields = RedisHelper.HKeys("User:10001");foreach (string item in fields){ string val = RedisHelper.HGet("User:10001", item);}// 获取哈希表中所有的值string[] vals = RedisHelper.HVals("User:10001"); |
- #HMSet、HMGet [HGet和HSet方法执行一次只能处理一个键值对,而HMGet和HMSet是他们的多参数版本,一次可以处理多个键值对。]
|
1
2
3
4
5
6
7
8
|
//var keyValues = dic.Select(a => new [] { a.Key, a.Value.ToString() }).SelectMany(a => a).ToArray();string[] user2 = new string[] { "uname", "gmd", "upwd", "123" };// 同时将多个field-value(域-值)对设置到哈希表 key 中bool set_hash_user2 = RedisHelper.HMSet("User:10002", user2);string[] user_get2 = new string[] { "uname", "upwd", "sj" };// 获取存储在哈希表中多个字段的值string[] user_val2 = RedisHelper.HMGet("User:10002", user_get2); // #gmd,123, |
- #对散列中的值进行自增、自减操作
|
1
2
3
4
|
bool set_hash_user1_usex = RedisHelper.HSet("User:10003", "uage", "23");// 为哈希表 key 中的指定字段和整数值加上增量(increment)自增(正数),自减(负数)long hIncrBy = RedisHelper.HIncrBy("User:10001", "uage", 2); |
3、list(列表)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 将一个或多个值插入到列表头部string[] lpush1 = new string[] { "003", "004" };long len1 = RedisHelper.LPush("list", "000");long len2 = RedisHelper.LPush("list", "001", "002");long len3 = RedisHelper.LPush("list", lpush1);// 在列表中添加一个或多个值 [列表尾部]long len4 = RedisHelper.RPush("list", "010");// 移除并获取列表的第一个元素string val1 = RedisHelper.LPop("list");// 移除并获取列表的最后一个元素string val2 = RedisHelper.RPop("list");// 获取列表指定范围内的元素[key, start, stop]string[] lrang1 = RedisHelper.LRange("list", 0, 2); // #左侧开始,获取前3个元素string[] lrang2 = RedisHelper.LRange("list", 0, -1); // #左侧开始,获取全部元素// 将 list 最后一个元素弹出并压入 list_another 的头部 [只有一个元素的改变,源列表会少一个元素,目标列表多出一个元素]RedisHelper.RPopLPush("list", "list_another");RedisHelper.Expire("list_another", 30); |
4、set(无序集合)
- #对集合中的成员进行操作
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// 向集合添加一个或多个成员 [返回添加成功个数]long sadd1 = RedisHelper.SAdd("my_set", "qaz");long sadd2 = RedisHelper.SAdd("my_set", "tgb", "yhn");string[] set1 = new string[] { "wsx", "edc" , "rfv" };long sadd3 = RedisHelper.SAdd("my_set", set1);// 判断 member 元素是否是集合 key 的成员bool isMember = RedisHelper.SIsMember("my_set", "qaz");// 返回集合中的所有成员string[] members = RedisHelper.SMembers("my_set");// 返回集合中的一个随机成员string member1 = RedisHelper.SRandMember("my_set");// 移除集合中一个或多个成员long sRem = RedisHelper.SRem("my_set", "qaz");// 移除并返回集合中一个随机成员string member2 = RedisHelper.SPop("my_set"); |
- #对两个集合进行交、并、差操作
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
RedisHelper.SAdd("set-a", "item1", "item2", "item3", "item4", "item5");RedisHelper.SAdd("set-b", "item2", "item5", "item6", "item7");// 差集RedisHelper.SDiff("set-a", "set-b"); // "item1", "item3","item4"// 交集RedisHelper.SInter("set-a", "set-b"); // "item2","item5"// 并集RedisHelper.SUnion("set-a", "set-b"); // "item1","item2","item3","item4","item5","item6","item7"//#另外还可以用SDiffStore,SInterStore,SUnionStore将操作后的结果存储在新的集合中。 |
5、zset(sorted set:有序集合)
- 有序集合可以看作是可排序的散列,不过有序集合的val成为score分值,集合内的元素就是基于score进行排序的,score以双精度浮点数的格式存储。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// 向有序集合添加一个或多个成员,或者更新已存在成员的分数RedisHelper.ZAdd("sorted_set", (1, "beijing"));RedisHelper.ZAdd("sorted_set", (2, "shanghai"), (3, "shenzhen"));(decimal, object)[] set1 = new (decimal, object)[] { (4, "guangzhou"), (5, "tianjing"), (6, "chengdu") };RedisHelper.ZAdd("sorted_set", set1);// 有序集合中对指定成员的分数加上增量 incrementdecimal incr = RedisHelper.ZIncrBy("sorted_set", "beijing", -2);// 通过索引区间返回有序集合成指定区域内的成员,分数从低到高 [key, start, stop]string[] zRange1 = RedisHelper.ZRange("sorted_set", 0, 2);string[] zRange2 = RedisHelper.ZRange("sorted_set", 0, -1); // #stop=-1返回全部// 返回有序集合中指定区域内的成员,通过索引,分数从高到底 [key, start, stop]string[] zRevRange1 = RedisHelper.ZRevRange("sorted_set", 0 , 2);string[] zRevRange2 = RedisHelper.ZRevRange("sorted_set", 0, -1); // #stop=-1返回全部// 移除有序集合中一个或多个成员RedisHelper.ZRem("sorted_set", "shenzhen");// 获取有序集合的成员数量long number = RedisHelper.ZCard("sorted_set");// 通过分数返回有序集合指定区间内的成员string[] ZRangByScore1 = RedisHelper.ZRangeByScore("sorted_set", 2, 4);// 通过索引区间返回有序集合成指定区间内的成员和分数(string member, decimal score)[] sets = RedisHelper.ZRangeWithScores("Quiz", 0, -1); |
6、Geo(经纬度)
|
1
2
3
4
5
6
|
//1. 添加地点经纬度 [存储到 sorted set 中]RedisHelper.GeoAdd("myLocation", Convert.ToDecimal(116.20), Convert.ToDecimal(39.56), "北京");RedisHelper.GeoAdd("myLocation", Convert.ToDecimal(120.51), Convert.ToDecimal(30.40), "上海");//2. 求两点之间的距离var d1 = RedisHelper.GeoDist("myLocation", "北京", "上海", GeoUnit.km); |
7、事务
|
1
2
3
4
5
6
7
8
|
// 开启事务var pipe = RedisHelper.StartPipe();//中间对redis进行操作pipe.Set("pipe1", "wsx");// 提交pipe.EndPipe(); |
Mikel