核心内容摘要
云容笔谈一文详解:东方红颜影像生成系统架构、数据与美学逻辑
文章目录说说Redis的持久化机制RDB持久化AOF持久化混合模式不同持久化方案适合什么场景Redis内存淘汰策略了解吗什么是Redis事务说说Redis的持久化机制Redis是内存数据库如果不提供持久化机制当redis进程退出或者宕机时数据会丢失。
redis为了保证重启/宕机等情况保证数据不全部丢失提供了持久化机制。
Redis提供三种持久化机制快照(RDB)可追加文件(AOF)RDB和AOF混合持久化RDB持久化RDB持久化本质上是创建当前Redis数据的快照RDB文件副本。
有了RDB文件之后在发生程序崩溃/重启可利用RDB恢复数据库内容Redis默认的持久化机制。
RDB持久化触发方式手动触发手动执行save命令阻塞当前Redis服务器直到RDB过程完成为止对于内存 比较大的实例会造成长时间阻塞线上环境不建议使用。
手动执行bgsave命令Redis进程执行fork操作创建子进程RDB持久化过程由子 进程负责完成后自动结束。
阻塞只发生在fork阶段一般时间很短。
自动触发在redis.conf配置文件默认会有save m n即在m秒内有n次修改时自动触发bgsave生成rdb文件。
默认情况下执行shutdown命令如果没有开启aof持久化也会自动触发save命令。
RDB持久化的优缺点优点文件体积小读取RDB文件恢复数据快。
缺点RDB方式实时性不够无法做到秒级的持久化fork 子进程有性能和内存压力。
RDB也是进行主从同步数据的载体。
AOF持久化AOF的出现是为了解决 RDB 数据丢失窗口过大的问题提供更好的更好实时性保存的持久化机制。
通过更改redis.conf配置文件中appendonly yes来启用AOF持久化。
AOF持久化本质上看作一个操作日志文件通过记录更改数据库的命令然后落盘到文件中以达到发生程序崩溃/重启时重放命令恢复数据。
AOF的持久化功能实现可分为以下步骤;命令追加append所有写命令会追加到AOF缓冲区中。
文件写入(write)将 AOF 缓冲区的数据写入到 AOF 文件中此步是将AOF缓存区数据写入到操作系统内核缓冲区。
此时并没有进行数据落盘。
文件同步(fsync)根据appendfync配置redis会按照指定频率调用fync函数强制数据落盘保证数写入磁盘文件。
这步执行完成后才代表数据真正被保存redis中提供appendfync策略有以下几种always: 同步写回,执行写命令之后立即执行命令追加和文件写入步骤同时主线程调用fsync命令阻塞同步直到数据落盘。
最安全的一种策略理论上不会丢失数据同时性能最差。
Everysec: 每秒写回每个写命令执行完先把日志写到AOF文件的内存缓冲区并执行write操作后台线程每隔一秒执行fync写入磁盘性能 实时性综合的方案No:操作系统控制的写回reids不会主动执行fsync命令。
实时性最差 性能最好的方案。
上面提高AOF本质是以追加方式记录Redis已经执行的写命令随着时间越来越长AOF文件会变得越来越大。
如果不加以控制AOF文件越大导致数据恢复也越慢基于此Redis提供AOF重写机制限制AOF文件不断增长。
AOF重写机制原理是通过读取数据库中的键值对来实现的程序无须对现有 AOF 文件进行任何读入、分析或者写入操作。
步骤大概如下AOF重写会执行大量写操作reids将AOF重写使用子进程执行。
AOF 文件重写期间Redis 还会维护一个AOF 重写缓冲区该缓冲区会在子进程创建新 AOF 文件期间记录服务器执行的所有写命令。
当子进程完成创建新 AOF 文件的工作之后服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。
服务器用新的 AOF 文件替换旧的 AOF 文件代表重写的完成。
混合模式Redis
0 中提出了一个混合使用 AOF 日志和内存快照的方法。
简单来说内存快照以一定的频率执行在两次快照之间使用 AOF 日志记录这期间的所有命令操作。
混合模式的优点快照不用很频繁地执行这就避免了频繁 fork 对主线程的影响AOF 日志也只用记录两次快照间的操作也就是说不需要记录所有操作了因此就不会出现文件过大的情况了也可以避免重写开销。
既能享受到 RDB 文件快速恢复的好处又能享受到 AOF 只记录操作命令的简单优势。
不同持久化方案适合什么场景只使用RDB的场景缓存型业务数据可从关系型数据库或其它途径恢复容忍数据少量数据丢失。
只使用AOF场景可容忍性能下降数据非常重要不希望丢失数据混合模式场景生产环境核心业务既要保证数据不能丢失又要保证redis重启恢复数据快Redis内存淘汰策略了解吗Redis 的内存淘汰策略只有在运行内存达到了配置的最大内存阈值时才会触发这个阈值是通过redis.conf的maxmemory参数来定义的。
Redis提供以下几种内存淘汰策略:no-eviction:默认内存淘汰策略禁止驱逐数据当内存不足以容纳新写入数据时新写入操作会报错。
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
volatile-random: 从已设置过期时间的数据集中任意选择数据淘汰。
allkeys-random: 从所有数据集中任意选择数据淘汰。
volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。
allkeys-lfu: 从所有数据集中挑选最不经常使用的数据淘汰。
什么是Redis事务Redis 事务是通过 MULTI 和 EXEC 将多个命令打包顺序执行的一种机制能够保证事务执行期间不会被其他客户端的命令打断。
Redis 事务不支持回滚也不具备关系型数据库事务的完整 ACID 特性。
实际开发过程中不太推荐使用Redis事务。