1. redis单线程快的原因?
- 内存操作
- 非阻塞IO多路复用机制
- 避免了cpu频繁上下文切换
2. redis持久化
-
rdb:某个时刻的内存快照,以二进制的方式写入磁盘。触发:save命令,使得redis处于阻塞状态,直到rdb持久化完成。bgsave命令,fork出子进程,copy on write。自动触发 save m n。
- 优点:
- 只包含一个dump.rdb,方便持久化
- 容灾好,方便备份
- 性能最大化,fork子进程完成写操作,主进程处理命令
- 比aop启动效率高
- 缺点:
- 安全性低
- fork子进程占用cpu
- 优点:
- AOF:以日志的形式记录服务器所处理的每一个写,删除操作,查询操作不会记录,以文本方式记录,首先放置到缓冲区,后续根据不同同步策略,调用操作系统命令进程刷盘。
- 策略:每秒同步,每个命令同步,不同步(交给os控制,redis不做改动)
- 优点:
- 数据安全
- append方式写文件
- rewrite模式定期重写,以达到压缩的目的
- 缺点
- AOF文件大,恢复慢
- 启动慢
- 运行效率低
3. redis主从同步机制
- 从节点执行slave of master port,选择要连接的主节点ip和端口
- 从节点存在一个定时任务,定时发现主节点信息,向主节点发送信号,与主节点建立socket连接
- 主节点返回数据,完成通信连接
- 主节点首先将全量数据发送给从节点,完成数据同步,此后,将增量数据同步给从节点,保证数据一致性。
uid, 缓冲队列,offset
4. 说一下你知道的redis高可用方案
针对的问题:单点故障,吞吐量,存储
主从模式:没法自动切换主节点
哨兵模式:
- 功能:集群节点监控,消息通知,故障转移(切换主节点),配置中心(给从节点重写分配·主节点ip,port)
- 保障了服务高可用,不一定高可靠
集群模式:
- redis sharding: 由redis客户端决定key存放在哪台实例上面
- redis cluster: 服务端sharding技术,采用slot技术(CRC16(key) mod 16384确定槽区间,不同区间对应不同节点),然后将请求发送到节点
5. redis事务实现
命令:watch, unwatch, multi, exec, discard
- 事务开始:执行multi命令,开启一个事务, 客户端中flags的状态变更为redis_multi
- 命令入队:multi, exec, watch, discard命令,服务端立刻执行,除了multi, exec, watch, discard命令外,服务端要求客户端将其它所有命令放置到事务队列中,随后检查此命令格式是否正确,不正确则结束事务,关闭redis_multi状态,向客户端返回错误信息,正确的话,向客户端返回queue。
- 事务执行:服务端收到exec命令,检查客户端是否处于事务状态redis_multi,或是redis_dirty_cas或是redis_dirty_exec,是的话,取消事务的执行;否则遍历事务队列,执行所有命令,再将结果返回给客户端。
6. redis分布式锁实现
setnx + setex ---> set(key, value, nx, px)
常见问题及解决方式:
- 任务超时,持有锁的线程还在同步代码区,锁就过期了,导致并发,使用redisson
- 不可重入,使用redisson解决,实现类似于AQS
- 数据异步复制造成锁丢失,使用redLock(顺序向5个节点请求枷锁,请求超时则跳过该节点,3个节点加锁成功且花费时间小于锁的有效期)