redis持久化

  我们知道redis是内存数据库,存的数据是放在内存中,所以我们需要把数据也存到硬盘里,防止redis挂了之后,我们还能找到其中的数据;

  那么问题来了, 怎么持久化啊?

  我们可以把redis想象成一个房间,每一个存到其中的数据看成一个个的人,你觉得怎么统计这个房间里的人比较好呢?

  第一种方式:我们直接进去用手机拍照,将所有人都拍下来就好了,然后我们随时可以看到房间里都有谁在,但是因为房门是开的,会不断的有人进来也,有人消失了,我们总不可能一直拿着手机在疯狂的拍照吧!别人肯定以为你是变态,就报警来抓你了....

  这种方式需要每隔一段时间就去拍照一下,所以也叫做快照(Snapshot),在redis中叫做RDB;但是可想而知,因为每隔一段时间才去拍照,所以,在这个时间间隔之内我们是没办法知道新进去了哪些人的;

  

  第二种方式:直接进房间里拍照好蠢,尼玛一不小心就被抓了,但是可以直接站在门口啊,每进去一个人我们就把这个人名字写在一个小本本中

  这种方式无论什么时刻都可以知道房间里都有什么人,但是如果进去的人比较多,可能你的小本本就很大,这么多名字,此处空白太小,写不下了( ̄▽ ̄)ノ;

  在redis中叫做AOF,每一次使用redis的时候,都会将写命令记载在日志文件中,即使redis挂了,根据日志文件执行一遍所有命令就行了

 

1. RDB

  redis默认的持久化方式,下图所示,就是这个rdb文件

 

  想要触发redis服务端的rdb持久化,也是要条件的;

  1.1 客户端向服务端发起持久化命令

  当客户端执行bgsave或者save的时候,redis服务端接受到命令之后,就会将redis中的数据存一份到硬盘中形成rdb文件,这两个命令的区别:

 

  bgsave: 非阻塞,redis服务端接收到basave指令的时候,还能继续接受其他redis客户端的指令;因为redis服务端接收到这个指令就会去fork一个子进程去做持久化,redis服务端还是照常使用

  save: 阻塞,redis服务端接受到save指令,redis就不能用了,只能等到持久化完毕才能继续使用;因为redis服务端只在做持久化了

 

 

 

  1.2 服务端自行进行持久化

  在项目中我们肯定不可能自己去手动发送bgsave命令到redis服务端吧,最好是当redis中的键值对满足一定的条件后就自动的触发bgsave,fork一个子进程去持久化数据;

  所以我们在redis安装目录下,打开配置文件redis.windows.conf,看到下面这里,只需要满足任意一个,就能触发RDB,我们自己测试的话可以弄个小的,比如save 5 2  在5秒内有两个key发生变化就会触发RDB持久化,然后重启redis服务端;

  注意,这里触发的是bgsave

 

 

 

  1.3 客户端发送shutdown指令

  客户端发送shutdown指令,让redis服务端关闭,此时就会触发一次save

  

2. AOF

  2.1 aof原理

  RDB持久化已经不错了,但是在两次持久化间隔期间如果redis服务端挂了,那么间隔这段时间的数据就丢失了,所以才有了AOF持久化

  下图所示,只会将写命令都存到一个文件中去;

  

  2.2 aof开启

  默认是不开启aof持久化的,我们需要到配置文件中修改一下,重启redis,下图所示:

 

  然后我们随便使用set a 1 然后就会看到生成aof文件了

 

  有兴趣的可以看看这个aof文件中是什么,很简单,redis遵循的resp协议,只有遵守这个协议,redis服务端才会正确解析命令,想了解的的可以看看这里

  我们就看几个简单的:

 

  2.3 aof持久化频率

  之前说过会将每个写命令都同步到aof文件中,难道一有写操作就同步一次吗?

  假如一百个客户端在一秒钟都使用了一次写操作,难道一秒钟就要同步一百次么?这也太坑爹了

  配置文件中有三种方式,下图所示,就用默认的这种就行了,一秒钟同步一次aof文件,这样有个好处,即使redis挂了,顶多丢失一秒钟的数据;

 

  2.4 aof文件的重写

  我们可以知道随着redis用的时间越来越长,aof文件肯定会越来越大,当一个aof文件有几百G的时候,去加载它估计也要好半天;

  所以redis可以设置将aof文件给压缩一下,举个例子:调用5次incr a,那么可以直接压缩为set a 7

 

  通过aof这种重写,可以在一定程度上减少aof文件的体积,可以有两种方式开启aof文件重写:

  第一种: redis客户端使用 bgrewriteaof命令

  第二种: 服务端配置文件配置下面两个参数,注意这个百分数是100%,假如当64兆的aof文件重写为了50兆,那么第二次触发重写就必须到100兆;然后假设100兆又重写为80兆,那么第三次触发重写必须等到aof文件到160兆...

 

  重写的原理: 不是去修改原有的aof文件,而是将此时redis中的所有存在的数据用命令给重写一遍到一个新的aof文件,然后将原来的那个aof文件替换就行了;

 

posted @ 2021-01-29 01:05  java小新人  阅读(197)  评论(0编辑  收藏  举报