redis常见面试题及答案

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主从同步机制

  1. 从节点执行slave of master port,选择要连接的主节点ip和端口
  2. 从节点存在一个定时任务,定时发现主节点信息,向主节点发送信号,与主节点建立socket连接
  3. 主节点返回数据,完成通信连接
  4. 主节点首先将全量数据发送给从节点,完成数据同步,此后,将增量数据同步给从节点,保证数据一致性。

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个节点加锁成功且花费时间小于锁的有效期)
经验分享 程序员 微信小程序 职场和发展