-
2020-12-20 13:16:05
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
实例
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
在以上实例中我们通过命令 ZADD 向 redis 的有序集合中添加了三个值并关联上分数。
Redis 有序集合命令
下表列出了 redis 有序集合的基本命令:
更多相关内容 -
使用Redis有序集合实现IP归属地查询详解
2020-09-09 04:21:28主要介绍了使用Redis有序集合实现IP归属地查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Redis有序集合类型的操作_动力节点Java学院整理
2020-12-16 03:51:46今天我们说一下Redis中最后一个数据类型 “有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个世界上都... -
【Redis学习笔记】08.Redis 有序集合基本操作
2022-03-10 16:20:25Redis 有序集合基本操作1. 有序集合常用命令2. 添加有序集合3. 计算成员个数4. 查看成员分数5. 按照降序查看成员名次(从0开始)6. 按照升序查看成员名次(从0开始)7. 删除成员8. 返回指定排名范围的成员9. 返回...Redis 有序集合基本操作
1. 有序集合常用命令
命令 含义 用法 ZADD 创建有序集合 ZADD key ZCARD 查看有序集合成员格式 ZCARD key SDIFF 查看成员 ZSCORE key member ZRANK 按照降序查看成员名次 ZRANK key member ZREVRANK 按照升序查看成员名次 ZREVRANK key member ZREM 删除有序集合中成员 ZREM key member [member …] ZRANGE 查看有序集合中指定范围集合 ZRANGE key start stop [WITHSCORES] ZRANGEBYSCORE 返回指定分数范围的成员 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] ZINCRBY 增加成员分数 ZINCRBY key increment member 2. 添加有序集合
语法:
ZADD class1:redis 100 zhangsan ZADD class1:redis 20 lisi ZADD class1:redis 99 wangwu
3. 计算成员个数
语法:
ZCARD key
127.0.0.1:6379> ZCARD class1:redis (integer) 3
4. 查看成员分数
语法:
ZSCORE key member
127.0.0.1:6379> ZSCORE class1:redis lisi "20"
5. 按照降序查看成员名次(从0开始)
语法:
ZRANK key member
127.0.0.1:6379> ZRANK class1:redis lisi (integer) 0
6. 按照升序查看成员名次(从0开始)
语法:
ZREVRANK key member
127.0.0.1:6379> ZREVRANK class1:redis lisi (integer) 2
7. 删除成员
语法:
ZREM key member [member ...]
127.0.0.1:6379> ZREM class1:redis lisi (integer) 1
8. 返回指定排名范围的成员
语法:
ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> ZRANGE class1:redis 0 -1 1) "wangwu" 2) "zhangsan" 127.0.0.1:6379> ZRANGE class1:redis 0 -1 WITHSCORES 1) "wangwu" 2) "99" 3) "zhangsan" 4) "100"
9. 返回指定分数范围的成员
语法:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE class1:redis 10 99 1) "wangwu" 127.0.0.1:6379> ZRANGEBYSCORE class1:redis 10 99 WITHSCORES 1) "wangwu" 2) "99"
10. 增加成员分数
语法:
ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY class1:redis 50 tom "50" 127.0.0.1:6379> ZSCORE class1:redis tom "50"
-
项目中巧用redis有序集合
2022-04-05 13:29:15redis有序集合 什么是redis有序集合? Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大...redis有序集合
- 什么是redis有序集合?
- Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
示例
redis 127.0.0.1:6379> ZADD w3ckey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD w3ckey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD w3ckey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD w3ckey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
案例
有一批userId 需要异步脚本去跑数据,但是每个uid执行的时间是未来的某个时间,那么uid+time就是绑定在一起了,想性能最大化处理这个问题?不想每次获取全量数据在进行判断?
解决1:通过mysql,将数据与时间落表,再通过sql根据时间取出相对应的数据,数据量大的话,可定时归档或者清理老数据。
问题:多了张表,增加了维护成本
解决2:uid+time拼接成一个key,塞入redis,每次定时任务全量取出来,依次解开判断
问题:消耗性能
解决3:将uid+time存入redis有序集合,脚本获取时可以根据时间获取到对应的数据一起来学习Golang吧
- 什么是redis有序集合?
-
Redis有序集合类型(SortedSet)常用命令演示和实践练习代码
2016-06-23 15:15:17在JAVA中使用Redis有序集合类型的常用命令的演示及一个简单的实战项目: 具备增删改查和分类查找及按浏览量排序的商品管理功能 -
redis有序集合zset详解
2021-10-31 16:47:29Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的...zset
概述
- Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
- 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的 。
- 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序来获取一个范围的元素。
- 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
- 此外,有序集合中的元素是按顺序获取的(因此它们不是按请求排序的,顺序是用于表示有序集合的数据结构的特性)。它们根据以下规则排序:
- 如果 A 和 B 是具有不同分数的两个元素, 如果 A.score 是 > B.score,则 A > B。
- 如果 A 和 B 的分数完全相同,则 A > B 如果 A 字符串按字典顺序大于 B 字符串。A 和 B 字符串不能相等,因为排序集只有唯一元素。
常用命令
- 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zadd key score1 value1 score2 value2...
如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。如果key存在,但是类型不是有序集合,将会返回一个错误应答。
- 返回有序集 key 中,下标在
之间的元素
参数start和stop都是从0开始的索引。zrange key start stop #带withscores,可以让分数一起和值返回到结果集。 zrange key start stop withscores #查询全部元素 zrange key 0 -1
可以是负数,表示从有序集合的末尾的偏移量,其中-1是有序集合的最后一个元素,依次类推。
start和stop都是全包含的区间。
超出范围的索引不会产生错误。 如果start参数的值大于有序集合中的最大索引,或者start > stop,将会返回一个空列表。 如果stop的值大于有序集合的末尾,Redis会将其视为有序集合的最后一个元素。- 返回有序集 key 中,所有 score 值介于 min 和 max 之间的成员。
zrangebyscore key min max [withscores] #加上withscores,返回结果就加上score #如果不希望包含min或max,可以在前面加左括号 zrangebyscore key (min (max #分页 zrangebyscore key min max limit offset count
包括分数等于max或者min的元素。
元素被认为是从低分到高分排序的。
具有相同分数的元素按字典序排列。
最小值可以用-inf代替表示最小值 ;最大值可以用+inf代替表示最大值
- 返回有序集 key 中,所有 score 值介于 max和 min 之间
zrevrangebyscore key max min [withscores] #分页 zrevrangebyscore key max min limit offset count
包括分数等于max或者min的元素。
元素被认为是从高分到低分排序的。
具有相同分数的元素按字典序倒序排列。
最小值可以用-inf代替表示最小值 ;最大值可以用+inf代替表示最大值- 为有序集合key指定元素的score加上增量
zincrby key increment member
如果key中不存在member,就在key中添加一个member,score是increment(就好像它之前的score是0.0)。如果key不存在,就创建一个只含有指定member成员的有序集合。
当key不是有序集类型时,返回一个错误。
score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值。- 删除该集合下,指定值的元素
zrem key member1,member2......
返回的是从有序集合中删除的成员个数,不包括不存在的成员。
当key存在,但是其不是有序集合类型,就返回一个错误。
- 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。
zcount key min max
- 返回key的有序集元素个数。
zcard key
- 返回该值在集合中的排名,从0开始。
#从小到大 zrank key member #从大到小 zrevrank key member
- 删除并返回有序集合key中的最多count个具有最高得分的成员。
zpopmax key count
如未指定,count的默认值为1。指定一个大于有序集合的基数的count不会产生错误。 当返回多个元素时候,得分最高的元素将是第一个元素,然后是分数较低的元素。
- 删除并返回有序集合key中的最高得分的成员。
当key有多个时,返回第一个非空集合的score最大的元素,key,score;bzpopmax key1,key2... timeout
当集合列表都为空时,阻塞连接,timeout设为0表示永久阻塞,否则超过timeout就返回nil;- 删除并返回有序集合key中的最多count个具有最低得分的成员。
zpopmin key count
count默认值与zpopmax一样是1,只是当返回多个元素时候,得分最低的元素将是第一个元素,然后是分数较高的元素。
- 删除并返回有序集合key中的最低得分的成员。
当key有多个时,返回第一个非空集合的score最小的元素,key,score;bzpopmin key1,key2... timeout
当集合列表都为空时,阻塞连接,timeout设为0表示永久阻塞,否则超过timeout就返回nil;- 获取有序集合中指定成员之间的成员数量。
成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格zlexcount zset [minMember [maxMember #minMember 在有序集合中分数排名较小的成员 #maxMember在有序集合中分数排名较大的成员
可以使用 - 和 + 表示得分最小值和最大值
min 和 max 不能反, max 放前面 min放后面会导致返回结果为0
计算成员之间的成员数量时,参数 min 和 max 的位置也计算在内。演示
# 往有序集合zset中添加元素 127.0.0.1:6379> zadd zset 1 a 2 b 3 c 4 d 5 e (integer) 5 # 获取有序集合zset中全部元素 127.0.0.1:6379> zrange zset 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" # 返回有序集合zset中所有score介于1~3的元素,从小到大 127.0.0.1:6379> zrangebyscore zset 1 3 withscores 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" # 返回有序集合zset中所有score介于1~3的元素,从大到小 127.0.0.1:6379> zrevrangebyscore zset 3 1 withscores 1) "c" 2) "3" 3) "b" 4) "2" 5) "a" 6) "1" # 为有序集合zset的a元素的score加上增量10 127.0.0.1:6379> zincrby zset 10 a #返回增加后的score "11" 127.0.0.1:6379> zrange zset 0 -1 1) "b" 2) "c" 3) "d" 4) "e" 5) "a" 127.0.0.1:6379> zrangebyscore zset -inf +inf withscores 1) "b" 2) "2" 3) "c" 4) "3" 5) "d" 6) "4" 7) "e" 8) "5" 9) "a" 10) "11" # 删除有序集合zset的a元素 127.0.0.1:6379> zrem zset a #返回1表示删除成功 (integer) 1 127.0.0.1:6379> zrange zset 0 -1 1) "b" 2) "c" 3) "d" 4) "e" # 获取指定score范围([1,5])内元素个数 127.0.0.1:6379> zcount zset 1 5 (integer) 4 # 获取有序集合zset元素个数 127.0.0.1:6379> zcard zset (integer) 4 # 获取有序集合zset中c元素的排名(从0开始,从小到大) 127.0.0.1:6379> zrank zset c (integer) 1 # 获取有序集合zset中c元素的排名(从0开始,从大到小) 127.0.0.1:6379> zrevrank zset c (integer) 2 # 获取并删除有序集合zset score最大的元素 127.0.0.1:6379> zpopmax zset 1) "e" 2) "5" 127.0.0.1:6379> zrange zset 0 -1 1) "b" 2) "c" 3) "d" # 获取并删除有序集合zset score最小的元素 127.0.0.1:6379> zpopmin zset 1) "b" 2) "2" 127.0.0.1:6379> zrange zset 0 -1 1) "c" 2) "d" # 获取zset全部元素,score从小到大 127.0.0.1:6379> zrange zset 0 -1 withscores 1) "c" 2) "3" 3) "d" 4) "4" 127.0.0.1:6379> zadd zset 1 a 2 b 5 e (integer) 3 127.0.0.1:6379> zrange zset 0 -1 withscores 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" 7) "d" 8) "4" 9) "e" 10) "5" # 获取zset全部元素,score从大到小 127.0.0.1:6379> zrevrange zset 0 -1 withscores 1) "e" 2) "5" 3) "d" 4) "4" 5) "c" 6) "3" 7) "b" 8) "2" 9) "a" 10) "1" # 获取zset集合中元素a~c之间成员数量(包括a、c) 127.0.0.1:6379> zlexcount zset [a [c (integer) 3 #按score从小到大顺序获取zset集合全部元素 127.0.0.1:6379> zrangebyscore zset -inf +inf withscores 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" 7) "d" 8) "4" 9) "e" 10) "5" #按score从大到小顺序获取zset集合全部元素 127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores 1) "e" 2) "5" 3) "d" 4) "4" 5) "c" 6) "3" 7) "b" 8) "2" 9) "a" 10) "1" #按score从大到小顺序获取zset集合元素,并分页下标从0开始,元素数量为3 127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores limit 0 3 1) "e" #下标0 2) "5" 3) "d" #下标1 4) "4" 5) "c" #下标2 6) "3" #按score从大到小顺序获取zset集合元素,并分页下标从3开始,元素数量为3 127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores limit 3 3 1) "b" #下标3 2) "2" 3) "a" #下标4 4) "1"
数据结构
Sorted Set(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构
(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。案例
如何实现博客访问量排行榜?
127.0.0.1:6379> zadd blogs 1000 blog:1 2000 blog:2 3000 blog:3 (integer) 3 127.0.0.1:6379> zrevrangebyscore blogs +inf -inf withscores 1) "blog:3" 2) "3000" 3) "blog:2" 4) "2000" 5) "blog:1" 6) "1000"
-
PHP Redis有序集合 排序取值操作详情(zRangeByScore,zRevRangeByScore,zRange,zRevRange,zRangeByLex...
2021-12-06 15:46:10在Redis有序集合章节 可以看到非常多的函数 其实他只是多了一个顺序(成员分数) 既然是有序那么取值问题一定要有排序过程 排序过程一共分为三个方式 :个人觉得他们的使用场景和优缺点 1、通过成员分数排序 : ... -
python redis连接 有序集合去重的代码
2020-09-09 02:09:00主要介绍了python redis连接 有序集合去重的代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 -
Redis有序集合
2019-05-15 20:31:36文章目录一、有序集合介绍二、常用命令介绍三、有序集合数据结构为什么有序集合需要同时使用跳跃表和字典来实现?采用哪种编码由什么决定?压缩列表压缩列表节点的构成跳跃表 一、有序集合介绍 有序集合,顾名思义,... -
Redis有序集合类型的常用命令小结
2020-12-15 23:16:40Redis中的有序集合类型,实际上是在集合类型上,为每个元素都关联一个分数,有序实际上说的是分数有序,我们根据分数的范围获取集合及其他操作。集合的元素依然是不能够相同的,但是分数可以相同。 下面列举有序集合... -
php redis有序集合常用方法汇总
2020-04-16 09:38:24// 连接redis $host = '172.***.170'; $port = 6381; $this->redis = new Redis();...// 向有序集合添加一个或多个成员,或者更新已存在成员的分数 $redis->zAdd('lm_template_set_num',1 "one")... -
Redis Zadd 命令 Redis 有序集合(sorted set)Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到...
2022-02-21 14:21:16Redis 有序集合(sorted set) Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。 如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在... -
Redis有序集合的使用(排序使用案例)
2019-01-30 15:38:361,redis添加有序集合数据(模拟用户uid以及分数) $key = 'OOOOOOOOOOOOOOO'; for ($uid = 1;$uid<=20;$uid++){ $this->cache->zAdd($key,mt_rand(0,100),$uid+10); ... -
Redis有序集合(sorted set)使用
2021-02-12 18:37:05有序集合(sorted set)同时拥有“有序” 和 “集合”两种性质,集合性质保证有序集合只会包含各不相同的成员,而有序性质则保证了有序集合中的所有成员都会按照特定的顺序进行排列;在一般情况下,有序集合成员的大小... -
面试-Redis篇-Redis有序集合实现多字段排序
2020-05-14 10:58:49$redis = Yii::$app->redis->zrange($key,$start,$end,true); //倒序 $redis = Yii::$app->redis->zrevrange($key,$start,$end,true); 分数$value相同时,根据时间先后进行排序: $time = $max - ... -
基于 Redis 有序集合实现 Laravel 热门浏览文章排行榜功能
2021-12-15 16:15:48原文:基于 Redis 有序集合实现 Laravel 热门浏览文章排行榜功能 | 实战入门篇 | 高性能 Redis 实战 自己修改的部分 <?php namespace App\Console\Commands; use App\Models\Post; use Illuminate\Console\... -
Redis 有序集合(zset)取交集(zinterstore)操作耗时测试
2021-09-19 19:48:10最近遇到一个类似场景,一开始的觉得线上数据量较大,redis 取交集操作时间复杂度在O(N),实时计算会不会不合适?是否离线计算更好?请教了组内资深大佬,大佬说数据量不大的情况下redis计算挺快的。听了之后感觉... -
判断Redis有序集合中是否存在某个成员的方法
2019-11-22 16:21:40判断Redis有序集合中是否存在某个成员的方法 方法一 有序集合中,redis没有命令直接判断有序集合中是否存在某个成员,但可以借助ZLEXCOUNT命令实现:http://redis.cn/commands/zlexcount.html ZLEXCOUNT key min ... -
redis有序集合的创建,给集合添加值,zadd
2020-03-19 21:40:36添加元素后根据集合的序号自动排序,在有序集合中也存在索引,从0开始 添加的值也不能重复,否则添加失败 创建有序集合,并给集合添加一个或多个值,但序号不能重复,否则会覆盖原有的值 zadd 集合的键 序号 值 ..... -
redis有序集合zset的底层实现——跳跃表skiplist
2019-07-05 17:42:17redis有序集合zset的底层实现——跳跃表skiplist redis作为一种内存KV数据库,提供了string, hash, list, set, zset等多种数据结构。其中有序集合zset在增删改查的性质上类似于C++ stl的map和Java的TreeMap,提供了... -
请教个redis有序集合的问题
2018-08-15 09:38:16集合元素要有多个值:编号,类型,金额和排序分数。类型和金额如何存储在有序集合中呢?元素key用json,value用排序分数 如何呢? -
redis有序集合排行榜问题
2018-06-14 16:54:03Redis提供了按score进行排序的有序集合zset,例如我们所有的排行榜内容,都可以实现其目的,但是如果相同分数redis是怎么排序的呢。 1-默认redis的zset是按score排序的,提供了range(start, end),rangeByScore(min... -
redis有序集合键(数据结构篇)
2020-02-10 07:45:50有序集合和集合一样,都可以包含任意数量的、各不相同的元素( element),不同于集合的是,有序集合的每个元素都关联着一个浮点数格式的分 值(score),并且有序集合会按照分 值,以从小到大的顺序来排列有序集合... -
java基于redis有序集合实现排行榜
2019-09-12 14:21:47能勾起人类自身对比的欲望,某宝中的商品销量排行,店铺信誉排行等,实现排行榜的方式也有很多种,可以使用快速排序算法 + 实现Comparator接口实现按某项权重排序,现在很多公司都在使用redis这个nosql数据库实现... -
Redis 有序集合(zset)命令详解
2021-05-31 15:45:26sorted set官网链接: http://www.redis.cn/commands.html#sorted_set 添加 1. ZADD 添加(一个或多个) ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,... -
redis有序集合实现实时排名
2019-05-24 20:16:28解决方案:采用redis中的有序集合,针对实时排名的功能 1.根据帖子id,作为value,用zadd(新增)或者zincrby更新(添加) 2.移除指定元素,用zrem 3.用zrevrange(从大到小)或者zrange(从小到大),获取排序后的...