Redis面试题

1、如何实现缓存Redis和数据库的一致性?

  • 缓存失效策略:在更新数据库之后,立即使缓存中对应的数据失效,下次访问时重新从数据库中获取数据并更新缓存。这样可以确保数据库和缓存数据保持一致。

  • 读写时双写:在更新数据库时,同时更新缓存中对应的数据。这样可以确保数据库和缓存中的数据保持一致。但是这种方式会增加系统的复杂度,需要处理并发写入的情况。

  • 延时双删:在更新数据库时,先删除缓存中对应的数据,然后在事务提交成功后再重新写入缓存。这样可以避免并发写入导致数据不一致的情况。

  • 使用消息队列:数据库更新后发送消息到消息队列,缓存订阅消息队列,接收到消息后更新缓存。这种方式可以实现数据库和缓存的异步更新,减少对数据库的压力。

  • 定时同步:定时任务同步数据库和缓存中的数据,确保数据的一致性。这种方式可能会引入一定的延迟,不适合对数据要求实时性较高的场景。

总结:选择合适的策略取决于具体业务场景和需求,需要权衡数据的实时性、一致性和性能等因素来确定最适合的方案。

2、缓存数据更新是怎么维护的?比如说数据库变更了,缓存还没变,怎么办?

  • 主动更新:在数据库更新后,立即通知缓存进行更新。可以在数据库更新操作完成后,主动调用缓存API,将对应的缓存数据进行更新或失效。这种方式能够保证数据的实时性,但可能会增加数据库和缓存之间的耦合。

  • 定时更新:定期扫描数据库的变更,然后更新缓存中的数据。可以设置定时任务,定期检测数据库中数据的变化,然后更新相应的缓存数据。这种方式能够减少数据库和缓存之间的直接交互,但可能会引入一定的延迟。

  • 事件驱动:通过订阅数据库变更的事件,实时更新缓存数据。可以利用数据库的触发器或消息队列,在数据库数据变更时发送事件通知,让缓存系统监听这些事件并及时更新相应的缓存数据。这种方式能够实现数据的实时同步,减少了系统的耦合度。

  • 双写一致性:每次对数据库进行写操作时,同时更新缓存中的数据。这种方式要求对数据库和缓存的写操作必须在一个事务或操作中完成,确保数据在数据库和缓存中是一致的。然而,双写会增加系统的复杂性,需要额外处理并发写入的情况。

3、Redis的缓存穿透、击穿、雪崩?

  • 缓存穿透:指的是恶意输入导致缓存中没有对应的数据,而请求直接穿过缓存访问数据库,导致数据库压力过大。

通常解决缓存穿透的方法是在查询缓存之前进行有效性校验,比如使用布隆过滤器来过滤无效请求,或者在缓存中存储空对象来标记不存在的数据。

  • 缓存击穿:指的是某个热点数据突然失效,导致大量请求同时涌入访问数据库,因为缓存没命中,需要重新加载数据,造成数据库压力骤增。

解决缓存击穿的方法可以是设置热点数据永不过期,或者使用互斥锁(Mutex Lock)来保护数据库访问,确保只有一个请求更新缓存或数据库。

  • 缓存雪崩:指的是缓存中大量的数据同时失效或过期,导致大量请求直接访问数据库,因为缓存雪崩,数据库负载骤增,甚至引起系统崩溃。

为了避免缓存雪崩,可以采取多种策略,如设置不同的过期时间、使用热点数据预加载、使用分布式缓存和限流等手段。

相关推荐
777VG1 小时前
PostgreSQL +martin将多张表输出成一个 MVT
前端·数据库·postgresql
aax12134531 小时前
VOC 集群治理工程实操|美丽蓝天绿岛项目 RTO 工艺选型、管控方案与申报要
大数据·数据库·人工智能
IvorySQL2 小时前
PG 日报|优化缓冲区批量扫描,降低多套接字并发竞争
数据库·人工智能·postgresql·开源·区块链
这个DBA有点耶2 小时前
交易型数据库是什么?OLTP核心能力与2026选型指南
数据库·数据仓库·sql·database·数据库架构·olap·dba
大熊猫侯佩2 小时前
WWDC26 全新 SwiftData 的 .codable 宏选项:它不是泛型专用胶水
数据库·swift·apple
hold?fish:palm3 小时前
kv存储主从复制的设计与实现
c++·redis·后端
童谣14 小时前
越华环保集团市级统筹申报数字化中台:政策校验与减排仿真一体化架构
数据库·架构
制造数据与AI践行者老蒋4 小时前
离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争
数据库·microsoft·json
中微极客5 小时前
用LangChain 0.3构建生产级RAG与Agent:从API集成到Streamlit部署
数据库·人工智能·langchain
吴声子夜歌5 小时前
MongoDB 4.x——并发优化
数据库·mongodb