本期我们来细看Redis的配置文件,通过配置文件了解Redis的持久化等机制。
基本配置
unit单位对大小写不敏感:
1 | 1k => 1000 bytes |
绑定IP,注释或设为0.0.0.0代表所有IP都可以访问:
1 | bind 127.0.0.1 |
端口号,默认6379:
1 | port 6379 |
保护模式(没有设置密码则只能从本地访问),默认打开:
1 | protected-mode yes |
以守护进程的方式运行,默认关闭:
1 | daemonize no |
日志级别(debug / verbose / notice / warning),默认notice:
1 | loglevel notice |
数据库数量,默认16:
1 | databases 16 |
设置密码,默认空:
1 | requirepass 你设置的密码 |
最多客户端数量,默认10000:
1 | maxclients 10000 |
最大内存:
1 | maxmemory <bytes> |
内存已满的处理策略,默认noeviction
:
volatile-lru
只对设置过期时间的key进入lruallkeys-lru
删除lru算法的keyvolatile-random
随机删除即将过期的keyallkeys-random
随机删除volatile-ttl
删除即将过期的noeviction
永不过期,报错
1 | maxmemory-policy noeviction |
持久化介绍
RDB
RDB(Redis DataBase),Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化。
RDB其实就是把数据以快照的形式保存到磁盘上,会在指定的时间间隔内将内存的数据写入磁盘。这种持久化是Redis默认的持久化方式。
优势:
- RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
- 生成RDB文件的时候,redis主进程会fork一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
- RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
劣势:
- 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
- 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
AOF
AOF(Append Only File),Redis的操作日志以追加的方式写入文件。
优势:
该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。
由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。
如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
劣势:
- 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
- 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。
持久化配置
RDB
save second number
表示second秒内若有number条数据更新,就生成快照(事实上flush和退出命令也会生成快照)。下面是默认配置:
1 | save 900 1 # 900秒内有1条数据更新就生成快照 |
持久化出错是否停止,默认yes:
1 | stop-writes-on-bgsave-error yes |
是否压缩快照(会消耗CPU资源),默认yes:
1 | rdbcompression yes |
是否进行错误校验,默认yes:
1 | rdbchecksum yes |
生成快照的名字,默认dump.rdb
,数据库启动时会读取该文件:
1 | dbfilename dump.rdb |
文件保存目录:
1 | dir ./ |
AOF
是否开启AOF,默认关闭:
1 | appendonly no |
AOF文件名:
1 | appendfilename "appendonly.aof" |
AOF同步方法,默认everysec
:
always
每次更新都同步everysec
每秒同步一次(可能会在1秒内丢失数据)no
操作系统自己同步数据
1 | appendfsync everysec |
日志是否进行重写,默认no:
1 | no-appendfsync-on-rewrite no |
文件最小达到多大就重写:
1 | auto-aof-rewrite-min-size 64MB |
每次重写后的增长百分比:
1 | auto-aof-rewrite-percentage 100 |
关于AOF文件
AOF文件实际上就是一个日志,记录了所有更新操作,而加载数据时,就将日志文件从头到尾运行一遍:
1 | *2 |
重写
Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。
而所谓重写最小大小和重写百分比的意思是,每次重写之后,随着新数据的加入,日志会不断增长,直到比之前更大。我们第一次达到64MB就重写,若将百分比设为200%,则第二次达到128MB就重写,第三次达到256MB就重写,以此类推,保证日志可以容纳数据。
修改
假设日志文件出错,数据库启动时会拒绝加载这个文件。
我们可以通过redis-check-aof --fix appendonly.aof
修复aof文件。
发布订阅
Redis 发布订阅(pub / sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
subscribe channel [channel ...]
订阅频道,例:
1 | 127.0.0.1:6379> subscribe koorye |
开启后会阻塞接收信息。
再开启一个终端: publish channel message
发布信息,例:
1 | 127.0.0.1:6379> publish koorye "hello world" |
此时另一个终端接收到:
1 | 1) "message" |