Redis FAQ
- Redis是单线程还是多线程?
- 那为什么 Redis 在 4.0 之前会选择使用单线程?而且使用单线程还那么快?
- Redis 是如何确保数据不丢失(持久化)的呢?
- 讲讲Redis持久化的实现原理?
- Redis 为什么要先执行命令,再把数据写入日志呢?
- 那后写日志又有什么风险呢?
- RDB 做快照时会阻塞线程吗?
- RDB 做快照的时候数据能修改吗?
- Redis 是怎么解决在 bgsave 做快照的时候允许数据修改呢?
- Redis 如何实现高可用?
- Redis为什么需要使用集群模式呢?
- Redis Cluster 在存储的时候如何确定选择哪个节点呢?
Redis是单线程还是多线程?
在数据操作上是单线程
而在bgsave、网络IO等操作上是多线程的
那为什么 Redis 在 4.0 之前会选择使用单线程?而且使用单线程还那么快?
- 无锁,没有共享内存的冲突
- 减少了线程上下文切换的时间
- 纯内存操作,快
- 使用了epoll
Redis 是如何确保数据不丢失的呢?
有两种备份方式
- AOF(Append Only File)
- 每执行一次命令添加一行log,可以压缩
- pros:更新频率高;时效性强
- cons:文件大;恢复速度慢
- RDS(Redis Database)
- 二进制文件,即某个时刻Redis的内存拷贝。定期备份
- pros:更新频率低;时效性差
- cons:文件小;恢复速度快
Redis AOF为什么要先执行命令,再把数据写入日志呢?
在MySQL中采用的事写前日志,是因为MySQL在写前有做语法检查,所以可以先记录。
而在Redis中,由于没有语法检查,所以只记录执行成功的命令,可以避免记录错误命令的情况。
那后写日志又有什么风险呢?
- 如果Redis在后写命令时宕机,那么已经执行的命令会丢失
- 可能阻塞其他操作,AOF日志是在主线程中执行的,所以Redis把日志文件写入磁盘时,会阻塞后续的操作无法执行
RDB 做快照时会阻塞线程吗?
- save命令会阻塞主线程,会导致阻塞。
- 默认使用bgsave命令,则会启动另一个子进程来,用于写入RDB文件,避免主线程阻塞。