Redis 有序集合(Sorted Set)

命令 描述 语法
ZADD 向有序集合中添加一个或多个成员,或者更新已存在成员的分数 `ZADD key [NX
ZRANGE 通过索引区间返回有序集合指定区间内的成员,按分数从小到大排序 ZRANGE key start stop [WITHSCORES]
- start:起始索引(包含),0 表示第一个成员。
- stop:结束索引(包含), -1 表示最后一个成员。
- WITHSCORES:可选参数,返回结果时包含成员的分数。
ZREVRANGE 通过索引区间返回有序集合指定区间内的成员,按分数从大到小排序 ZREVRANGE key start stop [WITHSCORES]
- start:起始索引(包含),0 表示第一个成员。
- stop:结束索引(包含), -1 表示最后一个成员。
- WITHSCORES:可选参数,返回结果时包含成员的分数。
ZRANGEBYSCORE 返回有序集合中指定分数区间内的成员,按分数从小到大排序 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- min:分数下限,可以使用 ( 表示不包含该值。
- max:分数上限,可以使用 ( 表示不包含该值。
- WITHSCORES:可选参数,返回结果时包含成员的分数。
- LIMIT offset count:可选参数,用于分页,offset 表示偏移量,count 表示返回的数量。
ZREVRANGEBYSCORE 返回有序集合中指定分数区间内的成员,按分数从大到小排序 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- max:分数上限,可以使用 ( 表示不包含该值。
- min:分数下限,可以使用 ( 表示不包含该值。
- WITHSCORES:可选参数,返回结果时包含成员的分数。
- LIMIT offset count:可选参数,用于分页,offset 表示偏移量,count 表示返回的数量。
ZRANK 返回有序集合中指定成员的排名(从 0 开始,分数从小到大排序) ZRANK key member
ZREVRANK 返回有序集合中指定成员的排名(从 0 开始,分数从大到小排序) ZREVRANK key member
ZSCORE 返回有序集合中指定成员的分数 ZSCORE key member
ZINCRBY 为有序集合中的成员增加指定的分数 ZINCRBY key increment member
- increment:增加的分数,可以为负数。
ZCARD 获取有序集合的成员数量 ZCARD key
ZCOUNT 计算有序集合中指定分数区间内的成员数量 ZCOUNT key min max
- min:分数下限,可以使用 ( 表示不包含该值。
- max:分数上限,可以使用 ( 表示不包含该值。
ZREM 从有序集合中移除一个或多个成员 ZREM key member1 [member2 ...]
ZREMRANGEBYRANK 移除有序集合中指定排名区间内的所有成员 ZREMRANGEBYRANK key start stop
- start:起始排名(包含),0 表示第一个成员。
- stop:结束排名(包含)。
ZREMRANGEBYSCORE 移除有序集合中指定分数区间内的所有成员 ZREMRANGEBYSCORE key min max
- min:分数下限,可以使用 ( 表示不包含该值。
- max:分数上限,可以使用 ( 表示不包含该值。

场景示例

1. 排行榜

以游戏玩家的积分排行榜为例,玩家 ID 作为成员,积分作为分数。

更新玩家积分(Java 代码示例)

import redis.clients.jedis.Jedis;

public class PlayerScoreUpdater {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String leaderboardKey = "game:leaderboard";
        String playerId = "player:123";
        double newScore = 1500;

        // 添加或更新玩家的积分
        jedis.zadd(leaderboardKey, newScore, playerId);
        System.out.println("玩家 " + playerId + " 的积分更新为 " + newScore);

        jedis.close();
    }
}

获取排行榜前 10 名(Java 代码示例)

import redis.clients.jedis.Jedis;
import java.util.Set;

public class LeaderboardFetcher {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String leaderboardKey = "game:leaderboard";

        // 获取排行榜前 10 名(按分数从高到低)
        Set<String> top10Players = jedis.zrevrange(leaderboardKey, 0, 9);
        System.out.println("排行榜前 10 名: " + top10Players);

        jedis.close();
    }
}

获取玩家排名(Java 代码示例)

import redis.clients.jedis.Jedis;

public class PlayerRankFetcher {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String leaderboardKey = "game:leaderboard";
        String playerId = "player:123";

        // 获取玩家的排名(按分数从高到低)
        Long rank = jedis.zrevrank(leaderboardKey, playerId);
        if (rank != null) {
            System.out.println("玩家 " + playerId + " 的排名是 " + (rank + 1));
        } else {
            System.out.println("玩家 " + playerId + " 不在排行榜中");
        }

        jedis.close();
    }
}

2. 热门列表

假设我们要维护一个文章热门列表,根据文章的阅读量作为分数来排序。

更新文章阅读量(Java 代码示例)

import redis.clients.jedis.Jedis;

public class ArticleViewUpdater {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String popularArticlesKey = "article:popular";
        String articleId = "article:456";
        double viewIncrement = 10;

        // 增加文章的阅读量(假设每次有 10 次新阅读)
        jedis.zincrby(popularArticlesKey, viewIncrement, articleId);
        System.out.println("文章 " + articleId + " 的阅读量增加了 " + viewIncrement);

        jedis.close();
    }
}

获取热门文章列表(Java 代码示例)

import redis.clients.jedis.Jedis;
import java.util.Set;

public class PopularArticleFetcher {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String popularArticlesKey = "article:popular";

        // 获取阅读量超过 1000 的热门文章(按阅读量从高到低)
        Set<String> popularArticles = jedis.zrevrangeByScore(popularArticlesKey, "+inf", "1000");
        System.out.println("热门文章列表: " + popularArticles);

        jedis.close();
    }
}
#我的2024牛客高光时刻##牛客创作赏金赛#
全部评论

相关推荐

04-06 14:27
武汉大学 后端
分享面经,积攒好运🙏自我介绍你说你本科做项目,做什么项目?你这个项目是怎么用到RPC的?RPC和我直接用http调用restful接口有什么区别?有什么优点?restful接口不能做负载均衡吗?现在很多框架代码都可以一键生成调用代码,为啥还需要费劲写一个RPC框架呢?你一开始就分表吗?怎么评估的?分表策略是什么?分片键是什么?你知道有几种分表方式?你分了几个表?如果后期要做动态扩展,就是本来分了16个表,要改成64个表,你怎么做?如何最小化数据迁移量?rehash很耗时怎么办?分布式hash了解吗?你说一下一致性hash你数据怎么统计的?后续准备怎么使用它们?你的统计记录按什么分片来着?假如他没有分表,然后又想根据分组ID去查出来一个分组的一个列表。怎么解决?这个redisson是单机锁,还是分布式锁?你的redis单机部署还是分布式部署?你说说redisson的这个分布式锁是怎么实现的?redlock知道吗?你前面提到这个2kw分表,这个量级怎么得出的?了解过吗?智力题:一个质量分布不均的硬币,正面概率0.3,反面概率0.7,如何用他来实现公平的决策?手撕:K个一组反转链表一般你是怎么学习一个语言的?了解过ai不?ai对你生活有什么改变吗?minus好像最近挺火的?主要是用chatBot吗?别的用过没?部署过大模型没?反问
查看23道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务