zset 有序集合,不能重复,给每个元素设置一个分数(score)作为排序的依据
延时队列可以通过 Redis 的 zset(有序列表) 来实现。我们将消息序列化成一个字符串作为 zset 的value
,这个消息的到期处理时间作为score
,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行。
zadd key score member 添加
redis 3.2为zadd 添加了nx,xx,ch,incr:
nx:member必须不存在,才能设置成功,用于添加
xx: member必须不存在,才能设置成功,用于更新
ch:返回此次操作后,有序集合元素和分数发生变化的个数
incr: 对score做增加,相当于后面介绍的zincrby
常规操作:
zcard key : 计算成员的个数
zrank key member : 计算成员的排名(顺序)
zrevrank key member:计算成员的排名(倒序)
zrange(zrevrang) key start end :返回指定排名范围的成员
zrangebyscore(zrevrangebyscore) key min max:返回分数范围的成员(-inf 无限小 +inf 无限大)
zcount key min max :返回指定分数范围成员个数
zremrangebyscore key min max : 删除指定分数范围的成员
集合操作:
zinterstore destination numkeys key :交集 weight 每个键的权重,在做交集计算上,每个元素相乘这个权重,默认为1
zunionstore destination numkeys key :并集
内部编码:
ziplist(压缩列表):元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素值小于zset-max-ziplist-value配置(默认64字节),ziplist 可以有效减少内存的使用
skiplist(跳跃表):当ziplist条件不满足时。ziplist的读写效率会下降
使用场景:排行榜系统,添加用户赞数(某种操作)