Redis的AOF和RDB有啥区别,三种淘汰机制是什么?

南风 2020年11月07日 102次浏览

一、什么是RDB和AOF?

Redis支持两种持久化方式:RDB快照持久化方式和AOF日志持久化方式。
RDB快照方式是每隔一段时间的某个时刻从内存中将Redis数据写入磁盘,类似于MySQL的Dump方式,但是每隔一段时间写入磁盘在服务器异常宕机的情形下会丢失一部分未写入磁盘的数据。在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。

RDB工作方式:

  • 1、Redis 调用forks。同时拥有父进程和子进程。
  • 2、子进程将数据集写入到一个临时 RDB 文件中。
  • 3、当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

优点

  • 1、RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份。
  • 2、RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心(可能加密),数据安全有保障,非常适用于灾难恢复。
  • 3、RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
  • 4、与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

缺点

  • 1、耗时、耗服务器性能,需要经常开一个fork线程去将内存数据刷到磁盘,如果数据量比较大时,性能很低。
  • 2、不可控,丢失数据严重,当某个时刻系统宕机,那么那一批写入内存未写入磁盘的数据将会丢失,无法修复。

AOF日志持久化是在Redis打开了这个配置之后,每次客户端变更命令到达的时候都会将命令原封不动的拼接在AOF文件的末尾。这样可解决RDB数据一致性的问题。因为是实时写入,不存在宕机后无法找回数据的问题。

优点

  • 1、AOF文件体积过大时,自动重写,减少无用命令的记录,提升系统性能。
  • 2、使用redis-check-aof可以修复因故障无法写入的命令。
  • 3、每秒fsync策略写入,最多丢失一秒内数据。
  • 4、AOF记录客户端的原始命令格式,易于读懂排查解决问题。

缺点

  • 1、对于相同的数据集,AOF文件体积比RDB的要大的多。
  • 2、使用每秒fsync策略,写入性能略低于RDB策略。

二、Redis淘汰机制

  • noeviction: 可以继续读请求,不可以进行写请求。
    返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但 DEL 和几个例外);
    默认淘汰策略。
  • volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在设置了过期时间的键,使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在设置了过期时间的键。
  • volatile-ttl: 回收设置了过期时间的键,淘汰策略是优先回收剩余时间 (TTL) 较短的键,使得新添加的数据有空间存放。
  • allkeys-lru: 对全部集合进行回收,尝试回收最少使用的键 (LRU),使得新添加的数据有空间存放。
  • allkeys-random: 对全部集合进行回收,回收随机的键使得新添加的数据有空间存放。
  • volatile-lfu: 对设置了过期时间的键进行 LFU 策略的过期筛选;
  • allkeys-lfu: 对全部的键进行 LFU 策略的过期筛选;

(全文完)