Redis面试题

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相关推荐
蜡笔小炘15 分钟前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长19 分钟前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚1 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设1 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919102 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓2 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525292 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊3 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python