集合
命令
添加元素
api: sadd key element [element ...]
删除元素
api: srem key element [element ...]
计算元素个数
api: scard key
判断元素是否在集合中
api: scard myset
随机从集合返回指定个元素
api: srandmember key [count]
[count]是可选参数,如果不写默认为1
随机从集合弹出元素
api: spop key
需要注意的是Redis从3.2版本开始,spop也支持[count]参数。
srandmember和spop都是随机从集合选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会。
获取所有元素
api: smembers key
smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,这时候可以使用sscan来完成
交并差
交: sinter key [key ...]
并: suinon key [key ...]
差: sdiff key [key ...]
保存交并差结果
结果保存在destination中
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
内部编码
- intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实
现,从而减少内存的使用。 - hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使
用hashtable作为集合的内部实现。
使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。
有序集合
有序集合就是给集合中的每个元素一个分数, 作为排名依据, member最为集合元素不能重复, score可以重复. api很多都是针对分数
命令
添加成员
api: zadd key score member [score member ...]
Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
·nx:member必须不存在,才可以设置成功,用于添加。
·xx:member必须存在,才可以设置成功,用于更新。
·ch:返回此次操作后,有序集合元素和分数发生变化的个数
·incr:对score做增加,相当于后面介绍的zincrby。
计算成员个数
api: zcard key
获取某个成员的分数
api: zscore key member
计算成员的排名
api
zrank key member
zrevrank key member
zrank是从分数从低到高返回排名,zrevrank反之。排名从0开始计算
删除成员
api: zrem key member [member ...]
增加成员的分数
api: zincrby key increment member
李四原来2分, 给她加5分
获取指定排名范围的成员
api:
zrange key start end [withscores]
zrevrange key start end [withscores]
zrange是由低到高, withscores可选的用于显示分数
返回指定分数范围的成员
api:
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
反着输没反应原因是, 反着输是max在头
同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大
返回指定分数范围成员个数
api: zcount key min max
删除指定排名内的升序元素
zremrangebyrank key start end
zremrangebyrank key 0 1,由小到大删除前两名
删除指定分数范围的成员
zremrangebyscore key min max
交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]]
[aggregate sum|min|max]
这个命令参数较多,下面分别进行说明:
- destination:交集计算结果保存到这个键。
- numkeys:需要做交集计算键的个数。
- key[key…]:需要做交集计算的键。
- weights weight[weight…]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
- aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。
并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]]
[aggregate sum|min|max]
内部编码
- ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
- skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作
为内部实现,因为此时ziplist的读写效率会下降。
使用场景
有序集合比较典型的使用场景就是排行榜系统。
键管理
键重名
api: rename key newkey
- 为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖
- 由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性
随机返回一个键
api: randomkey
键过期
- expire key seconds:键在seconds秒后过期。
- expireat key timestamp:键在秒级时间戳timestamp后过期。
ttl命令和pttl都可以查询键的剩余过期时间,但是pttl精度更高可以达到毫秒级别,有3种返回值:
- 大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。
- -1:键没有设置过期时间。
- -2:键不存在。
Redis2.6版本后提供了毫秒级的过期方案:
- pexpire key milliseconds:键在milliseconds毫秒后过期。
- pexpireat key milliseconds-timestamp键在毫秒级时间戳timestamp后过
期。
清除键的过期时间: persist
对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。
Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,例如不能对列表类型的一个元素做过期时间设置。
迁移键
1.move: move key db
将本数据库中键名list1的数据迁移到数据库1(redis默认有16个数据库, 索引0-15)
2, 3没看懂
遍历键
api: keys pattern
pattern使用的是glob风格的通配符:
- *代表匹配任意字符。
- 代表匹配一个字符。
- []代表匹配部分字符,例如[1,3]代表匹配1,3,[1-10]代表匹配1到10
的任意数字。 - \x用来做转义,例如要匹配星号、问号需要进行转义。
渐进式遍历
那么每次执行scan,可以想象成只扫描一个字典中的一部分键,直到将字典中的所有键遍历完毕。scan的使用方法如下:scan cursor [match pattern] [count number]
- cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每
次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。 - match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的
模式匹配很像。 - count number是可选参数,它的作用是表明每次要遍历的键个数,默认
值是10,此参数可以适当增大。
数据库管理
切换数据库
select dbIndex
清除数据库
flushdb清除当前数据库
flushdb/flushall