【数据库运维 -- Redis】Redis 基础知识总结
【1】Redis 基本数据结构
【1.1】键(Key)
Redis 中键与其他数据结构的示意图
Redis 键常用命令总结
序号 | 命令及描述 |
1 | DEL key 该命令用于在 key 存在时删除 key |
2 | DUMP key 序列化给定 key 并返回被序列化的值 |
3 | EXISTS key 检查给定 key 是否存在 |
4 | EXPIRE key seconds 为给定 key 设置过期时间,以秒计 |
5 | EXPIREAT key timestamp 用于为 key 设置过期时间,EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp) |
6 | PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计 |
7 | PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳 (unix timestamp) 以毫秒计 |
8 | KEYS pattern 查找所有符合给定模式(pattern)的 key |
9 | MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中 |
10 | PERSIST key 移除 key 的过期时间,key 将持久保持 |
11 | PTTL key 以毫秒为单位返回 key 的剩余的过期时间 |
12 | TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
13 | RANDOMKEY 从当前数据库中随机返回一个 key |
14 | RENAME key newkey 修改 key 的名称 |
15 | RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey |
16 | TYPE key 返回 key 所储存的值的类型 |
【1.2】字符串(String)
Redis 字符串常用命令总结
序号 | 命令及描述 |
1 | SET key value 设置指定 key 的值 |
2 | GET key 获取指定 key 的值 |
3 | GETRANGE key start end 返回 key 中字符串值的子字符 |
4 | GETSET key value 将给定 key 的值设为 value 并返回 key 的旧值(old value) |
5 | GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit) |
6 | MGET key1 [key2..] 获取所有(一个或多个)给定 key 的值 |
7 | SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
8 | SETEX key seconds value 将值 value 关联到 key 并将 key 的过期时间设为 seconds (以秒为单位) |
9 | SETNX key value 只有在 key 不存在时设置 key 的值 |
10 | SETRANGE key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
11 | STRLEN key 返回 key 所储存的字符串值的长度 |
12 | MSET key value [key value ...] 同时设置一个或多个 key-value 对 |
13 | MSETNX key value [key value ...] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
14 | PSETEX key milliseconds value 将值 value 关联到 key 并以毫秒为单位设置 key 的生存时间 |
15 | INCR key 将 key 中储存的数字值增一 |
16 | INCRBY key increment 将 key 所储存的值加上给定的增量值(increment) |
17 | INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) |
18 | DECR key 将 key 中储存的数字值减一 |
19 | DECRBY key decrement key 所储存的值减去给定的减量值(decrement) |
20 | APPEND key value 如果 key 已经存在并且是一个字符串,APPEND 命令将指定的 value 追加到该 key 原来值 (value) 的末尾 |
【1.3】散列表(Hash)
Redis 散列表常用命令总结
序号 | 命令及描述 |
1 | HDEL key field1 [field2] 删除一个或多个哈希表字段 |
2 | HEXISTS key field 查看哈希表 key 中指定的字段是否存在 |
3 | HGET key field 获取存储在哈希表中指定字段的值 |
4 | HGETALL key 获取在哈希表中指定 key 的所有字段和值 |
5 | HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment |
6 | HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
7 | HKEYS key 获取所有哈希表中的字段 |
8 | HLEN key 获取哈希表中字段的数量 |
9 | HMGET key field1 [field2] 获取所有给定字段的值 |
10 | HMSET key field1 value1 [field2 value2] 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
11 | HSET key field value 将哈希表 key 中的字段 field 的值设为 value |
12 | HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值 |
13 | HVALS key 获取哈希表中所有值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对 |
【1.4】列表(list)
Redis 列表常用命令总结
序号 | 命令及描述 |
1 | BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
2 | BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
3 | BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
4 | LINDEX key index 通过索引获取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 |
6 | LLEN key 获取列表长度 |
7 | LPOP key 移出并获取列表的第一个元素 |
8 | LPUSH key value1 [value2] 将一个或多个值插入到列表头部 |
9 | LPUSHX key value 将一个值插入到已存在的列表头部 |
10 | LRANGE key start stop 获取列表指定范围内的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 通过索引设置列表元素的值 |
13 | LTRIM key start stop 对一个列表进行修剪(trim),即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
14 | RPOP key 移除列表的最后一个元素,返回值为移除的元素 |
15 | RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 | RPUSH key value1 [value2] 在列表中添加一个或多个值 |
17 | RPUSHX key value 为已存在的列表添加值 |
【1.5】集合(Set)
Redis 集合常用命令总结
序号 | 命令及描述 |
1 | SADD key member1 [member2] 向集合添加一个或多个成员 |
2 | SCARD key 获取集合的成员数 |
3 | SDIFF key1 [key2] 返回给定所有集合的差集 |
4 | SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中 |
5 | SINTER key1 [key2] 返回给定所有集合的交集 |
6 | SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中 |
7 | SISMEMBER key member 判断 member 元素是否是集合 key 的成员 |
8 | SMEMBERS key 返回集合中的所有成员 |
9 | SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合 |
10 | SPOP key 移除并返回集合中的一个随机元素 |
11 | SRANDMEMBER key [count] 返回集合中一个或多个随机数 |
12 | SREM key member1 [member2] 移除集合中一个或多个成员 |
13 | SUNION key1 [key2] 返回所有给定集合的并集 |
14 | SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
【1.6】有序集合(Sorted Set)
Redis 有序集合常用命令总结
序号 | 命令及描述 |
1 | ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | ZCARD key 获取有序集合的成员数 |
3 | ZCOUNT key min max 计算在有序集合中指定区间分数的成员数 |
4 | ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment |
5 | ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
6 | ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量 |
7 | ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员 |
8 | ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员 |
9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 |
10 | ZRANK key member 返回有序集合中指定成员的索引 |
11 | ZREM key member [member ...] 移除有序集合中的一个或多个成员 |
12 | ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员 |
13 | ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员 |
14 | ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员 |
15 | ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
16 | ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序 |
17 | ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
18 | ZSCORE key member 返回有序集中,成员的分数值 |
19 | ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
20 | ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素 (包括元素成员和元素分值) |
【2】Redis 操作命令
【2.1】Redis 订阅与发布
Redis 订阅发布常用命令总结
序号 | 命令及描述 |
1 | PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道 |
2 | PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态 |
3 | PUBLISH channel message 将信息发送到指定的频道 |
4 | PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道 |
5 | SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息 |
6 | UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道 |
【2.2】Redis 事务
Redis 事务可以一次执行多个命令,并且带有以下三个重要的保证
- 1) 批量操作在发送 EXEC 命令前被放入队列缓存
- 2) 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行
- 3) 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中
Redis 事务相关常用命令总结
序号 | 命令及描述 |
1 | DISCARD 取消事务,放弃执行事务块内的所有命令 |
2 | EXEC 执行所有事务块内的命令 |
3 | MULTI 标记一个事务块的开始 |
4 | UNWATCH 取消 WATCH 命令对所有 key 的监视 |
5 | WATCH key [key ...] 监视一个(或多个) key 如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
【2.3】Redis 数据备份与恢复命令与配置
【2.3.1】SAVE 命令(RDB 方式)
Redis 备份数据
- Redis SAVE 命令用于创建当前数据库的备份
- 该命令将在 redis 安装目录中创建 dump.rdb 文件
- 接收到 SAVE 命令的 Redis 服务器将遍历数据库包含的所有数据库,并将各个数据库包含的键值对全部记录到 RDB 文件中;
- 在 SAVE 命令执行期间,Redis 服务器将阻塞,直到 RDB 文件创建完毕为止;
- 如果 Redis 服务器在执行 SAVE 命令时已经拥有了相应的 RDB 文件,那么服务器将使用新创建的 RDB 文件代替已有的 RDB 文件;
Redis 恢复数据
- 只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
【2.3.2】BGSAVE 命令(RDB 方式)
- BGSAVE 命令用于创建 redis 数据库的备份文件,该命令在后台运行;
【2.3.3】通过配置选项自动备份 redis 数据库数据(RDB 方式)
- 通过设置 save 选项,使得 Redis 服务器在满足指定条件时自动执行 BGSAVE 命令
- 配置格式,save <seconds> <changes>
- seconds 用于指定触发持久化操作所需的时长
- changes 用于指定触发持久化操作所需的修改次数
- 即如果服务器在 seconds 秒之内,对其包含的各个数据库总共执行了至少 changes 次修改,那么服务器将自动执行一次 BGSAVE 命令
- 配置格式,save <seconds> <changes>
- 注意,为了避免由于同时使用多个触发条件而导致服务器过于频繁地执行 BGSAVE 命令,Redis 服务器在每次成功创建 RDB 文件之后,负责将触发 BGSAVE 命令的时间计数器以及修改次数计数器清零并重新开始计数
【附录 A】Redis 持久化方式 -- RDB 和 AOF
【A-1】RDB
RDB 持久化方式能够在指定的时间间隔能对数据进行快照存储,在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中,在 Redis 运行时,RDB 程序将当前内存中的数据库快照保存到磁盘文件中,在 Redis 重启动时,RDB 程序可以通过载入 RDB 文件来还原数据库的状态;
RDB 配置示例
# RDB 自动持久化规则
# 当 900 秒内有至少有 1 个键被改动时,自动进行数据集保存操作
save 900 1
# 当 300 秒内有至少有 10 个键被改动时,自动进行数据集保存操作
save 300 10
# 当 60 秒内有至少有 10000 个键被改动时,自动进行数据集保存操作
save 60 10000
# RDB 持久化文件名
dbfilename dump-<port>.rdb
# 数据持久化文件存储目录
dir /var/lib/redis
# bgsave 发生错误时是否停止写入,通常为 yes
stop-writes-on-bgsave-error yes
# rdb 文件是否使用压缩格式
rdbcompression yes
# 是否对 rdb 文件进行校验和检验,通常为 yes
rdbchecksum yes
【A-2】AOF
AOF 持久化简介
使能 AOF 持久化功能
appendonly yes
打开 AOF 后,每当 Redis 执行一个改变数据集的命令时,该命令就会被追加到 AOF 文件的末尾,从而当 Redis 重新启时,程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的;
AOF 的创建与恢复流程
AOF 持久化策略
- always,每次有新命令追加到 AOF 文件时就执行一次 fsync,非常慢,也非常安全
- everysec,每秒 fsync 一次,足够快并且在故障时只会丢失 1 秒钟的数据
- no,从不 fsync,将数据交给操作系统来处理,由操作系统来决定什么时候同步数据,更快也更不安全
AOF 重写
AOF 重写效果与实现方式图示
AOF 持久化相关参数
参数 | 含义 |
auto-aof-rewrite-min-size | 触发 AOF 文件执行重写的最小尺寸 |
auto-aof-rewrite-percentage | 触发 AOF 文件执行重写的增长率 |
aof_current_size | AOF 文件当前尺寸(字节) |
aof_base_size | AOF 文件上次启动和重写时的尺寸(字节) |
AOF 重写触发条件
- aof_current_size > auto-aof-rewrite-min-size
- (aof_current_size - aof_base_size) * 100 / aof_base_size > auto-aof-rewrite-percentage
AOF 配置示例
# 开启 AOF 持久化方式
appendonly yes
# AOF 持久化文件名
appendfilename appendonly-<port>.aof
# 每秒把缓冲区的数据同步到磁盘
appendfsync everysec
# 数据持久化文件存储目录
dir /var/lib/redis
# 是否在执行重写时不同步数据到 AOF 文件
# 这里的 yes,就是执行重写时不同步数据到 AOF 文件
no-appendfsync-on-rewrite yes
# 触发 AOF 文件执行重写的最小尺寸
auto-aof-rewrite-min-size 64mb
# 触发 AOF 文件执行重写的增长率
auto-aof-rewrite-percentage 100
【2.4】Redis 性能测试命令
命令格式,redis-benchmark [option] [option value]
命令参数
序号 | 选项 | 描述 | 默认值 |
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器 socket | |
4 | -c | 指定并发连接数 | 50 |
5 | -n | 指定请求数 | 10000 |
6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 2 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
9 | -P | 通过管道传输 <numreq> 请求 | 1 |
10 | -q | 强制退出 redis,仅显示 query/sec 值 | |
11 | -csv | 以 CSV 格式输出 | |
12 | -l | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表 | |
14 | -I | Idle 模式,仅打开 N 个 idle 连接并等待 |
致谢
本博客为本人的学习笔记与实际操作分享,同时,参考网上众多博主的技术博客总结而成,在此向各位博主表示感谢,本博客若有不足请多多指正;
【1】详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)