Redis 提供了两种数据持久化的方式,分别是快照和追加文件。
快照方式,会按照指定的时间间隔,生成数据的快照,并且保存到磁盘文件中。
为了避免阻塞主进程,Redis 还会 fork 出一个子进程,来负责快照的保存。
这种方式的性能好,无论是备份还是恢复,都比追加文件好很多。
不过,它的缺点也很明显。在数据量大时,fork 子进程需要用到比较大的内存,保存数据也很耗时。
所以,你需要设置一个比较长的时间间隔来应对,比如至少 5 分钟。
这样,如果发生故障,你丢失的就是几分钟的数据。
追加文件,则是用在文件末尾追加记录的方式,对 Redis 写入的数据,依次进行持久化,所以它的持久化也更安全。
此外,它还提供了一个用 appendfsync 选项设置 fsync 的策略,确保写入的数据都落到磁盘中,具体选项包括 always、everysec、no 等。
- always 表示,每个操作都会执行一次 fsync,是最为安全的方式;
- everysec 表示,每秒钟调用一次 fsync ,这样可以保证即使是最坏情况下,也只丢失 1 秒的数据;
- 而 no 表示交给操作系统来处理。
write只要把日志记录写到内核缓冲区,就可以返回了,并不需要等待日志实际写回到磁盘;而fsync需要把日志记录写回到磁盘后才能返回,时间较长。
![](https://img.haomeiwen.com/i12979420/c8c860ccbf8c9f6d.png)
![](https://img.haomeiwen.com/i12979420/27c84c955339b74e.png)
![](https://img.haomeiwen.com/i12979420/880d3019c230d96f.png)
![](https://img.haomeiwen.com/i12979420/c8ba129083e4d0e9.png)
![](https://img.haomeiwen.com/i12979420/b4ec70123309f789.png)
redis 中 appendfsync 如果设置 no,表示交给操作系统来处理,操作系统是怎么处理的?
如果将 appendfsync 设置为 no,Redis 将不会主动调用 fsync() 函数将数据写入磁盘,而是将这个任务交给操作系统来处理。
操作系统会根据自己的策略来决定何时将内存中的数据写入磁盘,通常是在缓存数据达到一定数量或一定时间后才会进行写入。
这种方式可以提高 Redis 的写入性能,但是也会增加数据丢失的风险。
因此,建议在生产环境中将 appendfsync 设置为 always 或者 everysec,以保证数据的安全性。
操作系统会根据自己的策略来决定何时将内存中的数据写入磁盘,通常是在缓存数据达到一定数量或一定时间后才会进行写入。操作系统都有哪些策略?
操作系统的数据写入策略因不同的操作系统而异,以下是一些常见的策略:
-
基于时间:操作系统会定期将内存中的数据写入磁盘,通常是每隔一段时间就会执行一次写入操作。
-
基于数据量:操作系统会在内存中缓存一定量的数据,当缓存的数据达到一定数量时,会将这些数据一次性写入磁盘。
-
基于空闲时间:操作系统会在系统空闲的时候将内存中的数据写入磁盘,这种策略可以避免写入操作对系统性能的影响。
-
基于系统负载:操作系统会根据系统的负载情况来决定何时将内存中的数据写入磁盘,当系统负载较低时,会优先执行写入操作。
-
基于文件系统:不同的文件系统有不同的数据写入策略,例如 ext3 文件系统会在每隔 5 秒钟执行一次写入操作,而 ext4 文件系统则支持更高的写入速度。
需要注意的是,这些策略都是由操作系统内部实现的,具体的实现方式和效果可能因操作系统版本、硬件设备和应用程序等因素而异。
Linux 上有哪些内核参数可以控制吗?
操作系统提供了一些内核参数,可以控制数据写入策略和缓存机制,以下是一些常见的内核参数:
-
vm.dirty_background_ratio:表示内存脏数据的比例阈值,当内存中脏数据的比例超过该阈值时,操作系统会开始将这些数据写入磁盘。
-
vm.dirty_ratio:表示内存脏数据的最大比例阈值,当内存中脏数据的比例超过该阈值时,操作系统会强制将这些数据写入磁盘。
-
vm.dirty_expire_centisecs:表示内存中脏数据的过期时间,当脏数据在内存中存活的时间超过该阈值时,操作系统会强制将这些数据写入磁盘。
-
vm.dirty_writeback_centisecs:表示内存中脏数据的写入间隔时间,当脏数据在内存中存活的时间超过该阈值时,操作系统会将这些数据写入磁盘。
-
vm.swappiness:表示内存交换机制的 aggressiveness,即操作系统在内存不足时,将内存中的数据写入交换分区的程度。该参数的值越高,操作系统将更倾向于将数据写入交换分区。
这些内核参数可以通过修改操作系统的配置文件来进行调整,不同的操作系统和内核版本可能支持不同的参数和取值范围。需要根据具体的应用场景和硬件环境来调整这些参数,以达到最佳的性能和稳定性。
参考
Redis响应严重延迟,如何解决?
https://ibyte.blog.csdn.net/article/details/108846620
Redis在持久化时产生的延迟
https://hiddenpps.blog.csdn.net/article/details/94518679
游戏陪玩源码中,Redis 发生高延迟的原因是什么?
https://blog.csdn.net/m0_58374018/article/details/122218778·
网友评论