我的编程空间,编程开发者的网络收藏夹
学习永远不晚

缓存 | Redis 缓存避坑指南

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

缓存 | Redis 缓存避坑指南

缓存 | Redis 缓存避坑指南

作者:马功伟 青云科技软件开发工程师

目前从事青云数据库管理平台开发工作,一直从事 Server 端开发工作。

高并发业务场景下,常使用缓存技术缓解数据库压力,可极大的提升用户体验和系统稳定性。由于 Redis 自身的诸多特性,很适合用来做缓存。下面是一个常见的缓存查询流程。

缓存查询流程

虽然缓存带来了较多数据库使用性能方面的提升,也会带来一些缓存使用问题。

本文将为大家介绍并区分 缓存穿透,缓存击穿,缓存雪崩 三个常见缓存问题,并针对不同问题提供相应解决思路。

| 缓存击穿

查询请求下发后,缓存层中没有查询内容,数据库中有。在高并发场景下,某热点 Key 突然失效,所有请求都打到数据库上,导致数据库压力过大。

查询击穿

解决思路

永不失效

这里分两种情况:

  • 对缓存数据的 Redis Key 不设置过期时间,在数据库写入后进行刷新缓存;
  • 另起异步任务在 Redis Key 将要过期的时候来更新缓存。

使用互斥锁

业界常使用 mutex 。简单说,就是只允许一个线程重建缓存,其他线程等待重建缓存完成,再从缓存获取数据即可。

| 缓存穿透

查询下发后,缓存层和数据库层都没有数据的情况。由于存储层查不到,导致无数据缓存。不存在的数据请求每次都要到存储层去查询,在高并发场景下,导致数据库压力过大。

查询穿透

解决思路

缓存空值

对于缓存中没有并在数据库中查询不到的数据,可以缓存空值,并设置较短的有效期。

接口层进行校验

类似 ID=-1 这样的请求,可以在接口层增加参数和发性校验,对于校验不通过的请求直接 Return。

通过 IP 限流

对单一 IP 进行限流,比如 10 次/ 2 秒。虚拟货币交易所使用该解决方案。

布隆过滤器

当要查询一个数据时,使用 K 个哈希函数对元素值进行 K 次计算,得到 K 个哈希值,根据得到的哈希值,检查对应的 K 个比特值。

| 缓存雪崩

高并发场景下,同一时间大面积的缓存失效,所有的请求打到数据库上,导致数据库压力过大。与缓存击穿不同的是,缓存击穿是并发查询同一条数据,缓存雪崩是大量的缓存失效

查询雪崩

解决思路

随机生成 Redis Key 的过期时间

在写入缓存时随机生成 Key 的过期时间,比如随机在 1-10 之间生成秒数。

加锁排队

与缓存击穿解决思路一致。

缓存预热

系统上线时将相关数据写入缓存,这样可以避免在系统上线初期的高并发访问。

永不失效

和缓存击穿解决思路一致。

对于加锁排队方案可以减轻数据库压力,但是会降低吞吐量,分布式系统中,还要考虑分布式锁的问题,并且在高并发情况下,可能会导致用户等待超时,对系统并发能力并没有显著作用。

总结

对以上提及的解决思路,也存在如下一些缺点。

问题类型 思路 缺点
击穿&雪崩 永不失效 容易产生脏数据
击穿&雪崩 使用互斥锁 造成系统吞吐量降低
穿透 布隆过滤器 产生假阳性情况

故针对不同的业务系统,需要根据不同的业务场景具体分析,对症下药

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

缓存 | Redis 缓存避坑指南

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

缓存 | Redis 缓存避坑指南

作者:马功伟 青云科技软件开发工程师目前从事青云数据库管理平台开发工作,一直从事 Server 端开发工作。高并发业务场景下,常使用缓存技术缓解数据库压力,可极大的提升用户体验和系统稳定性。由于 Redis 自身的诸多特性,很适合用来做缓存。下面是一个常见
缓存 | Redis 缓存避坑指南
2018-09-22

Redis的缓存雪崩和缓存击穿怎么避免

缓存雪崩是指在某个时间点,大量缓存同时失效,导致大量请求直接访问数据库,造成数据库压力过大的情况。缓存击穿是指某个热点数据突然失效,导致大量请求同时访问数据库,也会造成数据库压力过大。为了避免缓存雪崩和缓存击穿,可以采取以下措施:设置合理
Redis的缓存雪崩和缓存击穿怎么避免
2024-05-07

redis如何避免缓存穿透

redis通过以下方法来避免缓存穿透:1. 使用布隆过滤器;2. 设置默认值;3. 使用空对象;4. 利用失效时间。通过这些方法,redis可以有效地阻止请求直接穿透到数据库,从而减轻数据库压力。Redis如何避免缓存穿透缓存穿透是指当不
redis如何避免缓存穿透
2024-04-20

redis缓存清空指令

要清除 redis 缓存中的所有数据,可以使用命令 flushall,它将删除缓存中存储的所有键值对,包括:1. 键值对数据;2. 过期键值对数据。Redis 缓存清空指令问题:如何清除 Redis 缓存中的所有数据?回答:要清除 R
redis缓存清空指令
2024-04-20

Redis缓存穿透、缓存击穿、缓存雪崩

使用redis作为缓存时,存在一些应用问题,包括缓存穿透、缓存击穿、缓存雪崩。 Redis缓存穿透、缓存击穿缓存雪崩redis常被用于作为后台数据库的缓存,缓存一些热点访问数据,根据局部性原理,缓存能够处理大部分请求。当请求数据未命中缓存时,才会引起对数
Redis缓存穿透、缓存击穿、缓存雪崩
2014-07-07

redis缓存

分布式项目的常见问题:对于首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化。redis是一款开源的Key-Value数据库,运行在内存中,由ANSIC编写。企业开发通常采用re
2019-04-17

redis的缓存雪崩、缓存穿透和缓存击穿

缓存雪崩:比如给缓存中的key设置了统一的过期时间,而在过期时间点,有大量的请求进来,这个时候redis中没有用户请求的资源,所以所有的请求会全部拥到数据库,如果数据库有报警监测的话,可能会报一下警,然后数据库就挂掉了。如果这时候把数据重新起来,redis上还
2017-11-21

Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩

NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。Redis 系列:1. Redis系列(一)Redis入门2.
Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
2021-02-26

ASP缓存对象入门指南:快速掌握缓存机制

,提升网站性能 ASP缓存、缓存机制、性能优化、网站速度、数据访问 ASP缓存对象是ASP.NET中用于存储数据的对象,它可以帮助我们提高网站的性能。ASP缓存对象是一个键值对存储,我们可以将需要缓存的数据存储在缓存对象中,然后在需要的时候直接从缓存对象中获取数据。这样就可以避免每次都需要从数据库中查询数据,从而提高网站的性能。
ASP缓存对象入门指南:快速掌握缓存机制
2024-02-23

redis缓存雪崩、缓存击穿和缓存穿透是什么

这篇文章主要介绍了redis缓存雪崩、缓存击穿和缓存穿透是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇redis缓存雪崩、缓存击穿和缓存穿透是什么文章都会有所收获,下面我们一起来看看吧。缓存雪崩首先来看看
2022-11-30

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

本篇内容介绍了“Redis缓存击穿、缓存穿透、缓存雪崩如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis缓存使用场景Redis
2023-07-05

redis是内存缓存吗

是的,redis 是一款内存缓存。它将数据存储在内存中,提供高速读写访问、低延迟,并支持多种数据结构。广泛用于缓存、消息队列、会话管理和排名列表等应用程序中。Redis 是内存缓存吗?是的,Redis 是一个内存缓存。详细说明:Red
redis是内存缓存吗
2024-04-20

编程热搜

目录