多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
1)什么是持久化 redis所有数据保存在内存中, 对数据的更新将异步地保存到磁盘上 2)Redis持久化的实现方式 * 快照方式 Redis RDB * 写日志 Redis AOF 3)RDB * 什么是RDB ![](https://box.kancloud.cn/01f055bf4c41321abb87a5ca9b1d6862_745x451.png) * 触发机制-主要三种方式 第一种:save同步 当客户端连接到redis服务器,执行save命令,此时redis会被阻塞,其他客户端的请求就会被阻塞咯,等待save命令执行完毕后 第二种:bgsave异步 当客户端连接redis服务器,执行bgsave命令,此时redis主进程会通过系统调用fork一个子进程出来,阻塞发生在fork阶段,之后父进程还可以正常接收请求,有子进程创建生成RDB文件,成功后,通知redis主进程 第三种: 自动配置 save 900 1 save 300 10 save 60 10000 通过在配置文件redis.conf中配置,满足任意一个条件,就触发bgsave命令,通过异步地方式创建RDB文件(二进制) ![](https://box.kancloud.cn/39474588cd076be5b9c64d5587d2e8d1_847x351.png) 还有其他方式也会触发生成RDB文件 比如shutdown(关闭redis),debug reload 总结: RDB是redis内存到硬盘的快照 save通常会阻塞客户端命令 bgsave不会阻塞客户端命令,但是会fork新进程 编写redis.conf文件save命令,满足任意一个条件就会触发执行 比如shutdown,debug reload也会触发生成RDB 4)AOF * RDB存在的问题 第一:耗时 如果数据量大,耗时时间更长,通过bgsave模式,需要执行fork(),消耗内存资源,磁盘I/O性能 第二:不可靠,会丢失部分数据 比如在上午9点执行了多个写命令,在9点20分钟满足RDB自动创建的条件,此时生成一份RDB文件,然后9点22分钟再次执行了很多写命令,在9点30分钟,redis机器故障,此时还没有触发条件也没有手动save或bgsave,此时从9点20到9点30之间的keys就会被丢失 * 什么是AOF ![](https://box.kancloud.cn/075a38adc7f88d954a487c75c18ca91e_833x426.png) ![](https://box.kancloud.cn/51449066854298e03448c71a1e88bfa6_814x411.png) * AOF三种策略 # appendfsync always appendfsync everysec (每秒钟写一次) # appendfsync no 第一种:awlays redis写命令刷新到缓冲区,然后实时每条命令fsync到硬盘 第二种:everysec redis写命令刷新到缓冲区,然后每秒把缓冲区的命令fsync到硬盘到 第三种: no redis写命令刷新到缓冲区,然后又OS系统觉得fsync到硬盘,一般不用 * AOF重写 因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大,执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。 AOF重写的所用: 减少硬盘占有量和加速恢复速度 AOF重写实现的两种方式 第一种:通过bgrewriteaof client连接redis执行bgrewriteaof命令,redis立即返回ok,然后redis主进程通过fork()生成子进程,由子进程完成AOF重写 第二种:通过aof重写配置 ![](https://box.kancloud.cn/59d3e5b529f55cc89d7fd9d04a54d661_807x412.png) 重写过程: 1)redis主进程通过fork创建子进程 2)子进程根据redis内存中的数据创建数据库重建命令序列与临时文件中 3)父进程继续执行client的请求,并会把这些请求中的写操作追加到原来AOF文件,额外,这些新的写请求,也会放到一个缓存队列中 4)当子进程重写完成,会通知父进程,父进程把缓冲的命令追加到临时文件中 5) 父进程用临时文件替换老的AOF文件 配置如下 ~~~ appendonly yes # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof" # appendfsync always appendfsync everysec (每秒钟写一次) # appendfsync no no-appendfsync-on-rewrite no(yes) auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes dir /var/lib/redis ~~~ [root@huancun01 redis]# ll total 8 -rw-r--r--. 1 redis redis 1599 Feb 26 16:27 appendonly.aof -rw-r--r--. 1 redis redis 391 Feb 26 16:34 dump.rdb