目录
c2. 设置 key 的过期时间(对所有的数据类型都起作用)
A. redis 帮助文档
redis-server -h 服务端的帮助
help set 表达的是 help 命令的帮助
help @set 表达的是 set 集合的帮助
nx 只有当 key 不存在的时候才进行操作,----新增
xx 只有当 key 存在的时候才进行操作,----修改
value 原始数据类型
OBJECT encoding k1
B. Redis数据模型
C. String 字符串操作
c1. 设置字符串值 set
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX 设置过期时间,秒,等同于 SETEX k1 10 v1 == set k1 v1 ex 10
PX 设置过期时间,毫秒,等同于 PSETEX k1 10000 v1
NX 键不存在,才能设置,等同于 SETNX k1 v1
XX 键存在时,才能设置 ====》 set k1 v1 xx
MSET key value [key value ...] 设置多个键的字符串值
MSETNX key value [key value ...] 键不存在时,才能设置,设置字符串值 注意:这是原子操作,对其中一个key没有操作成功,全部失败 , msetnx k1 v1 k2 v2 s6 6
c2. 设置 key 的过期时间(对所有的数据类型都起作用)
EXPIRE k1 10 === PEXPIRE k1 10000 设置过期时间 ,为 10 秒
EXPIREAT key timestamp 设置在指定Unix时间戳过期 , 秒时间戳
PEXPIREAT key milliseconds-timestamp 设置在指定Unix时间戳过期 , 毫秒时间戳
PERSIST key 删除过期时间 ===> persist k1
TTL key 查看剩余生存时间 , 秒 ===》 TTL k1
PTTL key 查看剩余生存时间 , 毫秒 ===》 PTTL k1
查看 key 的剩余时间:
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2
c3. 查找键 keys
KEYS pattern
pattern取值
* 任意长度字符 =====》 keys s* 或者 keys *
? 任意一个字符 =====》 keys s? 或者 keys ??
[] 字符集合,表示可以是集合中的任意一个 =====》 keys s[1,2]
c4. 通过key获取值
MGET key [key ...] 获取多个给定的键的值 ====》 mget k1 或者 mget [k1,k2,k3]
GETSET key value 返回旧值并设置新值, 如果键不存在,就创建并赋值 ====》 getset k1 v2
STRLEN key 字符串长度 ====》 strlen k1
object encoding key 底层存储的value值的数据结构类型 ====》 object encoding k1
c5. 追加字符串
APPEND key value 如果键存在就追加;如果不存在就等同于SET key value ====》 append k1 aaa
c6. 获得value部分数据
GETRANGE key start end ====》 getrange k1 2 4 获得的结果是 cde
getrange k1 -3 -1 获得的结果是 cde
索引值从0开始,负数表示从字符串右边向左数起,-1表示最后一个字符
0 | 1 | 2 | 3 | 4 |
a | b | c | d | e |
-5 | -4 | -3 | -2 | -1 |
SETRANGE key offset value 从 offset 的位置开始覆盖字符串 ====》 setrange k1 2 xyzqwer 执行完后的结果为: abxyzqwer
c7. value增减
步长操作 字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
INCR key 每次对 value 增加 1 ====》 incr k1
DECR key 每次对 value 减少 1 ====》 decr k1
INCRBY key decrement 指定对 value 的增加数值 ====》 incrby k1 5
DECRBY key decrement 指定对 value 的减少数值 ====》 decrby k1 5
INCRBYFLOAT key decrement 对 value 的增加数值为浮点型 ====》 incrbyfloat k1 5.5
DECRBYFLOAT key decrement 对 value 的减少数值为浮点型 ====》 decrbyfloat k1 5.5
c8. 修改key(对所有类型的数据都起作用)
EXISTS key 键是否存在 ====》 EXISTS k1
RENAME key newkey 键重命名 ====》 rename k1 s1
RENAMENX key newkey 键重命名 ====》 renamenx k1 s1 帮助文档上面显示的 Rename a key, only if the new key does not exist(可能当初设计的时候出现了什么状况吧)(实际上 renamenx 是 key 存在的时候才能执行)
键删除 DEL key [key ...] ====》 del k1 或者 del [k1,k2,k3]
D. 字节数组(bitmap位图)
位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512M字节的内容, 位图上限:2^(9+10+10+3)=2^32b
8*1024*1024*1024=2^13
d1. bit 位赋值
设置某一位上的值 SETBIT key offset value (0/1) ====》 setbit k1 1 1
offset偏移量,从0开始 获取某一位上的值 GETBIT key offset 返回指定值0或者1 ====》 getbit k1 1
在指定区间上第一次出现的位置偏移量 BITPOS key bit [start] [end] ====》 bitpos k1 0 1 2 返回的是 k1 中 从 1 到 2 的 byte 中,第一次出现 0 的 bit 位的索引
bitpos k1 1 1 2 返回的是 k1 中 从 1 到 2 的 byte 中,第一次出现 1 的 bit 位的索引
bitpos k1 1 2 返回的是 k1 中 从 1 到 2 的 byte 中,第一次出现 1 的 bit 位的索引(bit默认为1)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 1 | 1 | |||||||||||||
第一个byte的值为 65, 代表 A | 第二个byte的值为 64, 代表 @ |
d2. 位逻辑操作
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey ====》 BITOP AND destkey a b
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey ====》 BITOP or destkey a b
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey ====》 BITOP xor destkey a b
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
a | 1 | 1 | A | 65 | ||||||
b | 1 | @ | 64 | |||||||
AND | 1 | @ | 64 | |||||||
OR | 1 | 1 | A | 65 | ||||||
XOR | 1 | 笑脸 | x01 |
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey ====》 bitop not destkey a
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
a | 1 | 1 | A | 65 | ||||||
not | 1 | 1 | 1 | 1 | 1 | 1 | 190 | xbe |
d3. 统计bit位为1的个数
BITCOUNT key [start] [end] ,byte 索引 从 start 到 end 上面 bit 位 为 1 的个数 ====》 bitcount k1 1 1 表示k1 中 第一个 byte 中 bit 位为 1 的个数
从左向右从0开始,从右向左从-1开始,注意官方start、end是位,测试后是字节(byte)
BITCOUNT testkey 0 0 表示从索引为0个字节到索引为0个字节,就是第一个字节的统计 ====》 BITCOUNT testkey 0 2 ,第 0 到 第 2 个字节 bit 位为 1 的个数
BITCOUNT testkey 0 -1 等同于 BITCOUNT testkey
BITCOUNT testkey 查看该 key 对应的 value 的 bit 位为 1 的个数
d4. 实例
1. 网站用户的上线次数统计(活跃用户)
用户ID为key,天作为offset,上线置为1
366 天 需要的存储空间 366/8 50Byte
key: xiaoming value: 11 1 000000000000000001010000000000000000
BITCOUNT xiaoming ,统计小明这一年内的上线次数
2.按天统计网站活跃用户
天作为key,用户ID为offset,上线置为1
假设: 小明的账号为:576732653 小红的账号:576732456
setbit 20201101 576732653 1 ,这天小明上线
setbit 20201101 576732456 1 ,这天小红上线
求出 20201101 到 20201105 这一段时间网站用户的活跃数
BITOP or countuser 20201101 20201102 20201103 20201104 20201105 ,计算
bitcount countuser ,统计
E. List列表 数组
基于Linked List实现
元素是字符串类型
列表头尾增删快,中间增删慢,增删元素是常态
元素可以重复出现
最多包含2^32-1元素
队列:L/R R/L
栈: L/L R/R
数组:LINDEX LSET
阻塞:BL BR
e1. 添加元素
LPUSH key value [value ...] ,左边压入元素 ====》 LPUSH k1 xiaoming
LPUSHX key value ,当key存在的时候,从左边压入数据 ====》 LPUSHX k1 gougou
RPUSH key value [value ...] ,右边压入数据 ====》 rpush k1 dabai
RPUSHX key value ,当key存在的时候,从右边压入数据 ====》 rpushx k1 wugui
LSET key index value 设置指定位置元素的值 ====》 LSET k1 1 xiaohei
e2. 插入元素
LINSERT key BEFORE|AFTER pivot value 在列表中某个存在的值(pivot)前或后插入元素
before | after 这里指代的是, 该 pivot 元素所在的 索引 前后
key 和 pivot 不存在,不进行任何操作
举例 :
lpush k3 a b 1 2 c d a 1 2 3 ====》 存储的顺序为 "3""2""1""a""d""c""2""1""b""a"
LINSERT k3 after a java ====》 执行结果为 "3""2""1""a""java""d""c""2""1""b""a"
LINSERT k3 before b is ====》 执行结果为"3""2""1""a""java""d""c""2""1""is""b""a"
e3. 删除
1. 删除操作
从列表头部开始删除值等于value的元素count次
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
举例 :
RPUSH k1 aa cc bb aaa ccc aa 123 321 cc aa bb
LREM k1 2 aa 表示,从左边开始查询,删除 2 个值为 aa 的索引
LREM k1 -2 bb 表示,从右边开始查询,删除 2 个值为 aa 的索引
LREM k1 0 cc 表示,删除 所有值为 cc 的索引
2. 弹出元素(删除)
LPOP key 表示从 左边 弹出元素 ====》 LPOP k1
RPOP key 表示从 右边 弹出元素 ====》RPOP k2
RPOPLPUSH source destination 从一个列表尾部弹出元素压入到另一个列表的头部 ====》RPOPLPUSH k1 k2
3. 弹出元素(删除,阻塞)
如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据可以弹出(弹出后结束阻塞进程)
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务
BLPOP key [key ...] timeout 从左侧开始弹出数据并且设置阻塞时间 ====》 BLPOP k1 k2 k3 0 弹出k1 ,k2 ,k3 上的数据,只要有一个key值有数据弹出(录入多条数据则会弹出索引值最小的一个),就结束阻塞
BRPOP key [key ...] timeout 从右侧开始弹出数据并且设置阻塞时间 ====》 BLPOP k1 60 阻塞时间为60秒,这个时间内只要 k1 有数据弹出(录入多条数据则会弹出索引值最大的一个),就会结束阻塞
BRPOPLPUSH source destination timeout 从一个列表尾部阻塞弹出元素压入到另一个列表的头部 ====》 BRPOPLPUSH k1 k2 10 阻塞时间为10秒,从k1 右侧弹出数据,将数据从左侧加入到 k2
4. 去除指定范围 外 元素
LTRIM key start stop 删除索引 start 到 stop 之外的其他所有元素
举例 :
RPUSH k2 c abc c ab 123 ab bj ab xx yy zz qq ww ee rr dd ff
LTRIM k2 0 -1 表示,不删除元素
LTRIM k2 1 -1 表示,删除索引为 0 的元素
LTRIM k2 1 10000 表示,删除索引为 0 或者 索引大于 10000 的元素
e4. 查看元素
LRANGE key start stop 这里 start,stop 指代的是 value 的索引 ====》 LRANGE k1 2 3
LRANGE key 0 -1 表示返回所有元素 ====》 LRANGE k1 0 -1
LINDEX key index 获取指定位置的元素 ====》 LINDEX k1 1
LLEN key 列表长度,元素个数 ====》 LLEN k1
F. Hash散列
由 field 和关联的value组成的map键值对 ( key 对应的 值相当于一个对象 )
field和value是字符串类型
一个hash中最多包含2^32-1键值对
f1. 添加数据
HSET key field value 新增元素 ====》 HSET h1 id 001 表示对 h1 的key 添加一个 id 属性 值为 001
HSETNX key field value ,表示key的filed不存在的情况下执行,key不存在直接创建 ====》HSETNX h2 phone 13344445555 如果h2 存在则会报错
HMSET key field value [field value ...] 设置多个字段 ====》 hset h1 name yang_zzu age 18
HEXISTS key field 判断字段是否存在 , 表示key或者field不存在,返回0 ====》 HEXISTS h1 address 该属性不存在,返回值为 0
f2. 查询数据
HLEN key 返回字段个数 ====》 HLEN h1 查询 h1 中的属性个数
HGET key field 返回字段值 ====》 HGET h1 name 查询 h1 的name 属性的值
HMGET key field [field ...] 返回多个字段值 ====》 HMGET h1 name age 查询 h1 的 name,age 属性的值
HGETALL key 返回所有的键值对 ====》 HGETALL h1 返回查询 h1 的所有属性及其对应的值
HKEYS key 返回所有字段名 ====》 HKEYS h1 返回 h1 所有的属性名称
HVALS key 返回所有属性的值 ====》 HVALS h1 返回的数据只有 属性值,没有属性名称
f3. 属性值操作
HINCRBY key field increment 在字段对应的值上进行整数的增量计算 ====》 HINCRBY h1 age 2 表示 age 的属性值增加 2
HINCRBYFLOAT key field increment 在字段对应的值上进行浮点数的增量计算 ====》 HINCRBYFLOAT h1 age 2.2 表示 age 的属性值增加 2.2
f4. 删除属性
HDEL key field [field ...] 删除指定的字段 ====》 HDEL h1 address 删除 h1 的 address 属性
f5. 用途
节约内存空间 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等) 所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多
f6. 不适合hash的情况
使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面
G. Set集合
无序的、去重的
元素是字符串类型
最多包含2^32-1元素
g1. 添加数据
SADD key member [member ...] 增加一个或多个元素,如果元素已经存在,则自动忽略 ====》 SADD s1 xiaoming 向s1 中添加 xiaoming 的元素,返回添加成功的元素的个数
g2. 删除数据
SREM key member [member ...] 移除一个或者多个元素 元素不存在,自动忽略 ====》 SREM s1 xiaoming 删除 s1 中 xiaoming 的元素,返回 删除 成功的元素的个数
SPOP key [count] 随机从集合中移除并返回这个被移除的元素 ====》 spop s1 2 从 s1 中弹出 2 个元素数据, 不指定 count 的值,默认弹出一条数据
SMOVE source destination member 把元素从源集合移动到目标集合 ====》 SMOVE s1 s2 hadoop 将 s1 中的 hadoop 元素 移动到 s2 集合中 (不能一次移动多个元素)
g3. 查询数据
SCARD key 不需要遍历, 返回集合中元素的个数 ,键的结果会保存信息,集合长度就记录在里面
SMEMBERS key 返回集合包含的所有元素 (数据不是有序,每次返回的结果顺序可能不一样),如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用
SISMEMBER key member 检查给定元素是否存在于集合中 ====》 SISMEMBER s1 xiaobai 如果存在则返回 1,不存在返回 0
g4. 随机获取数据
SRANDMEMBER key [count] 随机返回集合中指定个数的数据 ====》 SRANDMEMBER s1 3 返回 s1 中的 3 个元素,每次返回的数据都不一样
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值,元素可能重复
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素
g5. 逻辑操作
SADD s1 a b c 1 2 3
SADD s2 a b c d e f g h 1
差集
SDIFF key [key ...],从第一个key的集合中去除其他集合和自己的交集部分 ====》 SDIFF s1 s2 输出 s1 - s2 的数据
SDIFFSTORE destination key [key ...],将差集结果存储在目标key中 ====》 SDIFFSTORE cs3 s1 s2 将 s1 - s2 的数据,保存到 cs3 中
交集
SINTER key [key ...],取所有集合交集部分 ====》 SINTER s1 s2 输出 s1 s2 中相同的元素
SINTERSTORE destination key [key ...],将交集结果存储在目标key中 ====》 SINTERSTORE jc3 s1 s2 将 s1 s2 中相同的元素,保存到 jc3 中
并集
SUNION key [key ...],取所有集合并集 ====》 SUNION s1 s2 输出 s1 + s2 去重后的数据
SUNIONSTORE destination key [key ...],将并集结果存储在目标key中 ====》 SUNIONSTORE uc3 s1 s2 将 s1 + s2 去重后的数据,保存到 uc3 中
H. SortedSet有序集合
类似Set集合 元素是字符串类型 最多包含2^32-1元素
有序的、去重的
每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同
h1. 添加数据
ZADD key score member [score member ...] 增加一个或多个元素 ,如果元素已经存在,则使用新的score ====》 zadd fruits 5 xiangjiao
h2. 删除数据
移除一个或者多个元素 ZREM key member [member ...] 元素不存在,自动忽略 ====》 ZREM fruits mangguo 返回删除的元素的个数
ZREMRANGEBYRANK key start stop 移除指定排名范围的元素 ====》 ZREMRANGEBYRANK fruits 10 12 删除排序后索引下标(从 0 开始)为 9 10 11 的元素
ZREMRANGEBYSCORE key min max 移除指定分值范围的元素 ====》 ZREMRANGEBYSCORE fruits (20 (50 删除 20 < score < 50 的元素
h3. 查询数据
ZCARD key 返回集合中元素个数 ====》 ZCARD fruits
ZCOUNT key min max 返回指定范围中元素的个数 ====》 ZCOUNT fruits 4 7 返回 4<= score <=7 的元素的个数
ZCOUNT fruits (4 7 返回 4< score <=7 的元素的个数
ZRANGE key index index [withscores] 查询全部的数据 ====》 ZRANGE fruits 0 -1 withscores 查询全部的数据,输出 score 和 元素数据
ZSCORE key member 显示分值 ====》 ZSCORE fruits putao 显示fruits 中, putao元素的分值
ZRANK key member 返回元素的排名(索引) ====》 ZRANk fruits putao 返回的排名索引是从 0 开始计数(正序)
ZREVRANK key member 返回元素的逆序排名 ====》 ZREVRANK fruits putao 返回的排名索引是从 0 开始计数(逆序)
ZRANGE key start stop [WITHSCORES] 返回指定索引区间元素 ,如果score相同,则按照字典序lexicographical order 的 正序 排列 ,默认按照score从小到大, ====》 ZRANGE fruits 0 -1 withscores 输出 score 的值 和 元素的数据
ZREVRANGE key start stop [WITHSCORES] 返回指定索引区间元素 ,如果score相同,则按照字典序lexicographical order 的 逆序 排列, 默认按照score从大到小,====》 ZREVRANGE fruits 0 -1 withscores 输出 score 的值 和 元素的数据
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 返回指定分值区间元素 ,
返回score默认属于[min,max]之间,元素按照score升序排列,score相同按照字典序排序,
LIMIT中offset代表跳过多少个元素(跳过开头几个元素),count是返回几个,
使用小括号,修改区间为开区间,例如 (5 (10 表示 5 < score < 10 ,
-inf 和 +inf 表示负无穷和正无穷
====》 ZRANGEBYSCORE fruits 0 11 limit 2 3 查找 0 <= score <= 11 的值,跳过匹配 score 的前 2 条数据,返回 3 条数据
ZRANGEBYSCORE fruits 0 (11 limit 3 5 查找 0 <= score < 11 的值,跳过匹配 score 的前 3 条数据,返回 5 条数据
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 返回指定分值区间元素 ,
返回score默认属于[max,min]之间,元素按照score降序排列,score相同字典降序
LIMIT中offset代表跳过多少个元素(跳过开头几个元素),count是返回几个,
使用小括号,修改区间为开区间,例如 10 (5 表示 5 < score <= 10 ,
-inf和+inf表示负无穷和正无穷
====》 ZREVRANGEBYSCORE fruits 11 0 limit 1 5 查找 0 <= score <= 11 的值,跳过匹配 score 的前 1 条数据,返回 5 条数据
ZREVRANGEBYSCORE fruits (11 0 limit 1 5 查找 0 <= score < 11 的值,跳过匹配 score 的前 1 条数据,返回 5 条数据
h4. 数据操作
ZINCRBY key increment member 增加或者减少分值,increment为负数就是减少 ====》 ZINCRBY fruits 3 li 将 li 元素的 score 的值增加 3
h5. 数据集逻辑操作
测试数据:
ZADD z1 10 mangguo 20 xigua 30 shuimitao 40 mugua 50 juzi
ZADD z2 100 mangguo 20 nangua 30 shiliu 400 mugua 50 pingguo
并集
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
====》 ZUNIONSTORE zu3 2 z1 z2 默认使用 sum 的方式进行加载
ZUNIONSTORE zu3 2 z1 z2 aggregate min 指定,并集的聚合方式为 最小值
ZUNIONSTORE zu3 2 z1 z2 weights 10 0.5 aggregate max 指定,集合中的分值的权重,并集的聚合方式为 最大值
注意 :参与并集运算的集合较多,会造成Redis服务器阻塞,因此最好放在空闲时间或者备用服务器上进行计算
交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
====》 ZRANGE zi3 0 1000 withscores 默认使用 sum 的方式
ZINTERSTORE zi3 2 z1 z2 aggregate min 指定,取并集 相同元素最小的 score 值
ZINTERSTORE zi3 2 z1 z2 weights 20 1.5 aggregate max 指定,集合中的分值的权重,交集的聚合方式为 最大值
I. redis 缓存数据库(分库)
一个实例,可以有 16 个数据库
redis-cli -n 2 ,表示进入 第 2 个缓存库
J. 清除缓存数据
FLUSHDB
清除当前客户端当前所在的缓存库数据
FLUSHALL
清除redis 缓存库中,所有库中的数据