面试知识点重现
2025.10.14Redis
缓存穿透:查询不存在数据,mysql查询不到也不会直接写到缓存造成数据库压力过大-缓存null数据,布隆过滤器
缓存击穿:某个热点key缓存过期时恰好有大量请求,数据库压垮。-设置逻辑过期(线程1拿到锁开启新线程写入缓存充值过期时间,高可用性能优),互斥锁(强一致但性能差)
缓存雪崩:大量keys缓存过期,导致请求直接到数据库压垮-随机ttl
双写一致性:数据库删除-缓存删除-数据库删除、1.MQ中间件更新后删除缓存2.canal中间件伪装mysql重节点,通过读取binlog更新缓存3.强一致性redission读写锁a.读锁readLock,独占锁writeLock
持久化:1.RDB 对整个内存快照 2.AOF记录每一次执行命令
数据过期策略:1.惰性删除(找到再删)2.定期删除(SLOW/FAST)
数据淘汰策略:默认noeviction不删除不足直接报错,LRU(保留热点)、LFU-开发中使用较多allkeys-LRU
分布式锁(setnx+lua脚本)
SET LOCK value NX EX 10
WatchDog监控锁自动续期、锁可重入(hash结构)
主从一致RedLock,最好用zookeeper
主从复制:一主(写)多从(读),第一次复制RDB、之后AOF
从节点请求同步数据replicationId and offset、主执行bgsave生产rdb给从,之后记录命令到缓冲区同步,根据offset值进行同步
哨兵模式:实现主从集群监控,自动回复、通知
主从1+1+哨兵
脑裂:主和从和sentinel处于不同网络分区,sentinel没有心跳感知主节点于是从节点选举新主,旧主降级为从导致数据丢失-设置最少从节点数量以及缩短主从同步时间
分片集群(master互相ping,任意访问会被路由到正确节点):分片集群引入哈希槽16384.取余决定数据存放
Why so fast?I/O多路复用,epoll返回就绪slot无需占用cpu,对事件转换采用多线程但执行仍然是单