redis的数据安全性和性能保障

提高数据安全性,redis提供了两类方法,一个是持久化,让用户将自己的数据存储到硬盘上;另一个是复制特性,将不断更新的数据存储到附加的机器上(主从概念)。

 

一、持久化的方式:

1.快照 : 将某一时刻的所有的数据全部都写入硬盘。

2.AOF(append-only file):它会在执行写命令时,将被执行的命令复制到硬盘中去。

 

创建快照的方法:

1、客户端向redis发送 BGSAVE命令,redis接收到该命令后会单独起一个子进程负责将快照写入硬盘,而父进程就继续执行命令。

2.客户端向redis发送SAVE命令,redis收到该命令后不会单独起一个进程,而是收到命令后不再响应其他的任何命令,只能在快照创建成功之后才会继续响应其他命令,所以不常用。

3.可以给redis配置文件中设置 save 60 10000 ,该命令的语意是“在60秒内,如果有10000次写入请求 这个条件被满足的时候,就会创建一次快照”,通过该命令创建快照的时候,redis也是通过BGSAVE命令执行的。

4.接收到SHUTDOWN命令后,会执行一个SAVE命令,阻塞所有的客户端,不再执行客户端的所有命令。

 

在只使用快照来持久化数据时,需要注意:如果系统发生崩溃,业务方将丢失最近一次快照后的所有数据。所以快照持久化只适用于那些即使丢失一部分数据也不会对业务造成影响的应用。

 

AOF:append-only file,请注意第一个单次append,追加的意思。也就是说,AOF会将被执行的命令写入到AOF文件的末尾,以此来记录数据的变化。也就是说,redis只要重头到位执行一次AOF文件的所有命令,就可以恢复AOF文件所记录的所有数据集。

 

在配置文件中,AOF一般有三个选项:

always:每个命令都要同步写入硬盘,这会降低redis的速度,同时也会造成写入放大,影响硬盘的使用寿命,不推荐。

everysec:以每秒一次的频率对AOF文件进行同步。每秒一次同步的性能和不使用任何持久化时的性能相差无几,且这样做之后redis可以保证,即使出现系统崩溃,用户也只会丢失一秒的数据。

no:redis将不对AOF文件进行显示的同步,完全依赖于操作系统决定何时对AOF进行同步。不推荐。

 

那么,AOF看起来很完美,最多也只会丢失一秒的数据,那他是不是真的很完美呢?

有两个问题需要注意:

1.redis不断的运行,AOF文件会变得越来越大甚至可能会占用整个磁盘的空间。

2.redis在重启后需要通过执行AOF文件中的命令来还原之前的数据,如果AOF文件很大,还原操作将会持续很长时间。

 

针对上述两个问题的解决办法,redis提供了BGREWRITEAOF命令,该命令会移除AOF文件中的冗余命令来重写AOF文件,使AOF文件的体积变得尽可能的小。和BGSAVE相似,该命令也会单独起一个子进程来进行重写。如果AOF文件很大, 这时候创建一个子进程就会有内存问题,甚至可能导致该子进程被挂起数秒。

同样地,redis也提供了自动重写的配置(真是佩服redis的作者,每个问题的解决方案都给你准备好了,只要意识到相应问题然后选择用什么方案就可以,6的飞起啊):

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

当aof文件的体积大于64mb,并且现在aof文件的体积比上一次重写之后的体积大了100%的时候,redis就会执行BGREWRITEAOF命令。

 

redis的作者真的挺牛,这种设计方案的利弊,值得我们在工作中学习。

 

二、复制(类似于关系型数据库的主从复制,主服务器向多个从服务器发送更新,并使用从服务器处理所有读请求)

无论是快照还是AOF这两种持久化方式,都只是将数据在本机硬盘做了备份,除此之外,将持久化得到的文件在其他机器上做备份也很重要,这样一台机器挂了,其余机器能够继续执行,不影响业务。

通过设置额外的redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本后,客户端每次向主服务器进行写入时,从服务器都会实时的得到更新。部署好从服务器之后,客户端就可以实时的向任意一个从服务器发送读请求了,而不必向之前那样只能通过主服务器。

 

SLAVEOF  host port 来让redis服务器复制一个新的主服务器

SLAVEOF no one 来让redis终止服务操作

 

redis复制的过程:

主服务器开启BGSAVE命令,这之后接收到的命令全部缓存到缓冲区,BGSAVE命令执行完毕之后,向从服务器发送快招文件,并在发送期间继续使用缓冲区记录被执行的命令;等到快照文件发送完毕后,将缓冲区的命令也发送到从服务器,缓冲区的命令也发送完毕后,就向从服务器发送相同的写命令。

 

其实主服务器和从服务器之间并没有什么特别不同的地方,所以从服务器也可以继续拥有自己的从服务器,从而形成主从链。



更多内容,可以来访问下我的个人博客http://generalcode.cn

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值