zset 有序集合,不能重复,给每一个元素设置一个分数(score)做为排序的依据redis
延时队列能够经过 Redis 的 zset(有序列表) 来实现。咱们将消息序列化成一个字符串做为 zset 的value
,这个消息的到期处理时间做为score
,而后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程能够继续处理。由于有多个线程,因此须要考虑并发争抢任务,确保任务不能被屡次执行。并发
zadd key score member 添加编码
redis 3.2为zadd 添加了nx,xx,ch,incr:spa
nx:member必须不存在,才能设置成功,用于添加线程
xx: member必须不存在,才能设置成功,用于更新code
ch:返回这次操做后,有序集合元素和分数发生变化的个数排序
incr: 对score作增长,至关于后面介绍的zincrby队列
常规操做:ip
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的读写效率会降低
使用场景:排行榜系统,添加用户赞数(某种操做)