Redis第三讲
一、Redis存储五种类型的常用命令(暂略)
二、持久化( 了解)
Redis 的高性能是由于其将所有数据都存储在了内存中,为了使 Redis 在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
Redis 支持两种方式的持久化,一种是 RDB 方式,一种是 AOF 方式。可以单独使用其中一种或将二者结合使用。
RDB 持久化
RDB 方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时 Redis 会自动将内存中的数据进行快照并持久化到硬盘。
RDB 是 Redis 默认采用的持久化方式,在 redis.conf(Windows 下是 redis.windows.conf)配置文件中默认有此下配置:
save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示 15 分钟(900 秒钟)内至少 1 个键被更改则进行快照,“save 300 10”表示 5 分钟(300 秒)内至少 10 个键被更改则进行快照。
在 redis.conf 中:
配置 dir 指定 rdb 快照文件的位置
配置 dbfilenam 指定 rdb 快照文件的名称
Redis 启动后会读取 RDB 快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为 1GB 的快照文件载入到内存中需要花费 20~30 秒钟。
使用建议:
通过 RDB 方式实现持久化,一旦 Redis 异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用 AOF 方式进行持久化。
AOF 持久化
默认情况下 Redis 没有开启 AOF(append only file)方式的持久化,可以通过 appendonly参数并指定为 yes 开启:
开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof,可以通过 appendfilename 参数修改:appendfilename appendonly.aof
同步策略
appendfsync no
当设置 appendfsync 为 no 的时候,Redis 不会主动调用 fsync 去将 AOF 日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数 Linux 操作系统,是每 30 秒进行一次 fsync,将缓冲区中的数据写到磁盘上。
appendfsync everysec
当设置 appendfsync 为 everysec 的时候,Redis 会默认每隔一秒进行一次 fsync 调用,将缓冲区中的数据写到磁盘。但是当这一次的 fsync 调用时长超过 1 秒时。Redis 会采取延迟fsync 的策略,再等一秒钟。也就是在两秒后再进行 fsync,这一次的 fsync 就不管会执行多长时间都会进行。这时候由于在 fsync 时文件描述符会被阻塞,所以当前的写操作就会阻塞。
appendfsync always
当设置 appendfsync 为 always 时,每一次写操作都会调用一次 fsync,这是数据是最安全的,当然,由于每次都会执行 fsync,所以其性能也会受到影响。
二者比较