# Redis基本特性及原理
# IO模型
Redis采用Epoll的IO模型,epoll的原理详见系统IO的章节
# 二进制安全
Redis进程与客户端进行交互的时候,存取的是字节流。目的是保证数据不被破坏
set k1 中 // 默认shell连接方式是utf8
strlen k1 // 结果 3
set k2 中 // 修改shell连接方式为gbk
strlen k2 // 结果 2
2
3
4
# 数据库
Redis默认准备了16个库,(id为 0-15)
库的选择
连接后使用select命令选择使用哪个库
select id
1连接时指定
redis-cli -n id
1
# 单机持久化
# RDB
原理
执行持久化时Redis会fork()一个子进程来执行持久化。在执行fork的时候操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据
fork()
系统调用
cow( copy on write)
写时复制,内核机制
如何触发
save命令
关机维护
bgsave命令
配置文件save
实际使用的bgsave
配置方法
save 时间(秒) 操作数
如:save 900 1
关闭配置
save '',或者直接删除
配置文件
dbfilename dump.rdb
路径
dir /var/lib/redis/6379
弊端
不支持拉链,只存在一个rdb文件
丢失数据相对多一些
时点与时点之间窗口数据容易丢失
优势
类似java中的序列化恢复的速度相对快
# AOF
原理
Redis写操作记录到文件中
RDB和AOF可以同时开启
- 如果开启了AOF只会用AOF恢复
- 4.0以后AOF中包含RDB全量,增加记录新的写操作
弊端
体量无限变大,恢复慢
hdfs,fsimage+edits.log 让日志只记录增量合并的过程
4.0以前-->重写
删除抵消的命令,合并重复的命令,最终也是一个纯指令的日志文件
4.0以后-->重写
- 将老的数据RDB到AOF文件中
- 将增量的以指令的方式Append到AOF中
文件写会触发IO,存在丢失buffer数据的问题
append only mode
- 配置刷盘的频率
- appendfsync always
- appendfsync everysec
- appendfsync no
- 配置刷盘的频率
优势
- 丢数据少
- 4.0以后的AOF是一个混合体,利用了RDB的快也利用了日志的全量
什么时候触发合并bgrewriteaof
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
1
2redis在一次重写万之后会记录这次重写后aof大小,如果之前没有记录就以当前aof大小为准。在下次做readonlysync时判断aof文件增长比例,指当前aof文件比上次重写的增长比例大小。如果大于这个比例就触发重写。
实操验证
readonly.aof文件内容协议
*2 $6 SELECT $1 0 *3 $3 set $2 k1 $1 1
1
2
3
4
5
6
7
8
9
10
11
12*2
该条指令包含两个元素 select 0
$6
元素包含6个字符
redis-check-rdb dump.rdb
验证rdb文件的完整性
bgrewriteaof