Redis restudy 6 conf 持久化
uwupu 啦啦啦啦啦

Redis.conf

单位

1
2
3
4
5
6
7
8
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.

在单位上,大小写不敏感。

include

1
2
# include /path/to/local.conf
# include /path/to/other.conf

可以包含别的配置文件。

网络

1
2
3
bind 127.0.0.1 ::1  #绑定的IP地址
protected-mode yes # 保护模式开关
port 6379 # 端口

General

1
2
3
4
5
6
7
8
9
10
11
12
13
daemonize yes #以守护进程方式运行
pidfile /var/run/redis/redis-server.pid #若以后台方式运行,就需要指定一个pid文件

# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 生产环境适用
# warning (only very important / critical messages are logged)
loglevel notice #日志级别

logfile /var/log/redis/redis-server.log #日志的文件位置
databases 16 # 默认数据库数量
always-show-logo yes #是否总是展示logo

SNAPSHOTTING 快照

持久化,在规定的时间内,执行了多少次操作,则会进行一次持久化。

Redis是内存数据库,没有持久化,数据断电即失。

1
2
3
save 900 1     #每隔900秒尝试进行保存,若修改次数>=1则进行一次快照保存
save 300 10 #每隔300秒尝试进行保存,若修改次数>=10则进行一次快照保存
save 60 10000 #每隔60秒尝试进行保存,若修改次数>=10000则进行一次快照保存
1
2
3
4
stop-writes-on-bgsave-error yes  #持久化出错,是否继续工作
rdbcompression yes # 是否开启rdb文件压缩,需要消耗CPU资源
rdbchecksum yes #保存rdb文件时,进行rdb文件校验
dbfilename dump.rdb #rdb文件保存目录

REPLICATION复制

SECURITY安全

1
requirepass 123456 # 设置密码,默认没有密码

CLIENTS客户端

1
2
3
4
5
6
7
8
9
maxclients 1000 #设置redis最大客户端数量
maxmemory <bytes> #设置最大内存容量
maxmemory-policy noeviction #内存满了,处理策略
#noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。(默认值)
#allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
#volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。 #allkeys-random: 所有key通用; 随机删除一部分 key。
#volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
#volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。

APPEND ONLY MODE 模式 aof

1
2
3
4
5
6
appendonly no  #默认不开启aof模式,
#默认使用的是rdb方式持久化,大部分情况下rdb够用。
appendfilename "appendonly.aof" #持久化文件名
appendfsync everysec # 每秒执行一次同步,可能会丢失这一秒的数据
#always #每次修改值都会写入
#no #不执行,这个时候操作系统自己同步数据,速度最快。

Redis持久化

参考文献:https://www.cnblogs.com/xing1/p/16380120.html

Redis是内存数据库,若不将内存中数据库状态保存到磁盘,一旦服务器进程退出,服务器中数据库状态就会消失,所以Redis提供了持久化功能。

RDB(Redis Database)

指定时间间隔内将内存中数据快照写入磁盘。

Redis单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了,再用这个临时文件替换上次持久化好的文件。

主进程不进行任何IO操作,确保了极高的性能。

如果要大规模进行数据恢复,且对于数据恢复的完整性不是非常敏感,那RDB的方式要比AOF方式更加高效。RDB缺点是最后一次持久化后数据可能丢失。

默认情况下使用RDB。

默认保存文件为:dump.rdb

1
dbfilename: dump.rdb

触发条件

  1. save规则满足
  2. 执行flushall
  3. 关闭redis服务器

rdb文件恢复

将rdb文件放到Redis启动目录就可,redis启动会检查rdb文件然后恢复。

  • /user/local/bin

优点

  1. 适合大规模数据恢复

  2. 对数据完成性要求不高

缺点:

  1. 需要一定的时间间隔进程操作。若redis意外宕机了,最后一次修改数据就没有了
  2. fork进程的时候,会占用一定的内存空间。

有时候在生产环境我们会对这个文件进行备份。

AOF(Append Only File)

介绍

将所有命令都记录下来,恢复的时候就把这个文件再全部执行一遍;

以日志的形式记录每个写操作,将Redis执行过的所有指令记录下来(不记录读操作),只可追加文件不可改写文件,Redis启动之初会读取该文件重新构建数据,Redis重启的话就根据日志文件的内容将所有指令执行一次以完成数据恢复操作。

AOF重写

AOF追加文件会越来越大,这样不合理;

为了解决这个问题,当文件大到一定程度,会触发AOF重写

AOF重写会将内存中的数据库用命令的方式重写一个aof文件,来为AOF文件减肥

  • 当AOF文件体积变得过大时,会fork出一条新进程来将文件重写(先写临时文件,然后rename),遍历新进程的内存数据,每条记录有一条set语句。重写aof文件操作,没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写一个新的aof文件(与快照类似)。
  • 在子进程重写期间,服务端正常对外服务,服务端会将在重写期间收到的数据缓存到aof_rewrite_buf中,也就是单独开辟一块缓存来存储重写期间收到的命令,在子进程重写完成后,再把缓存的数据追加到新的aof文件中。
  • 重写期间写出的aof文件是一个临时文件,不是旧文件,在重写结束后会删除旧的aof文件,然后临时文件会rename,成为当前使用的aof文件。

配置文件

AOF默认文件:appendonly.aof

AOF默认不开启,需要手动开启

1
2
3
4
5
6
7
appendonly no #no表示关闭 yes表示开启
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no #在执行AOF重写期间是否进行AOF文件同步
auto-aof-rewrite-percentage 100 #目前AOF文件超过上次重写文件的百分之多少时候再次重写,这里指上次重写文件的1倍
auto-aof-rewrite-min-size 64mb #设置允许重写的最小文件大小,防止文件本身就小还要重写。

aof-use-rdb-preamble no #Redis4.0新增的RDB-AOF混合持久化方式,其中RDB负责记录已有数据,AOF负责记录最近发生变化的数据。这样就同时兼有AOF和RDB的优点:既能够快速生成重写文件,也能在出现问题时,快速地载入数据。

AOF文件修复

当aof文件有错误,Redis则无法启动,就需要修复这个aof文件;

redis提供了一个工具redis-check-aof

1
redis-check-aof --fix appendonly.aof

redis-check-aof修复会删除错误的指令,将错误的数据删除。

优点

  1. 每次修改都同步,文件完整性更高

缺点

  1. 数据文件大,
  2. 修复速度慢
  3. AOF运行效率比rdb低
 评论