Redis持久化方式
已订正
1. Redis 提供了不同级别的持久化方式:
- RDB(Redis DataBase)持久化:Redis 可以通过创建快照来存储内存里面的数据在某个时间点上的副本到本地数据库中,如果系统,Redis或者硬件其中之一崩溃,那么Redis将丢失最近一次创建快照之后写入的所有数据.
- AOF(Append Only File)持久化:AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化.它可以做到每秒一次的频率对AOF文件进行同步.
- 不持久化:如果你只希望数据在服务器运行的时候存在,你也可以不使用任何持久化方式
- RDB+AOF模式 :在这种情况下, 当Redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
2. RDB的优点,和缺点
优点:RDB是一个非常紧凑的文件,它保存了某个时间点的数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
缺点:如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.因为RDB更容易丢失数据.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据.RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.
3. AOF优点和缺点
优点:使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
缺点:对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积.根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB .
4. 如何选择持久化方式
RDB 持久化恢复数据集的速度要比AOF快一点,但是容易丢失更多的数据.AOF可以在每秒进行一次记录,如果发生系统崩溃最多丢失1秒的数据,更加可靠.但是它AOF文件比较大,恢复速度要慢一点.
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化.有很多用户都只使用 AOF 持久化,但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能.
1. 快照与备份有什么区别?link
一句话答案:快照记录逻辑地址和物理地址的对应关系;备份则是数据存储的某一个时刻的副本.这是两种完全不同的概念.
2. 内部存储与外部存储的区别:link
内部存储:
内部存储不是内存,而是一个位于系统中很特殊的一个位置.放入内部存储中的数据一般都只能被你的应用访问到,且一个应用所创建的所有文件都在应用包名相同的目录下,即/data/data/packagename.创建于内部存储的文件,是与这个应用关联起来的.当一个应用被卸载后,内部存储中的这些数据也被删除.
外部存储:
最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储.