将数据从掉电易失的内存放到永久存储的设备上redis
由于全部的数据都在内存上,因此必须得持久化数据库
一、保存真实的数据
二、将服务器包含的全部数据库数据以二进制文件的形式保存到硬盘里面
三、默认文件名 :/var/lib/redis/dump.rdb缓存
方式一:服务器执行客户端发送的SAVE或者BGSAVE命令安全
127.0.0.1:6379> SAVE OK # 特色 1、执行SAVE命令过程当中,redis服务器将被阻塞,没法处理客户端发送的命令请求,在SAVE命令执行完毕后,服务器才会从新开始处理客户端发送的命令请求 2、若是RDB文件已经存在,那么服务器将自动使用新的RDB文件代替旧的RDB文件 # 工做中定时持久化保存一个文件 127.0.0.1:6379> BGSAVE Background saving started # 执行过程以下 1、客户端 发送 BGSAVE 给服务器 2、服务器立刻返回 Background saving started 给客户端 3、服务器 fork() 子进程作这件事情 4、服务器继续提供服务 5、子进程建立完RDB文件后再告知Redis服务器 # 配置文件相关操做 /etc/redis/redis.conf 263行: dir /var/lib/redis # 表示rdb文件存放路径 253行: dbfilename dump.rdb # 文件名 # 两个命令比较 SAVE比BGSAVE快,由于须要建立子进程,消耗额外的内存 # 补充:能够经过查看日志文件来查看redis都作了哪些操做 # 日志文件:配置文件中搜索 logfile logfile /var/log/redis/redis-server.log
方式二:设置配置文件条件知足时自动保存(使用最多)服务器
# 命令行示例 redis>save 300 10 表示若是距离上一次建立RDB文件已通过去了300秒,而且服务器的全部数据库总共已经发生了很多于10次修改,那么自动执行BGSAVE命令 redis>save 60 10000 表示若是距离上一次建立rdb文件已通过去60秒,而且服务器全部数据库总共已经发生了很多于10000次修改,那么执行bgsave命令 # redis配置文件默认 218行: save 900 1 219行: save 300 10 220行: save 60 10000 1、只要三个条件中的任意一个被知足时,服务器就会自动执行BGSAVE 二、每次建立RDB文件以后,服务器为实现自动持久化而设置的时间计数器和次数计数器就会被清零,并从新开始计数,因此多个保存条件的效果不会叠加
1、存储的是命令,而不是真实数据 2、默认不开启 # 开启方式(修改配置文件) 一、/etc/redis/redis.conf 672行: appendonly yes # 把 no 改成 yes 676行: appendfilename "appendonly.aof" 2、重启服务 sudo /etc/init.d/redis-server restart
一、建立RDB文件须要将服务器全部的数据库的数据都保存起来,这是一个很是消耗资源和时间的操做,因此服务器须要隔一段时间才建立一个新的RDB文件,也就是说,建立RDB文件不能执行的过于频繁,不然会严重影响服务器的性能
二、可能丢失数据app
# 原理 1、每当有修改数据库的命令被执行时,服务器就会将执行的命令写入到AOF文件的末尾 2、由于AOF文件里面存储了服务器执行过的全部数据库修改的命令,因此给定一个AOF文件,服务器只要从新执行一遍AOF文件里面包含的全部命令,就能够达到还原数据库的目的 # 优势 用户能够根据本身的须要对AOF持久化进行调整,让Redis在遭遇意外停机时不丢失任何数据,或者只丢失一秒钟的数据,这比RDB持久化丢失的数据要少的多
# 由于 虽然服务器执行一个修改数据库的命令,就会把执行的命令写入到AOF文件,但这并不意味着AOF文件持久化不会丢失任何数据,在目前常见的操做系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提升效率,系统一般不会直接将内容写入硬盘里面,而是将内容放入一个内存缓存区(buffer)里面,等到缓冲区被填满时才将存储在缓冲区里面的内容真正写入到硬盘里 # 因此 1、AOF持久化:当一条命令真正的被写入到硬盘里面时,这条命令才不会由于停机而意外丢失 2、AOF持久化在遭遇停机时丢失命令的数量,取决于命令被写入到硬盘的时间 三、越早将命令写入到硬盘,发生意外停机时丢失的数据就越少,反之亦然
# 打开配置文件:/etc/redis/redis.conf,找到相关策略以下 1、701行: alwarys 服务器每写入一条命令,就将缓冲区里面的命令写入到硬盘里面,服务器就算意外停机,也不会丢失任何已经成功执行的命令数据 二、702行: everysec(# 默认) 服务器每一秒将缓冲区里面的命令写入到硬盘里面,这种模式下,服务器即便遭遇意外停机,最多只丢失1秒的数据 3、703行: no 服务器不主动将命令写入硬盘,由操做系统决定什么时候将缓冲区里面的命令写入到硬盘里面,丢失命令数量不肯定 # 运行速度比较 always:速度慢 everysec和no都很快,默认值为everysec
(六)AOF文件中是否会产生不少的冗余命令?函数
为了让AOF文件的大小控制在合理范围,避免胡乱增加,redis提供了AOF重写功能,经过这个功能,服务器能够产生一个新的AOF文件 -- 新的AOF文件记录的数据库数据和起因的AOF文件记录的数据库数据彻底同样 -- 新的AOF文件会使用尽量少的命令来记录数据库数据,所以新的AOF文件的说起一般会小不少 -- AOF重写期间,服务器不会被阻塞,能够正常处理客户端发送的命令请求
示例:性能
原有AOF文件 | 重写后的AOF文件 |
---|---|
select 0 | SELECT 0 |
sadd myset peiqi | SADD myset peiqi qiaozhi danni lingyang |
sadd myset qiaozhi | |
sadd myset danni | |
sadd myset lingyang | |
INCR number | |
INCR number | |
DEL number | |
SET message 'hello world' | SET msg 'hello tarena' |
SET message 'hello tarena' | |
RPUSH mylist 1 2 3 | RPUSH mylist 2 3 5 |
RPUSH mylist 5 | |
LPOP mylist |
1、客户端向服务器发送BGREWRITEAOF命令 127.0.0.1:6379> BGREWRITEAOF Background append only file rewriting started 2、修改配置文件让服务器自动执行BGREWRITEAOF命令 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 解释 一、只有当AOF文件的增量大于100%时才进行重写,也就是大一倍的时候才触发 # 第一次重写新增:64M # 第二次重写新增:128M # 第三次重写新增:256M(新增128M)
RDB持久化 | AOF持久化 |
---|---|
全量备份,一次保存整个数据库 | 增量备份,一次保存一个修改数据库的命令 |
保存的间隔较长 | 保存的间隔默认为一秒钟 |
数据还原速度快 | 数据还原速度通常,冗余命令多,还原速度慢 |
执行SAVE命令时会阻塞服务器,但手动或者自动触发的BGSAVE不会阻塞服务器 | 不管是平时仍是进行AOF重写时,都不会阻塞服务器 |
更适合数据备份 | 更适合用来保存数据,一般意义上的数据持久化,在appendfsync always模式下运行 |
# 用redis用来存储真正数据,每一条都不能丢失,都要用always,有的作缓存,有的保存真数据,我能够开多个redis服务,不一样业务使用不一样的持久化,新浪每一个服务器上有4个redis服务,整个业务中有上千个redis服务,分不一样的业务,每一个持久化的级别都是不同的。ui
既有dump.rdb,又有appendonly.aof,恢复时找谁?spa
先找appendonly.aof
# 设置密码 1、requirepass password # 开启远程链接 二、bind 127.0.0.1 ::1 注释掉 三、protected-mode no 把默认的yes改成no# rdb持久化-默认配置 四、dir /var/lib/redis 5、dbfilename 'dump.rdb' # rdb持久化-自动触发 save 900 1 save 300 10 save 60 10000 # aof持久化开启 appendonly yes appendfilename "appendonly.aof" # aof持久化策略 appendfsync alwarys appendfsync everysec #默认 appendfsync no # aof重写触发 auto-aof-rewrite-percentage 100 #超过百分比触发 auto-aof-rewrite-min-size 64mb #超过大小
1.配置文件: /etc/redis/redis.conf
2.备份文件: /var/lib/redis/*.rdb|*.aof
3.日志文件: /var/log/redis/redis-server.log
4.启动文件: /etc/init.d/redis-server
# /etc/下存放配置文件
# /etc/init.d/下存放服务启动文件