.net6.0-使用CSRedisCore

发布时间 2023-04-27 11:12:14作者: 一只向上爬的小蜗牛

一、安装CSRedisCore

二、创建链接、初始化

//创建链接
var csRedis = new CSRedis.CSRedisClient("127.0.0.1:6379,password="",defaultDatabase=1,poolsize=50,ssl=false,writeBuffer=10240");
//初始化RedisHelper
RedisHelper.Initialization(csRedis);

三、使用

1.字符串(string)

//添加字符串键值对
RedisHelper.Set("name", "张三");

//根据键获取对应的值
RedisHelper.Get<String>("name");

//在指定key的value末尾追加字符串
RedisHelper.Append("name", "你好");

//移除元素
RedisHelper.Del("name");

 

2.列表(list)

 列表可以有序的存储多个字符串等操作, 列表是通过链表来实现的,所以它添加新元素的速度非常快。

// 从右端推入元素
RedisHelper.RPush("my-list", "item1", "item2", "item3", "item4");
// 从右端弹出元素
RedisHelper.RPop("my-list");
// 从左端推入元素
RedisHelper.LPush("my-list", "leftPushItem");
// 从左端弹出元素
RedisHelper.LPop("my-list");

// 遍历链表元素(start:0,end:-1即可返回所有元素)
foreach (var item in RedisHelper.LRange("my-list", 0, -1))
{
Console.WriteLine(item);
}
Console.WriteLine("------");

// 按索引值获取元素(当索引值大于链表长度,返回空值,不会报错)
Console.WriteLine($"{RedisHelper.LIndex("my-list", 1)}");
Console.WriteLine("------");

//修剪指定范围内的元素(start: 0,end: 1)
RedisHelper.LTrim("my-list", 0, 1);
foreach (var item in RedisHelper.LRange("my-list", 0, -1))
{
Console.WriteLine(item);
}

运行结果:

 

3.集合(set)

集合以无序的方式存储各不相同的元素,也就是说在集合中的每个元素的Key都不重复。在redis中可以快速地对集合执行添加、移除等操作。

// 实际上只插入了两个元素("item1","item2")
RedisHelper.SAdd("my-set", "item1", "item1", "item2");

// 集合的遍历
foreach (var item in RedisHelper.SMembers("my-set"))
{
Console.WriteLine($"集合成员:{item}");
}

// 判断元素是否存在
string member = "item1";
Console.WriteLine($"{member}是否存在:{RedisHelper.SIsMember("my-set", member)}");


// 移除元素
RedisHelper.SRem("my-set", member);
Console.WriteLine($"{member}是否存在:{RedisHelper.SIsMember("my-set", member)}");

运行结果:

 4.哈希(hash)

 在redis中我们可以使用哈希将多个键-值对存储在一个redis键上,从而达到将一系列相关数据存放在一起的目的。例如添加一个redis键Article:1001,然后在这个键中存放ID为1001的文章的标题、作者等信息。我们可以把这样数据集看作是关系数据库中的行。

//将哈希表 key 中的字段 field 的值设为 value
RedisHelper.HSet("ArticleID:10001", "Title", "在.NET Core中使用CSRedis");
RedisHelper.HSet("ArticleID:10001", "Author", "张三");

//获取存储在哈希表中指定字段的值
Console.WriteLine(RedisHelper.HGet("ArticleID:10001", "Title"));

Console.WriteLine("------");

//获取在哈希表中指定 key 的所有字段和值
foreach (var item in RedisHelper.HGetAll("ArticleID:10001"))
{
Console.WriteLine($"字段:{item.Key},值:{item.Value}");
}

Console.WriteLine("------");

//查看哈希表 key 中,指定的字段是否存在
Console.WriteLine(RedisHelper.HExists("ArticleID:10001", "Title"));

运行结果:

 HGetHSet方法执行一次只能处理一个键值对,而HMGetHMSet是他们的多参数版本,一次可以处理多个键值对。

var keys = new string[] { "Title", "Author" };
//获取存储在哈希表中多个字段的值
foreach (var item in RedisHelper.HMGet("ArticleID:10001", keys))
{
Console.WriteLine(item);
}

 运行结果:

 虽然使用HGetAll可以取出所有的value,但是有时候哈希表包含的值可能非常大,容易造成服务器的堵塞,为了避免这种情况,我们可以使用HKeys取到哈希表的所有键(HVals可以取出所有值),然后再使用HGet方法一个一个地取出键对应的值。

//获取所有哈希表中的字段
foreach (var item in RedisHelper.HKeys("ArticleID:10001"))
{
Console.WriteLine($"{item} - {RedisHelper.HGet("ArticleID:10001", item)}");
}

运行结果:

 和处理字符串一样,我们也可以对哈希表中的值进行自增、自减操作,原理同字符串是一样的。

RedisHelper.HSet("ArticleID:10001", "Votes", "257");
//为哈希表 key 中的指定字段的整数值加上增量 increment
RedisHelper.HIncrBy("ArticleID:10001", "Votes", 40);

Console.WriteLine(RedisHelper.HGet("ArticleID:10001", "Votes"));

运行结果:297

 

5.有序集合

 有序集合可以看作是可排序的哈希,不过有序集合的val成为score分值,集合内的元素就是基于score进行排序的,score以双精度浮点数的格式存储。

//向有序集合添加元素
RedisHelper.ZAdd("Quiz", (79, "Math"));
RedisHelper.ZAdd("Quiz", (98, "English"));
RedisHelper.ZAdd("Quiz", (99 ,"lgorithm"));
RedisHelper.ZAdd("Quiz", (84, "Database"));
RedisHelper.ZAdd("Quiz", (59, "Operation System"));

//获取有序集合的成员数量
Console.WriteLine(RedisHelper.ZCard("Quiz"));
Console.WriteLine("------");

//获取集合中指定范围(90~100)的元素集合
foreach (var item in RedisHelper.ZRangeByScore("Quiz", 90, 100))
{
Console.WriteLine(item);
}
Console.WriteLine("------");

//获取集合所有元素并升序排序
foreach (var item in RedisHelper.ZRangeWithScores("Quiz", 0, -1))
{
Console.WriteLine($"成员:{item.member},分数:{item.score}");
}

运行结果:

//移除集合中的元素
RedisHelper.ZRem("Quiz", "Math");
Console.WriteLine(RedisHelper.ZScore("Quiz", "Math").HasValue);

运行结果:

 

6.管道(pipeline)

redis的事务可以通过pipeline实现的,使用pipeline时,客户端会自动调用MULTIEXEX命令,将多条命令打包并一次性地发送给redis,然后redis再将命令的执行结果全部打包并一次性返回给客户端,这样有效的减少了redis与客户端的通信次数,提升执行多次命令时的性能。

var pipe = RedisHelper.StartPipe();
for (int i = 0; i < 8; i++)
{
pipe.IncrBy("key-one"); // 将key-one中的值自增COUNT次,产生了COUNT条IncrBy命令
}
pipe.EndPipe(); // 在管道结束的位置,将COUNT条命令一次性发送给redis
Console.WriteLine($"{RedisHelper.Get("key-one")}");

运行结果:8

需要特别说明的是,redis中的事务不同于数据库的事务,如果执行命令期间发生错误,redis并不会回滚。

7.Key的过期

redis还允许我们为key设置有效期,当key过期之后,key就不存在了。

RedisHelper.Set("MyKey", "hello,world",5);
Console.WriteLine(RedisHelper.Get("MyKey"));

Thread.Sleep(6000); // 暂停6秒

Console.WriteLine(RedisHelper.Exists("MyKey"));

运行结果:

 

本文参考自https://www.cnblogs.com/xscape/p/10208638.html