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牛客高光时刻##牛客创作赏金赛#