参考文档
Redis
Redis DEL 命令 | 菜鸟教程 (runoob.com)
设置指定 key 的值
# 格式
set key value
# 示例: ->
set China Beijing
# 格式
get key
# 示例
get China
设置并返回 key 的旧值
# 格式
getset key value
# 示例:第一次将 Japan 的值设置为 Tokyo,第二次设置为 aaa ,并返回设置前的值
set Japan Tokyo
getset Japan Tokyo
获取所有(一个或多个)给定 key 的值
# 格式
mget key1 [key2..]
# 示例
mget China Japan
设置指定 key 的过期时间
# 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
setex key seconds value
# 将值 value 关联到 key ,并将 key 的过期时间设为 milliseconds (以毫秒为单位)
petex key milliseconds value
# 示例:设置 America 的过期时间为 10s
SETEX America 10 Washington
# 示例:设置 Kyle 的过期时间为 200ms
SETEX Kyle 200 big
只有在 key 不存在时设置 key 的值
# 格式:单个
setnx key value
# 格式:多个
msetnx key value [key value ...]
# 示例:单个
setnx America Washington
# 示例:多个
msetnx Rose 22 Jack 23
返回 key 所储存的字符串值的长度
# 格式
strlen key
# 示例
strlen China
同时设置一个或多个 key-value 对
# 格式
mset key value [key value ...]
# 示例
mset Korea Seoul England London
设置值自增
# 格式:将 key 中储存的数字值增一
INCR key
# 格式:将 key 所储存的值加上给定的增量值(increment)
INCRBY key increment
# 格式:将 key 所储存的值加上给定的浮点增量值(increment)
INCRBYFLOAT key increment
# 在 3 的基础上,visit_count 自增 1
set visit_count 0
incr visit_count
# 在当前的值的基础上,给 visit_count 增加 3
incrby visit_count 3
# 在当前值的基础上,给 visit_count 增加 0.5
INCRBYFLOAT visit_count 0.5
# 格式:将 key 中储存的数字值 减 1
DECR key
# 格式:key 所储存的值减去给定的减量值(decrement)
DECRBY key decrement
# 示例,visit_count 自减 1
DECR visit_count
# 示例,visit_count 自减 3
DECRBY visit_count 3
# 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
APPEND key value
# 示例
set test_str aabb
APPEND test_str cc
说明
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
组成
① key:指定的哈希表
② filed:字段
③ value :字段对应的值
设置哈希表字段的值
# 格式:(单个)设置哈希表 key 中的字段 field 的值设为 value
HSET key field value
# 示例:设置 kyle 的年龄为 18
HSET kyle age 18
# 格式:(多个)设置哈希表 key 中的字段 field 的值设为 value
HMSET key field1 value1 [field2 value2 ]
# 示例:设置 Lisa 的年龄 19 ,城市 Beijing
HMSET Lisa age 19 city Beijing
字段不存在时设置哈希表字段的值
# 格式:只有在字段 field 不存在时,设置哈希表字段的值
HSETNX key field value
# 示例:如果 kyle 不存在字段 city ,就设置该字段的值为 Tianjing
HSETNX kyle city Tianjing
# 格式:查看哈希表 key 中,指定的字段是否存在
HEXISTS key field
# 示例
HEXISTS kyle age
获取哈希表中指定字段的值
# 格式:获取存储在哈希表中指定字段的值
HGET key field
# 示例
HGET kyle age
# 格式:获取多个字段的值
HMGET key field1 [field2]
# 示例:获取 kyle 的 age 和 city 字段
HMGET kyle age city
获取指定 key 的字段和值
# 格式:获取在哈希表中指定 key 的所有字段和值
HGETALL key
# 示例:获取 Lisa 对应的所有字段和值
HGETALL Lisa
获取所有的哈希表中的字段
# 格式:获取所有哈希表中的字段
HKEYS key
# 示例:获取 Lisa 的所有字段名称
HKEYS Lisa
获取所有哈希表中的字段对应的值
# 格式:获取所有哈希表中的字段对应的值
HVALS key
# 示例:获取 Lisa 的所有字段的值
HVALS Lisa
返回 key 所储存的字符串值的长度
# 格式:获取哈希表中字段的数量
HLEN key
# 示例:获取 Lisa 的字段长度,统计的是字段的数量
HLEN Lisa
# 格式:为哈希表 key 中的指定字段的整数值加上增量 increment
HINCRBY key field increment
# 示例:Lisa 的年龄增加 1
HINCRBY Lisa age 1
浮点数值自增
# 格式:为哈希表 key 中的指定字段的浮点数值加上增量 increment
HINCRBYFLOAT key field increment
# 示例: Lisa 的年龄增加 1.5
HINCRBYFLOAT Lisa age 1.5
# 格式:删除一个或多个哈希表字段
HDEL key field1 [field2]
# 示例:删除 Lisa 的 age 字段
HDEL Lisa age
说明
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2的32次方 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
将一个值或多个值插入到列表的头部
# 格式:将一个值或多个值插入到列表的头部,列表不存在则创建
LPUSH key value1 [value2]
# 示例:向 student 列表中头部添加 Lisa、Rose、Jack
LPUSH student Lisa Rose Jack
# 格式:将一个值插入到已存在的列表头部,如果列表存在则插入,列表不存在则无法插入
LPUSHX key value
# 示例:向已存在的列表 student 中插入 kyle,成功插入
LPUSHX student kyle
# 示例:向不存在的列表 customer 中插入 kyle,插入失败
LPUSHX customer kyle
将一个值或多个值插入到列表的尾部
# 格式:在列表中添加一个或多个值到尾部
RPUSH key value1 [value2]
# 示例:向 student 列表中尾部添加 zhangsan
RPUSH student zhangsan
将一个值插入到已存在的列表的尾部
# 格式:将一个值插入到已存在的列表的尾部,列表不存在则无法插入;列表存在则插入
RPUSHX key value
# 示例
RPUSHX key lisi
在列表的元素前或者后插入元素
# 格式:在列表的元素前或者后插入元素
# 注意:在列表中出现的第一个元素前插入元素,不会出现在多个相同的元素前都插入
# 例如:列表中有多个元素 lisi ,在 lisi 前插入lisan,只会在从左到右的第一个 lisi 前插入
LINSERT key BEFORE|AFTER pivot value
# 示例:在 lisi 的前面插入 lisan
LINSERT student BEFORE lisi lisan
查看list当中所有的数据
# 格式:查看list当中所有的数据
LRANGE key start stop
# 示例
LRANGE student 0 -1
# 格式:通过索引获取列表中的元素
# 注意:索引是从 0 开始
LINDEX key index
# 示例
LINDEX student 0
# 格式:通过索引设置列表元素的值
LSET key index value
# 示例:把索引为 3 的元素改为 kk
LSET student 3 kk
获取列表长度
# 格式:获取列表长度
LLEN key
# 示例
LLEN student
移出并获取列表的第一个元素
# 格式:移出并获取列表的第一个元素
LPOP key
# 示例
LPOP student
移除列表的最后一个元素
# 格式:移除列表的最后一个元素,返回值为移除的元素
RPOP key
# 示例:
RPOP student
# 格式:移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
# 注意:单位为 秒 s
BLPOP key1 [key2 ] timeout
# 示例:从 emp 列表中弹出一个元素,没有元素则阻塞等待 10s
BLPOP emp 10
# 格式:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BRPOP key1 [key2 ] timeout
# 示例:从 emp 列表中弹出一个元素,没有元素则阻塞等待 2000ms
BRPOP emp 10
移除列表的最后一个元素,并添加到另外一个列表
# 格式:移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPOPLPUSH source destination
# 示例:从 emp 中移除一个元素并添加到 teacher 列表中
RPOPLPUSH emp teacher
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它,没有元素则阻塞直到超时
# 格式:从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;
# 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
# 注意:时间为 秒 s
BRPOPLPUSH source destination timeout
# 示例:从 teacher 列表中移除一个元素并添加到 emp 列表中
BRPOPLPUSH emp teacher 10
对一个列表进行修剪(trim),让列表只保留指定区间内的元素
# 格式:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
LTRIM key start stop
# 示例:对 student 表的元素进行裁剪,只保留 2 到 4 之间的元素
LTRIM student 2 4
# 格式:删除指定 key 的列表,一个或多个
DEL key1 key2
# 示例:删除列表 student
DEL student
说明
① Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
② Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
③ 集合中最大的成员数为 2的32次方 - 1 (4294967295, 每个集合可存储40多亿个成员)
向集合添加一个或多个成员
# 格式:向集合添加一个或多个成员
SADD key member1 [member2]
# 示例:向 city1 集合添加元素
SADD city1 Beijing Tianjing Shanghai Wuhan
返回集合中的所有成员
# 格式:返回集合中的所有成员
SMEMBERS key
# 示例:返回集合 city1 中的所有成员
SMEMBERS city1
获取集合的成员数
# 格式:获取集合的成员数
SCARD key
# 示例:获取集合 city1 的成员数
SCARD city1
# 格式:返回给定所有集合的差集
SDIFF key1 [key2]
# 示例:返回集合 city1 和 集合 city2 中的差集
SDIFF city1 city2
返回给定所有集合的差集并存储在指定集合
# 格式:返回给定所有集合的差集并存储在 destination
SDIFFSTORE destination key1 [key2]
# 示例:返回集合 city1 和 集合 city2 中的差集并存储在 city3 集合中
SDIFFSTORE city3 city1 city2
# 格式:返回给定所有集合的交集
SINTER key1 [key2]
# 示例:返回 city1 city2 的交集
SINTER city1 city2
返回给定所有集合的交集并存储在指定集合
# 格式:返回给定所有集合的交集并存储在 destination 中
SINTERSTORE destination key1 [key2]
# 示例:返回集合 city1 和 集合 city2 中的差集并存储在 city4 集合中
SINTERSTORE city4 city1 city2
判断元素是否存在
# 格式:判断 member 元素是否是集合 key 的成员
SISMEMBER key member
# 示例:判断 Beijing 是否为 city1 中的成员
SISMEMBER city1 Beijing
移动元素到指定集合
# 格式:将 member 元素从 source 集合移动到 destination 集合
SMOVE source destination member
# 示例:将 Beijing 从 city1 中移动到 city5 中
SMOVE city1 city5 Beijing
# 格式:移除并返回集合中的一个随机元素
SPOP key
# 示例:从 city1 中返回一个随机元素
SPOP city1
返回集合中一个或多个随机数
# 格式:返回集合中一个或多个随机数
SRANDMEMBER key [count]
# 示例:返回集合 city3 中 2 个随机数
SRANDMEMBER city3 2
# 格式:移除集合中一个或多个成员
SREM key member1 [member2]
# 示例:移出集合 city1 中的 Wuhan
SREM city1 Wuhan
# 格式:返回所有给定集合的并集
SUNION key1 [key2]
# 示例:返回 city1 和 city2 集合的并集
SUNION city1 city2
# 格式:所有给定集合的并集存储在 destination 集合中
SUNIONSTORE destination key1 [key2]
# 示例:将 city1 和 city2 的并集存储在 city7 中
SUNIONSTORE city7 city1 city2
说明
① Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
② 它用来保存需要排序的数据,例如排行榜,一个班的语文成绩,一个公司的员工工资,一个论坛的帖子等
③ 有序集合中,每个元素都带有score(权重),以此来对元素进行排序
组成(举例)
以语文成绩为例,key是考试名称(期中考试、期末考试等),member是学生名字,score是成绩
① key
② member
③ score
向有序集合添加一个或多个成员
# 格式:向有序集合添加一个或多个成员
ZADD key score1 member1 [score2 member2]
# 示例:向 项目1 集合添成员姓名和分数
ZADD project1 90 zhangsan 80 lisi 93 Kyle 75 Lisa 62 Rose
# 格式:获取有序集合的成员数
ZCARD key
# 示例:返回集合 project1 中的成员数
ZCARD project1
# 格式:计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
# 示例:获取集合 project1 中分数在 90 到 100 的成员数
ZCOUNT project1 90 100
有序集合中对指定成员的分数加上增量 increment
# 格式:有序集合中对指定成员的分数加上增量 increment
ZINCRBY key increment member
# 示例:给 project1 中的 lisi 加 5 分
ZINCRBY project1 5 lisi
获取交集并存储在新的有序集合中
# 格式:计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
ZINTERSTORE destination numkeys key [key ...]
# 示例:计算 project1 和 project2 有序集的交集并存储在 result1 集合中
# 2 指的是 2个集合
ZINTERSTORE result1 2 project1 project2
# 格式:通过索引区间返回有序集合指定区间内的成员
ZRANGE key start stop [WITHSCORES]
# 示例:返回 city1 city2 的交集
ZRANGE result1 0 -1
# 格式:通过分数返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
# 示例:返回集合 project1 中 分数在 90 到 100 的成员
ZRANGEBYSCORE project1 90 100
# 格式:返回有序集合中指定成员的索引
ZRANK key member
# 示例:返回 project1 中 zhangsan 的索引
ZRANK project1 zhangsan
移除有序集合中的一个或多个成员
# 格式:移除有序集合中的一个或多个成员
ZREM key member [member ...]
# 示例:移除 project1 中 zhangsan
ZREM project1 zhangsan
# 格式:返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGE key start stop [WITHSCORES]
# 示例:返回 project1 指定区间内的成员
ZREVRANGE project1 0 -1
# 格式:返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
# 注意:排名是从 0 开始的
ZREVRANK key member
# 示例:返回集合 project1 中 lisi 的排名
ZREVRANK project1 lisi
返回有序集中,成员的分数值
# 格式:返回有序集中,成员的分数值
ZSCORE key member
# 示例:返回 project1 中 lisi 的分数值
ZSCORE project1 lisi
说明
对所有类型都适用,因为都是
删除key
# 格式:该命令用于在 key 存在时删除 key
DEL key
# 示例
DEL project2
序列化给定 key ,并返回被序列化的值。
# 格式:序列化给定 key ,并返回被序列化的值
DUMP key
# 示例
DUMP kyle
检查 key 是否存在
# 格式:检查给定 key 是否存在
EXISTS key
# 示例
EXISTS kyle
设置过期时间 (秒)
# 格式:为给定 key 设置过期时间,以秒计
EXPIRE key seconds
# 示例:给 Jack 设置过期时间 10 s
EXPIRE Jack 10
设置过期时间 (毫秒)
# 格式:设置 key 的过期时间以毫秒计
PEXPIRE key milliseconds
# 示例:给 Jack 设置过期时间 2000 ms
PEXPIRE Jack 2000
查找key
# 格式:查找所有符合给定模式( pattern)的 key
KEYS pattern
# 示例:返回所有的key
keys *
# 示例:返回前缀为 city 的 key
keys city*
移除 key 的过期时间
# 格式:移除 key 的过期时间,key 将持久保持
PERSIST key
# 示例:移除 Korea 的过期时间
PERSIST Korea
返回 key 的剩余的过期时间(毫秒)
# 格式:以毫秒为单位返回 key 的剩余的过期时间
PTTL key
# 示例:返回 China 的过期时间
PTTL China
返回 key 的剩余的过期时间(秒)
# 格式:以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
TTL key
# 示例:移除 project1 中 zhangsan
TTL Japan
随机返回一个 key
# 格式:从当前数据库中随机返回一个 key
RANDOMKEY
修改 key 的名称
# 格式:修改 key 的名称
RENAME key newkey
# 格式:仅当 newkey 不存在时,将 key 改名为 newkey
RENAMENX key newkey
# 示例:修改 project2 的名称为 project3
RENAME project2 project3
返回 key 所储存的值的类型
# 格式:返回 key 所储存的值的类型
TYPE key
# 示例:返回 city7的类型
TYPE city7
什么是 BitMap
计算机最小的存储单位是位 bit
,Bitmaps
是针对位的操作的,相较于 String、Hash、Set 等存储方式更加节省空间,Bitmaps
不是一种数据结构,操作是基于 String
结构的,一个 String
最大可以存储 512M
,那么一个 Bitmaps
则可以设置 2^32
个位
BitMap 操作
Bitmaps 单独提供了一套命令,所以在 Redis
中使用 Bitmaps
和使用字符串的方法不太相同。可以把 Bitmaps
想象成一个以位为单位的数组,数组的每个单元只能存储 0
和 1
,数组的下标在 Bitmaps
中叫做偏移量
案例:通过 BitMap 高效统计日活跃用户数量
将每个独立用户(重复访问不算)是否访问过网站存放在 Bitmaps
中, 将访问的用户记做 1
, 没有访问的用户记做 0
, 用偏移量作为用户的 id
设置值
注意:第一次初始化 Bitmaps
时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成 Redis
的阻塞
# 格式:设置 BitMap 的 key、偏移量、value
SETBIT key offset value
# 示例:
# key 为 dau:users:2016-04-05
# 偏移量为用户 id
# 1 代表用户已访问
setbit dau:users:2020-04-28 11 1
setbit dau:users:2020-04-28 15 1
setbit dau:users:2020-04-28 19 1
setbit dau:users:2020-04-28 23 1
setbit dau:users:2020-04-28 88 1
# 格式:根据 key 和偏移量获取 值
GETBIT key offset
# 示例:获取日活统计中日期为2016-04-05中 用户 id 为 19 的用户是否访问过
getbit dau:users:2020-04-28 19
统计数量
# 格式:获取指定偏移量范围内的用户数量
BITCOUNT key [start end]
# 示例:获取日期为 2016-04-05 的用户访问时数量
bitcount dau:users:2020-04-28
Bitop复合操作介绍
bitop 是一个复合操作, 它可以做多个 Bitmaps
的 and
(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey 中
# 格式:按照指定的复合操作把一个或多个 bitmap 的结果存储到 destkey 中
# operation 为复合操作的类型:and、or、not、xor
# destkey 为将复合操作的结果保存的地方
BITOP operation destkey key [key, …]
计算交集
# 示例:计算 2020-04-28_29 和 2020-04-29 的交集,并将交集结果存储到 dau:users:result_and:2020-04-28_29
bitop and dau:users:result_and:2020-04-28_29 dau:users:2020-04-28 dau:users:2020-04-29
# 示例:计算 2020-04-28_29 和 2020-04-29 的并集,并将交集结果存储到 unique:users:result:2020-04-28_29
bitop or unique:users:result_or:2020-04-28_29 unique:users:2020-04-28 unique:users:2020-04-29
什么是 HyperLogLog
Redis 在 2.8.9
版本添加了 HyperLogLog
结构,HyperLogLog
是用来做基数统计的算法,HyperLogLog
的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的,每个键只需要花费 12 KB
内存,就可以计算接近 2^64
个不同元素的基数
注意: HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,不能返回我们存储的元素本身
HyperLogLog 的误差
HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%
,不过这对于页面用户访问量是没影响的,因为这种统计可能是访问量非常巨大,但是又没必要做到绝对准确,访问量对准确率要求没那么高,但是性能存储方面要求就比较高了,而 HyperLogLog
正好符合这种要求,不会占用太多存储空间,同时性能不错
案例:用户访问量统计
要统计一个页面的访问量(PV),可以直接用 redis
计数器或者直接存数据库都可以实现,如果要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样,我们可以使用 SET
集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value
存储对应的 userid
,这种方法是可行的
但如果访问量较多,假如有几千万的访问量,需要频繁创建 SET
集合对象,因此我们使用 HyperLogLog
查看帮助
help @hyperloglog
添加值
# 格式:添加一个或多个 value 到指定的 key 中
pfadd key value
# 示例:
# key:goods102.html 页面在 20201020 的 uv 量
# value:用户 id
pfadd uv_goods102.html_20201020 user_243
# 格式:获取指定 key 的基数
pfcount key
# 示例:goods102.html 页面在 20201020 的 uv 量
pfcount uv_goods102.html_20201020
合并
# 格式:合并 key1 和 key2,并将结果存储在 destination
pfmerge destination key1 [key2]
# 示例:统计 20201020 和20201021 两个日期的用户量
pfmerge uv_result uv_goods102.html_20201020 uv_goods102.html_20201021
数据备份(RDB) 方式一:文件配置(默认开启)
# 找到 redis.conf 配置文件
vim redis.conf
# 第 202 行进行配置,配置后重启 redis
# 配置说明:
# 表示在 900 秒内,有 1 个 key 发生变化,就会生成一份 redis 的快照
# 表示在 300 秒内,有 10 个 key 发生变化,就会生成一份 redis 的快照
# ...
save 900 1
save 300 10
save 60 10000
数据备份(RDB) 方式二:执行命令
# 执行 SAVE 命令,该命令将在 redis 安装目录中创建 dump.rdb 文件
# 命令说明:该命令会阻塞 Redis 主进程,直到保存完成为止,在主进程阻塞期间,服务器不能处理客户端的任何请求
SAVE
数据备份(RDB) 方式三:执行命令
# 执行 BGSAVE 命令,该命令将在 redis 安装目录中创建 dump.rdb 文件
# 命令说明:该命令使用异步线程执行,直到保存完成为止,不会阻塞,服务器可以正常处理客户端的任何请求
BGSAVE
数据恢复
# 1.获取数据目录
config get dir
# 2.将 dump.rdb 文件移动到该目录中