Redis应用问题及解决

目录

一.缓存穿透

        1.1 问题描述

         1.2 解决方案

 二.缓存击穿

        2.1 问题描述

         2.2 解决方案

 三.缓存雪崩

        3.1 问题描述

        3.2 解决方案


        当数据库压力变大,导致服务访问数据库响应变慢,导致服务的压力变大,最终可能导致服务宕机。

一.缓存穿透

        1.1 问题描述

        key对应的数据在数据库中并不存在,每次针对key的请求从缓存中获取不到,于是会请求数据库。当该key的请求很多,会导致数据库的压力变大,从而导致数据库宕机。

        此时缓存还是平稳运行的,但是并没有起到作用。

        比如:用一个不存在的用户id获取用户的信息,不论是缓存还是数据库都不存在该数据。若黑客利用此漏洞进行攻击可能压垮数据库。

         1.2 解决方案

        一个一定不存在的缓存以及查询不到的数据,如果在数据库中找不到数据不写入缓存,则在缓存中找不到数据每次请求都需要到数据库中查询。这将导致缓存失去意义。

  • 对空值进行缓存:如果从数据库中没有查询到数据,返回为空,不管存不存在,我们仍然把这个空值(null)进行缓存,但是设置空值的过期时间很短,不超过5分钟。只能作为临时的方案。
  • 设置可以访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较。如果id不在bitmaps里,进行拦截,不允许访问。
  • 使用布隆过滤器:布隆过滤器的底层也是使用的hash,优点是空间效率和查询时间效率高,缺点是有一定的误识别率和删除困难。
  • 进行实时监控:当发现redis缓存中的命中率急剧降低,排查访问对象和访问数据,和运维人员配合,设置黑名单限制访问。

 二.缓存击穿

        2.1 问题描述

        key对应的数据存在,但是在redis中过期,此时若有大量的并发请求过来,这些请求发现缓存过期,会将请求发送到数据库中,查找到数据后将数据缓存到redis中。这个时候大量的并发请求可能瞬间把数据库击垮。

        同一时间有大量的请求,请求到了redis中过期的数据,请求转发到数据库,大量的请求导致数据库压力过大,导致数据库宕机。

        现象:1.数据库的压力瞬时增加。2.redis中并没有大量的key过期。3.redis正常运行,压力并没有变大。

        原因:1.redis中某个key过期,并且有大量的访问使用到这个key。

         2.2 解决方案

        key可能会在某个时间点被超高并发的访问,是一个非常热点的数据。如果缓存中该key过期了,会导致数据库的压力变大,进而导致宕机,出现缓存击穿问题。

  • 预先设置热门数据:在redis高峰访问之前,把热门数据提前存入到redis里面,并且加大这些热门数据key的过期时长。
  • 实时调整:现场监控哪些热门数据,监控那些数据被频繁访问,实时调整key的过期时长。
  • 使用锁
    • 在缓存失效的时候(判断拿出来的值为空),不是立即去访问数据库。
    • 先使用缓存工具的某些带成功操作返回值的操作(比如:redis的setnx)去set一个mutex key。
    • 当操作返回成功时,在进行请求数据库的操作,并回设缓存,最后删除mutex key。
    • 当操作返还失败时,证明有线程在访问数据库,当前线程等待一段时间再重试整个get缓存的方法。
    • 加锁的缺点会导致效率变低。每次访问数据库只能一个线程去访问。

 三.缓存雪崩

        3.1 问题描述

        key对应数据存在,但是再redis中过期,此时若有大量的并发请求过来,这些请求发现缓存过期一般会将请求发送到数据库中,并且将数据设回缓存,这个时候大量的并发请求会瞬间压垮数据库,导致数据库宕机。

        缓存雪崩和缓存击穿的区别在于,缓存雪崩针对的是很多个key过期,缓存击穿只是针对一个key过期。

        现象:1. 在极短的时间段内,redis中有大量的key过期。

        3.2 解决方案

        缓存失效时的雪崩问题对底层系统的冲击时非常可怕的。

  • 构建多级缓存架构:nginx缓存+redis缓存+其他缓存(echache等)。如果redis不能处理,在其他缓存中查找。
  • 使用锁或者队列:使用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行大量的访问。从而避免失效时大量的并发请求落到底层存储系统上,不适用于高并发的情况
  • 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外一个线程在后台去更新实际key的缓存。
  • 将缓存失效时间分散开:比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分支随机,这样每一个缓存的过期时间的重复率会降,就很难引发集体失效的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/9377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】栈与队列经典oj题

🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…

[Jenkins自动化] 实现远端linux自动化部署方式(上篇)

目录 本篇文章简介: 简单易上手, 轻松实现jenkins实现自动化部署(上) 1. 安装jenkins方式 -> 1.1 windows版本 --->1.1.1 直接安装 修改安装路径 设置端口号 9000为例 ---> 1.1.2 创建工作空间即可 (起名为pzy) -> 1.2 linux版本(暂无) -> 1.3 docker版…

chapter-4-数据库语句

以下课程来源于MOOC学习—原课程请见:数据库原理与应用 考研复习 概述 SQL发展 注:关键词是哪些功能,尤其第一个create alter drop是定义功能 1.SQL功能强大,实现了数据定义、数据操纵、数据控制等功能 2.SQL语言简洁&#xff…

redis基础总结-常用命令

redis常用指令3. 常用指令3.1 key 操作分析3.1.1 key应该设计哪些操作?3.1.2 key 基本操作3.1.3 key 扩展操作(时效性控制)3.1.4 key 扩展操作(查询模式)3.2 数据库指令3.2.1 key 的重复问题3.2.2 解决方案3.2.3 数据库…

Linux Shell 实现一键部署Redis6

redis 前言 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis 参考 redis下载RedisDesktopManagerd…

ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现,它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程,以满足多线程并发执行任务的需要。 FutureTask作用 FutureTask的主要作用…

SpringAMQP

SpringAMQP3.SpringAMQP3.1.Basic Queue 简单队列模型3.1.1.消息发送3.1.2.消息接收3.1.3.测试3.2.WorkQueue3.2.1.消息发送3.2.2.消息接收3.2.3.测试3.2.4.能者多劳3.2.5.总结3.3.发布/订阅3.4.Fanout3.4.1.声明队列和交换机3.4.2.消息发送3.4.3.消息接收3.4.4.总结3.5.Direct…

docker

1.docker安装 1.安装docker 2.配置docker加速器 3.docker的基本目录 /etc/docker/ docker的认证目录 /var/lib/docker/ docker的应用目录 2.docker容器 docker image pull nginx docker container stop nginx docker container rm $(docker container ps -aq) #q: --quiet …

代码随想录-62-530. 二叉搜索树的最小绝对差

目录前言题目1.二叉搜索树中序遍历特性介绍(并且使用一个指针始终指向前一个)全局变量2. 本题思路分析:(中序遍历)3. 算法实现4. 算法坑点前言 我在刷卡哥的“代码随想录”,自己的总结笔记均会放在“算法刷…

OpenCV基础之边缘检测与轮廓描绘

文章目录OpenCv基础之边缘检测与轮廓描绘Canny边缘检测图像轮廓绘制轮廓OpenCv基础之边缘检测与轮廓描绘 边缘检测:主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。 轮廓检测…

CAN-FD协议

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录CAN-FD协议**CAN-FD协议需要什么?**CAN-FD 协议的属性CAN-FD 协议中的安全性OSI 层中的 CAN-FD**CAN-FD物理层设计**CAN-FD 数据链路层数据链路层的…

win10自带的输入法变成了繁体怎么改回来

win x 键弹出设置窗口 选择设置 点击时间和语言 点击语言 点击中文(中国人民共和国) 先点击一下会出来选项 在点击选项进去 往下拉最底下找到 键盘下面你正在使用的输入法 点击他 选择选项进去,然后点击常规 在 选择字符集这里下面 选择简体中文

SpringBoot中配置文件加密及跨域支持

给application.properties文件中的某些值加密,比如数据库账号密码等. 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version> </dep…

Properties

Properties概述&#xff1a; 是一个Map体系的集合类 Properties可以保存到流中或从流中加载 练习&#xff1a;Properties作为Map集合的使用 package com.aynu13;//练习&#xff1a;Properties作为Map集合的使用import java.util.Properties; import java.util.Set;public cla…

交友项目【手机号登录注册功能】实现

目录 1&#xff1a;用户登录 1.1&#xff1a;接口文档 1.2&#xff1a;API接口定义 1.3&#xff1a;Dubbo服务提供者 配置文件 启动引导类 数据访问层 API接口实现 1.4&#xff1a;Dubbo服务消费者 UserController UserService 1.5&#xff1a;访问测试 1.6&#…

【Django 网页Web开发】23. 实战项目:Excel和form和moudleForm的文件上传(16)(保姆级图文)

目录excel文件批量上传数据1. depart_list.html2. url.py3. moudle.py4. depart.py5. upload.pyform文件上传1. upload_form.html2. url.py3. moudle.py4. upload.py5. 目录media存放用户上传的文件总结欢迎关注 『Django 网页Web开发』 系列&#xff0c;持续更新中 欢迎关注 『…

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…

【华为OD机试】1024 - 素数伴侣

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1&#x1f538;样例2二、思路解析三、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &…

Ae:灯光选项

灯光选项 Light Options&#xff0c;用于调整光源的特性以及所产生的投影的相关设置。下面以属性最多的聚光灯的灯光选项为例进行说明。强度 Intensity光源的亮度。数值越大&#xff0c;光照越大。负值可产生吸光效果&#xff0c;即降低场景中其它光源的光照强度。颜色 Color默…

Java客户端操作索引库

ElasticSearch第二天 学习目标&#xff1a; 能够使用java客户端完成创建、删除索引的操作能够使用java客户端完成文档的增删改的操作能够使用java客户端完成文档的查询操作能够完成文档的分页操作能够完成文档的高亮查询操作能够搭建Spring Data ElasticSearch的环境能够完成…