9. redis 数据结构-set、zset
1. set
redis中的Set就是一个无序的String集合,集合中的元素不可重复。集合之间可以取交集,并集,差集等。
(1)常用命令
- sadd spop srandmember srem smove 都是set的实际操作命令,比如添加啊,删除弹出,不删除弹出,删除,移动之类的: sadd key element [element ...]; spop key; srandmember key;srem key element [element ...]; 。
Srandmember和spop都是随机从集合取出元素,不同的是后者会删除元素。
- scard set中的元素个数:scard key
- sdiff sinter sunion 取差集,交集,并集:sdiff/sinter/sunion key [key ..]。
- sdiffstore sinterstore sunionstore 取差,交,并以后放到新的set:sdiffstore/sinterstore/sunionstore destination key [key ...]
(2)内部编码
- intset: 当集合元素都是int且元素个数小于lset-max-ziplist-entries(512 by default)
- hashtable: 无法满足ziplist的条件时。
- 使用场景
- Tag
2. zset
redis中的zset就是一个有序集合。在set基础上加入了一个score字段,通过利用score和index来进行相关的排序。
(1)常用命令
- zadd zrem zremrangebyrank zremrangebyscore 有序集合的添加与删除操作,删除分为三种方式,单个和按照区间删除:zadd key score member[score member...]; zrem key member [member ...]; zremrangebyrank key start end(删除指定排名内的升序元素);zremrangebyscore key min max(删除指定分数范围内的成员)。
- zcard zcount 集合中的元素数量,以及集合区间内的元素数量:zcard key; zcount key score。
- zrange zrevrange zrank zrevrank zrangebyscore zrevrangebyscore 按照区间返回数据,rev为降序的方式返回: zrange/zrevrange key start end [withscores];zrangebyscore/zrevrangebyscore key min max [withscores] [limit offset count]。
Ps: score可以重复相同score,先入在先
(2)内部编码
- ziplist: zset elements < zset-max-ziplist-entries(128 by default) && each element value < zset-max-ziplist-value(64 bytes by default).
- skiplist: 无法满足ziplist的条件时。
(3) 实现
跳跃表