Redis面试问题大全,看这些就够了(凭借这个oc网易,快手)

张开发
2026/4/8 1:07:06 15 分钟阅读

分享文章

Redis面试问题大全,看这些就够了(凭借这个oc网易,快手)
Redis问题Redis基础Redis有什么快内存数据结构线程模型通信协议为什么使用Redis作为缓存内存高性能功能全面高并发为什么不使用本地缓存而是使用了Redis数据一致性单机限制数据结构持久化Redis应用除了作为缓存还能做什么限流延迟队列消息队列分布式锁排行榜签到共同好友网站UVPV统计GEO地理位置信息布隆过滤器。Redis数据类型有哪些数据结构5种StringHashListSetSortedSet3种bitmapgeohyperloglogString和Hash那个存储对象数据结构好一般直接使用String比较好如果需要修改字段的值或者节省内存可以选择Hash讲讲SDS相比C数组有什么提升O(1)获取长度二进制安全内存分配次数少不会溢出Redis为啥使用跳表而不是平衡二叉树红黑树B树平衡二叉树红黑树 按区间查找效率低频繁调整树结构消耗大B树 目的是通过增加一页的索引数减低IO但是内存数据库无用武之地而且树结构复杂内存消耗多跳表找到插入节点直接插入并随机生成一定高度的索引就行不需要B树页分裂和合并这么复杂。zset底层编码方式ziplist元素小于64直接个数少于128skiplistdict跳表结构set应用场景抽奖随机点名UV统计共同好友布隆过滤器原理bitmap数组n个哈希函数Redis持久化持久化方式AOFRDBAOFRDB混合RDB是什么按某个时间点创建快照可以用来备份也可以用来作为主从同步可以配置xxx秒后执行xxx条命令自动触发bgsaveAOF是什么是备份文件append追加命令到aof缓存区write把aof缓存区写到系统内核缓冲区fsync固化内核缓存区到磁盘rewriteaof文件太大重写压缩load加载aof文件数据恢复AOF持久化三种方式always每次执行命令都执行writefsyncerverysec每秒执行命令writefsyncnowrite后就返回AOF重写了解吗AOF文件太大需要压缩开启异步线程重写并用一个缓存区记录重写期间的命令最后追加到重写文件末尾如果选择AOF和RDBRDB文件小AOF文件大RDB可以用来作为主从备份快AOF备份后恢复慢需要重新执行命令AOF持久化丢失数据少RDB更像是快照某时刻生成快照占用很多的系统资源Redis线程模型Redis单线程模型讲解一下读写命令单线程也4.0后引入多线程执行一些异步处理的任务6.0版本在处理网络请求引入多线程。使用IO多路复用模型监听多个socket把感兴趣的事件和类型注册到IO多路复用程序监听到对应的事件和类型交给文件事件分派器把事件交给事件处理器来处理。Redis不需要创建多余的线程监听客户端大量的连接节省资源。Redis6.0之前为什么不用多线程4.0之后支持异步线程来处理一些命令比如bgsaveunlink等等执行命令一直是单线程的原因是单线程容易维护Redis性能在内存和网络不在cpu多线程会导致死锁和并发安全存在上下文切换有损耗6.0网络IO的处理加入多线程是因为网络IO属于性能瓶颈6.0默认的线程主线程执行命令后台线程bio-close-file关闭文件AOF/RDB生成的临时文件bio-aof-fsyncfsync刷盘bio-lazy-free后台释放已删除的大对象的内存空间网络多线程IORedis内存管理Redis给缓存设置过期时间有什么用缓解内存的消耗业务1分钟过期的验证码Redis如果判断数据是否过期有一个Dict存储这些设置过期时间的键值key是对应的keyvalue是过期时间。查询一个key先去这个Dict看看是否存在存在再判断是否过期过期就删除key返回null大量key过期怎么办大量key过期-每次查询都要删除key占用cpu和系统资源导致命令执行比较慢。而且这些过期的key没有删除占用内存。解决给key的过期时间设置随机数key的删除策略惰性删除查找到key过期再删除定期删除定期可以设置抽取Dict的20个key检查如果情况比较严重删除了的比例比较高继续抽取直到比例比较低获取定期任务执行的时间达到25ms。内存淘汰策略allkey-lfu:最不经常使用allkey-lru最近最少使用allkey-randomno-eviction默认volatile-lfuvolatile-lruvolatile-randomvolatile-ttlRedis事务什么是Redis事务很没用有是有不支持持久性和原子性就是把命令请求打包发过去按顺序执行这些命令不会中途被打断使用mulitexec命令持久性看AOF原子性执行成功就原子性执行不成功前面的也不回滚。和lua脚本比较像Redis性能优化如何减少网络传输发送命令命令排队处理命令结果返回使用Redis的原生msetmgetmhset等等使用pipeline非原子性的lua脚本在集群模式下无法保证原子性大量key集中过期问题客户端每次处理命令有一部系统资源用在删除key上效率低。key过期后没有删除会占用内存解决方法给key设置随机的过期时间开启lazy-freeBigkey有什么问题怎么解决什么是bigkeyString大小超过1M集合结构元素数量操作5000个等等这个标准会根据情况而定。bigkey的删除和处理都需要比较长的时间会阻塞主线程会占用比较多的网络带宽可以通过一些第三方的开源工具找到bigkey解决方法使用unlink来删除bigkey对hash结构进行进一步拆分选择更合适的数据结构开启lazy-free热点key是什么怎么处理热点key是那种访问频率比较高的key比如Redis被访问了5000次但是某个key在这5000次就被访问了1000次就是热点key。热点key访问过多会存在一些问题如果热点key过大比如1M大小访问次数多了对网络带宽和系统资源的压力会比较大。热点key过期了可能会出现缓存击穿的问题。热点key可能会成为系统的瓶颈。怎么处理不给热点key设置过期时间或者过期时间设置长一些搭建集群读写分离。设置二级缓存为什么有慢查询命令大部分命令执行时间复制度为o1但是一部分命令执行比较慢需要on复杂度比如keys可以通过开启慢查询日志slow-log来进行查询Redis生产问题缓存穿透是什么缓存穿透指的是缓存几乎不存在请求可以直接穿过缓存。为什么出现这种情况客户端查询缓存和数据库都不存在的数据时候如果数据库没有对应的措施因为数据库没有对应的数据所以缓存也不会存储对应的数据只要查询不存在的数据就可以直接打到数据库。解决方法设置空值治标如果黑客仿照不同的数据反而会使redis存储过多的null值导致内存不足使用布隆过滤器对某些攻击的行为进行记录比如ip地址拒绝这类攻击的访问缓存击穿是什么缓存击穿是指热点key过期大量请求直接打到数据库。解决方法不给热点key设置过期时间使用互斥锁只允许一个请求去更新提前预热缓存雪崩是什么大量key过期或者Redis宕机大量请求打到数据库解决方法使用哨兵或者集群提高Redis的可用性给不同的key设置随机过期时间使用二级缓存缓存预热怎么做使用xxl-job这种定时任务每隔一段时间就从数据库取出热点数据放到缓存消息队列把热点数据的数据库id发送过去缓存服务来处理消息如何保证缓存和数据库一致性更新数据更新缓存更新缓存更新数据库删除缓存更新数据库更新数据库删除缓存删除缓存更新数据库删除缓存更新数据库binlog监听数据库变化发送消息给MQ更新缓存Redis集群Redis主从复制下从节点会删除过期数据吗一般不会删除过期数据获取key是会判断是否过期过期就返回null而且从库可能因为主从延迟客户端可能会读到过期的数据主从如何同步数据全量同步从库执行slave of 主库地址主库生成RDB-》发送RDB从库加载RDB主库缓存新命令主库发送新命令从库加载命令增量同步从库执行slaveof发送自己的runid和offset主库发送增量的命令增量数据在一个环形的缓冲区中repl_backlog_buffer主库和从库都会记录offset在这里面。由于是环形的所以如果offset被覆盖了那只能全量同步了。主库会记录offset自己写的位置从库会记录自己读的位置。Redis哨兵如何实现故障自动化转移引入sentinal监控master出现故障主观下线如果多个sentinal判断是是主观下线master就是客观下线通过决策选出一个leader来选择一个slave节点来作为主并通知其他master认同这个slave。为什么需要Redis集群Redis主从无法自动转移故障Redis主从和哨兵不能提高写并发和数据量大的问题。引入Redis集群来解决这些问题是什么Redis集群就是多个master之间是平等的同时对外提供读写操作缓存的数据库通过CRC16%16384得到一个数字每个mastere均匀地对应不同的插槽客户端的请求通过路由规则路由到对应的master上。客户端连接 Redis Cluster 中任意一个 master 节点即可访问 Redis Cluster 的数据当客户端发送命令请求的时候需要先根据key 通过上面的计算公示找到的对应的哈希槽然后再查询哈希槽和节点的映射关系即可找到目标节点。Redis的master之间根据gossip协议互相通信每个master都保留了Redis集群的状态信息。Redis扩缩容期间还是可以提供服务的。Redis基础Reids的应用Redis数据类型String的底层原理Redis作者的评价是Redis持久化Redis线程模型Redis的内存管理Redis事务Redis性能优化如何找到bigkeyRedis生产问题Redis的集群sentinel节点上无法运行get set这些普通命令

更多文章