【Redis实战篇】缓存-穿透/雪崩/击穿问题的解决方案
温馨提示建议在PC端浏览~以商户查询缓存为例什么是缓存缓存就是数据交换的缓冲区称作Cache是存贮数据的临时地方一般读写性能较高。缓存的作用降低后端负载提高读写效率降低响应时间缓存的成本数据一致性成本代码维护成本运维成本添加Redis缓存缓存作用模型及添加Redis缓存后的流程图缓存更新策略业务场景低一致性需求使用内存淘汰机制。例如店铺类型的查询缓存。店铺类型很少发生改动高一致性需求主动更新并以超时剔除作为兜底方案。例如店铺详情查询的缓存。主动更新策略1、Cache Aside Pattern由缓存的调用者在更新数据库的同时更新缓存。实际开发中一般使用这个策略可控性高2、Read/Write Through Pattern缓存与数据库整合为一个服务由服务来维护一致性。调用者调用该服务无需关心缓存一致性问题。3、Write Behind Caching Pattern调用者只操作缓存由其它线程异步的将缓存数据持久化到数据库保证最终一致。操作缓存和数据库时需要考虑的三个问题问题一删除缓存还是更新缓存更新缓存每次更新数据库都更新缓存无效写操作较多。删除缓存更新数据库时让缓存失效查询时再更新缓存。推荐问题二如何保证缓存与数据库的操作的同时成功或失败单体系统将缓存与数据库操作放在一个事务。分布式系统利用TCC等分布式事务方案。问题三先操作缓存还是先操作数据库1、先删除缓存再操作数据库可能存在的问题如图2、先操作数据库再删除缓存可能存在的问题如图小结由于操作缓存比操作数据库的速度快很多所以第二种情况可能出现的问题发生的概率很小所以实际开发优先选择“先操作数据库再删除缓存”的策略并结合过期时间来维护数据库与缓存数据的一致性。缓存更新策略的最佳实践方案低一致性需求使用Redis自带的内存淘汰机制高一致性需求主动更新并以超时剔除作为兜底方案读操作缓存命中则直接返回缓存未命中则查询数据库并写入缓存设定超时时间写操作先写数据库然后再删除缓存要确保数据库与缓存操作的原子性缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在这样缓存永远不会生效这些请求都会打到数据库如果有人恶意持续请求不存在的数据会给数据库造成很大压力。常见的解决方案有两种当然不止这两种这两种都是属于被动式的解决方案方案一缓存空对象实战中暂时选择了这个方案优点实现简单维护方便缺点额外的内存消耗可能造成短期的不一致如果有人恶意请求不存在的数据假设id为2查询数据库后未发现该条数据所以会在Redis缓存中存储对应key的值为null并设置过期时间但如果这之后刚好插入了一条id为2的新数据用户访问时之前缓存的记录若还没有过期用户就查询不到新插入的数据从而造成短期的数据不一致的问题过程演示方案二布隆过滤原理之后会讲优点内存占用较少没有多余key缺点实现复杂存在误判可能过程演示实战解决缓存穿透问题采用方案一缓存空对象流程图小结缓存穿透产生的原因是什么用户请求的数据在缓存中和数据库中都不存在不断发起这样的请求给数据库带来巨大压力。缓存穿透的解决方案有哪些被动式的解决方案被攻击了如何应对缓存null值布隆过滤主动式的解决方案主动采取一些措施防止被恶意攻击增强id的复杂度避免被猜测id规律做好数据的基础格式校验加强用户权限校验做好热点参数的限流在微服务课程有讲如何限流缓存雪崩缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机导致大量请求到达数据库带来巨大压力。解决方案给不同的Key的TTL添加随机值利用Redis集群提高服务的可用性高级篇讲解给缓存业务添加降级限流策略微服务课程讲解给业务添加多级缓存高级篇讲解缓存击穿缓存击穿问题也叫热点Key问题就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了无数的请求访问会在瞬间给数据库带来巨大的冲击。常见的解决方案有两种互斥锁逻辑过期互斥锁与逻辑过期策略的时序图对比互斥锁与逻辑过期策略的优缺点对比选择策略互斥锁选择牺牲可用性从而保证一致性而逻辑过期选择牺牲一致性从而保证可用性CAP定理。实际开发中到底采取哪种策略取决于当前业务更偏向于高一致性还是偏向于高可用性。CAP定理CAP定理CAP theorem又被称作布鲁尔定理Brewer’s theorem是加州大学伯克利分校的计算机科学家埃里克·布鲁尔Eric Brewer在2000年的ACM PODC上提出的一个猜想。在一个分布式系统中当涉及读写操作时只能保证一致性Consistence、可用性Availability、分区容错性Partition Tolerance三者中的两个另外一个必须被牺牲。C一致性Consistency对某个指定的客户端来说读操作保证能够返回最新的写操作结果。A可用性Availability非故障的节点在合理的时间内返回合理的响应不是错误和超时的响应。P分区容忍性Partition Tolerance当出现网络分区后系统能够继续“履行职责”。说明网络分区指在分布式系统中多台服务器之间的信息交换出现了问题。例如丢包、两台服务器之间的连接中断了、网络拥堵等都叫做发生了网络分区现象。