Reids-缓存

本文深入探讨了Redis作为缓存的作用,详细阐述了缓存的更新策略,包括低一致性需求的内存淘汰和高一致性需求的主动更新。同时,分析了缓存穿透、缓存雪崩和缓存击穿这三大问题,并提出了相应的解决方案,如缓存空对象、布隆过滤器、随机TTL、互斥锁等,旨在提升系统性能并保证数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

此博客用于记录学习 Redis 缓存,此文提到的缓存都为 Redisi 对于缓存的应用。


一、什么是缓存

缓存就是数据交换的缓冲区,是贮存数据的临时地方,一般读写性能较高。

二、缓存的作用

缓存可以降低后端负担,提高读写效率,降低响应时间。有缓存的话,用户在访问页面时资源加载的快一些。

但是利用缓存也有一些问题,就是数据一致性问题,代码维护问题和运维成本问题。

数据一致性是指数据在缓存中和数据库中的数据要一致。在用户访问一个资源的时候,缓存中的值为1,但是数据库此时突然改为2,那么数据就不一致了,用户访问到的实际数据就是错误的。为了解决这个问题,还得考虑到怎么保持数据一致性,也就有了更新策略

三、更新策略

内存淘汰超时剔除主动更新
说明不用自己维护,利用 Redis 的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓存给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存。编写业务逻辑,在修改数据库的同时,更新缓存
一致性一般
维护成本

业务场景:

  • 低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存
  • 高一致性需求:使用主动更新机制,并以超时剔除机制做兜底。例如店铺详细信息
    使用主动更新时,要先删除数据库再删除缓存,这样线程相对安全
  • 读操作:
    1.缓存命中直接返回数据。
    2.缓存未命中,查询数据库,并写入缓存,设定超时时间
  • 写操作:
    1.先写入数据库再删除缓存
    2.要确保数据库与缓存操作的原子性

四、缓存穿透

缓存穿透是指客户端请求的数据再缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决方案

  • 缓存空对象
    优点:实现简单,维护方便
    缺点: 额外的内存消耗,可能造成短期的不一致
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id的规律
  • 做好数据的基本格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

五、缓存雪崩

缓存雪崩是指再同一时段大量的缓存 Key 同时失效或者 Redis 服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案

  • 给不同的 Key 的 TTL 添加随机值
  • 利用 Redis 集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

六、缓存击穿

缓存击穿问题也叫热点 Key 问题,就是一个被高并发访问并且缓存重建业务较为复杂的 Key 突然失效了,无数的请求访问会瞬间给数据库带来巨大的冲击。

解决方案

  • 互斥锁
    在这里插入图片描述
  • 逻辑过期

在这里插入图片描述

解决方案优点缺点
互斥锁
  • 没有额外的内存消耗
  • 保证一致性
  • 实现简单
  • 线程需要等待,性能受到影响
  • 可能有死锁风险
逻辑过期
  • 线程无需等待,性能较好
  • 不保证一致性
  • 有额外内存消耗
  • 实现复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值