线程模型一、Redis到底是单线程还是多线程Redis 不是完全意义上的单线程。它的核心命令执行是单线程的客户端发来的命令最终由主线程按顺序执行。但是 Redis 可以同时支撑大量客户端连接这是因为它使用了 I/O 多路复用机制。I/O 多路复用可以让一个线程监听多个 socket 连接哪个连接有请求就处理哪个避免了一个连接创建一个线程带来的资源浪费。Redis 6.0 以后引入了多线程 I/O但主要用于网络读写不是多线程并发执行命令。所以可以总结为多连接监听单线程执行命令多线程辅助网络 I/O 和后台任务。Redis 不是完全意义上的单线程。它的核心命令执行是单线程的客户端发来的命令最终由主线程按顺序执行。但是 Redis 可以同时支撑大量客户端连接这是因为它使用了 I/O 多路复用机制。I/O 多路复用可以让一个线程监听多个 socket 连接哪个连接有请求就处理哪个避免了一个连接创建一个线程带来的资源浪费。Redis 6.0 以后引入了多线程 I/O但主要用于网络读写不是多线程并发执行命令。所以可以总结为多连接监听单线程执行命令多线程辅助网络 I/O 和后台任务。数据持久化Redis提供了很多跟数据持久化相关的配置⼤体上可以组成以下⼏种策略· ⽆持久化完全关闭数据持久化不保证数据安全。相当于将Redis完全当做缓存来⽤·RDB按照⼀定的时间间隔缓存Redis所有数据快照。·AOF记录Redis收到的每⼀次写操作。这样可以通过操作重演的⽅式恢复 Redis的数据·RDBAOF同时保存Redis的数据和操作。RDB优点1、RDB⽂件⾮常紧凑⾮常适合定期备份数据。2、RDB快照⾮常适合灾难恢复。3、RDB备份时性能⾮常快对主线程的性能⼏乎没有影响。RDB备份时主线程只需要启动⼀个负责数据4、与AOF相⽐RDB在进⾏⼤数据量重启时会快很多。缺点1、RDB不能对数据进⾏实时备份所以总会有数据丢失的可能。2、RDB需要fork化⼦线程的数据写⼊情况在fork的过程中需要将内存中的数据克隆⼀份。如果数据量太⼤或者CPU性能不是很好RDB⽅式就容易造成Redis短暂的服务停⽤。相⽐之下AOF也需要进⾏持久化但频率较低。并且你可以调整⽇志重写的频率。redis.conf常见配置:save 3600 1 300 100 60 10000意思是满足任意一个条件就生成 RDB3600 秒内至少 1 个 key 发生变化300 秒内至少 100 个 key 发生变化60 秒内至少 10000 个 key 发生变化AOF优点1、AOF持久化更安全。例如Redis默认每秒进⾏⼀次AOF写⼊这样即使服务崩溃最多损失⼀秒的操作。2、AOF的记录⽅式是在之前基础上每次追加新的操作。因此AOF不会出现记录不完整的情况。即使因为⼀些特殊原因造成⼀个操作没有记录完整也可以使⽤redis-check-aof⼯具轻松恢复。3、当AOF⽂件太⼤时Redis会⾃动切换新的⽇志⽂件。这样就可以防⽌单个⽂件太⼤的问题。4、AOF记录操作的⽅式⾮常简单易懂你可以很轻松的⾃⾏调整⽇志。⽐如如果你错误的执⾏了⼀次 FLUSHALL 操作将数据误删除了。使⽤AOF你可以简单的将⽇志中最后⼀条FLUSHALL指令删掉然后重启数据库就可以恢复所有数据。缺点1、针对同样的数据集AOF⽂件通常⽐RDB⽂件更⼤。2、在写操作频繁的情况下AOF备份的性能通常⽐RDB更慢。redis.conf常见配置:开启 AOF appendonly yesAOF 刷盘策略appendfsync everysec#appendfsync always#appendfsync no总结Redis 持久化主要有 RDB 和 AOF 两种。RDB 是快照持久化会在满足一定时间和修改次数条件时把当前内存中的全量数据保存成dump.rdb文件。它文件小、恢复快适合备份和迁移但缺点是可能丢失最近一次快照之后的数据。AOF 是追加日志持久化会把 Redis 执行过的写命令追加到 AOF 文件中。Redis 重启时通过重放这些写命令恢复数据。AOF 数据安全性更高常用everysec策略最多可能丢失 1 秒数据但文件通常比 RDB 大恢复速度也可能更慢所以需要 AOF 重写来压缩文件。生产中如果 Redis 只是缓存可以只用 RDB 或者不开持久化如果数据比较重要建议开启 AOF更稳妥的方式是 RDB 和 AOF 同时开启RDB 做全量备份AOF 保证尽量少丢数据。