Redis的Sorted Set的操作

本文介绍了Redis中SortedSet数据结构的应用场景与基本操作,通过案例展示了如何利用SortedSet实现热门帖子排行,有效节省数据库资源。

一、介绍

和Set一样,Sorted Set 也是string类型元素的集合,不同的是每个元素都会关联一个权。通过权值可以有序的的获取集合中的元素。

该Sorted Set 类型适合的场景:

获取热门帖子(回复量)信息: select * from message order by backnum desc limit 5;

(以上的需求可以通过简单的sql语句完成,但是sql语句比较耗费Mysql数据库资源)

排序集合中的每个元素都是值、权的组合。之前的set集合类型每个元素都是只有一个值。

案例:我们做一个sorted set排序集合,里面只保留5个元素信息,该5个元素是回复量最高的,并且每个帖子被回复的时候,都是有机会进入到该排序集合中的,但是只有回复量最高的前5个帖子才会存在于这个集合中。


二、操作

1. zadd  key source member    向key的zset中添加元素member,score用于排序。如果该元素存在,则更新其排序。



2. zrevrange  key  start  end   返回名称为key的zset(按score从大到小顺序排序)中的index从start到end的所有元素。



3. zremrangebyrank  key  min  max        删除集合中排名在给定区间中的元素(按照权值从小到大排列)。







### Redis Sorted Set 使用教程及操作命令 #### 连接至 Redis 服务器并初始化客户端 为了在 .NET 应用程序中使用 Redis Sorted Set,需先建立与 Redis 服务端的连接。通常借助 StackExchange.Redis 客户端库完成此过程[^1]。 ```csharp using StackExchange.Redis; // 创建连接配置对象 var config = ConfigurationOptions.Parse("localhost"); ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(config); IDatabase db = redis.GetDatabase(); ``` #### 添加元素到 Sorted Set 利用 `zadd` 方法向指定名称的 sorted set 中插入带有权重的新成员项。如果该成员已存在,则更新其对应的 score 值[^2]。 ```csharp await db.SortedSetAddAsync("mySortedSet", new[] { new SortedSetEntry("memberA", 80), new SortedSetEntry("memberB", 95) }); ``` #### 获取特定范围内元素列表 可调用 `SortedSetRangeByRank` 函数按排名顺序检索给定区间内的全部条目;亦可通过设置参数改变默认升序行为为降序排列。 ```csharp var itemsAsc = await db.SortedSetRangeByRankWithScoresAsync("mySortedSet", 0, -1); // 升序取全量数据 foreach (var item in itemsAsc) Console.WriteLine($"{item.Element}: {item.Score}"); ``` #### 查询某成员的具体位置(排名) 对于已经存在于集合中的任意 member ,能够通过执行 `SortedSetRank` API 获得它所处的位置索引值,注意这里的 index 是基于零开始计数且支持双向排序选项。 ```csharp long? rankOfMemberX = await db.SortedSetRankAsync("mySortedSet", "memberX"); // 查找 'memberX' 排名 if(rankOfMemberX != null){ Console.WriteLine($"The rank of member X is {rankOfMemberX}."); } ``` #### 删除单个或者多个成员 当不再需要某些元素时,可以采用 `SortedSetRemove` 或者批量移除模式下的 `SortedSetRemoveRangeByScore/SortedSetRemoveRangeByRank` 来清理目标记录。 ```csharp bool removedSuccessfully = await db.SortedSetRemoveAsync("mySortedSet", "memberToRemove"); Console.WriteLine(removedSuccessfully ? "Removed successfully!" : "Failed to remove."); ``` #### 统计当前集合大小 最后,若想获知现有 sorted set 内含有的总数量级,只需简单地请求一次 `SortedSetLength` 操作即可得到确切数目。 ```csharp long count = await db.SortedSetLengthAsync("mySortedSet"); Console.WriteLine($"Total members: {count}"); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值