Redis 应用问题解决

news2024/9/20 16:56:08

缓存穿透

key 对应的数据在数据源并不存在,每次针对此key的请求从缓存中获取不到,请求会都压到数据源,从而可能压垮数据源。

解决方案

一个一定不存在的缓存及查询不到的数据,由于缓存是不命中时被动写的,并且处于容错考虑,如果存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层查询,失去了缓存的意义
解决方案

  • 对空值缓存:如果一个查询返回的数据为空,不论数据是否存在,仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过5分钟
  • 设置可访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里的id进行比较,如果访问的id不再bitmaps里,进行拦截,不允许访问
  • 采用布隆过滤器:它实际上是一个很长的二进制向量(位图)和一系列随即映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远超过一般的算法,缺点是有一定的误识别率和删除困难。 将所有可能存在的数据哈希到一个足够大的bitmps中,一个一定不存在的数据会被这个bitmaps拦截掉,从而避免了对底层存储的查询压力
  • 实时监控:当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,可以设置黑名单限制服务

缓存击穿

key对应的数据存在,但在redis中过期,此时若有大量的请求发送过来,这些请求发现缓存过期一般会从后端DB加载数据并回设到缓存,这时大并发的请求可能回瞬间把DB压垮

解决方案

key可能湖izai某些时间点被高并发地访问,是一种非常“热点”的数据。这时候需要考虑:缓存被“击穿”的问题
解决方案

  • 预先设置热门数据:在redis访问高峰之前,把一些热门数据提前存到redis里面,加大这些热门数据key的时长
  • 实时调整:实时监控热门数据,实时调整key的过期时长
  • 使用锁
    1. 在缓存失效的时候(判断返回的值为空),不立即去load db
    2. 先使用缓存工具的某些带成功操作返回值的操作(例如 SETNX),去 set 一个 mutex key
    3. 当操作返回成功时,再进行 load db的操作,并回设缓存,最后删除 mutex key;
    4. 当操作返回失败,证明有线程在 load db,当前线程睡眠一段时间再重试整个get缓存的方法
      在这里插入图片描述

缓存雪崩

key对应的数据存在,但在redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这时大并发的请求可能回瞬间把后端DB压垮
缓存雪崩与缓存击穿的区别在于这里这对很多key缓存,前者是针对某一个key

解决方案

缓存失效时的雪崩效应对底层系统的冲击非常严重

  • 构建多级缓存架构:negix缓存 + reids缓存 + 其它缓存
  • 使用锁或者队列:用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况
  • 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期回触发通知零位的线程在后台去更新实际key的缓存
  • 将缓存失效时间分开:在原有的失效时间基础上增加一个随机值,这样每一个缓存的过期时间重复率就会降低,从而避免引起集体失效的状况

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker 19.03构建跨平台的镜像包并推送到私有仓库

默认的docker构建image镜像是不能跨平台的,如果需要构建跨平台的镜像,需要docker的版本在19.03版本以上,并开启buildx。以下为具体的步骤 版本:docker 19.03。 一.安装/开启 buildx 1.1.手动开启dockerx开关 docker 19.3 暂默认不开启dockerx,需要手动开启 vim /etc/pro…

Scala 数据结构-集合

文章目录Scala 数据结构-集合一、集合简介1、不可变集合继承图2、可变集合继承图二、数组1、不可变数组(1) 创建数组(2) 访问数组(3) 遍历数组(4) 添加元素Scala 数据结构-集合 一、集合简介 1)Scala的集合有三大类:序列seq,集合Set&#x…

解决fstab丢失,重启系统变为只读模式

现象描述: 背景:openEuler20.03 在/etc/fstab文件丢失、重启系统后,系统变为只读模式 [rootlocalhost ~]# echo 111 > 1.txt -bash: 1.txt: Read-only file system 解决方法: 查看系统信息,确认挂载信息&#…

【C进阶】数据在内存中的存储

数据在内存中的存储前言一、数据类型介绍(一)基本概念(二)类型的基本归类1.整型家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整形在内存中的存储(一)原码、反码、补码1.概念2.为什么内存中存的是补码…

android input 事件分发 --- 注册input

android input 事件分发 --- 注册input应用注册input事件应用注册input事件 应用如果要监听input的事件,那么肯定就存在一个注册监听input事件的过程,跟随着addView方法我们跟着走一下frameworks/base/core/java/android/view/WindowManagerImpl.java Ov…

Centos7 安装 MongoDB

使用docker安装Mongo 1、拉取镜像 注:需要科学上网 docker pull mongo [rootlocalhost ~]# docker pull mongo Using default tag: latest latest: Pulling from library/mongo 846c0b181fff: Pull complete ef773e84b43a: Pull complete 2bfad1efb664: Pull co…

LeetCode:14. 最长公共前缀

14. 最长公共前缀1)题目2)思路3)代码4)结果1)题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs [“flo…

python常用快捷键

一、编辑(Editing)Ctrl Space 基本的代码完成(类、方法、属性)Ctrl Alt Space 快速导入任意类Ctrl Shift Enter 语句完成Ctrl P 参数信息(在方法中调用参数)Ctrl Q 快速查看文档F1 外部文档Shift F…

c语言 通讯录 动态内存开辟

通讯录 通讯录中能够存放1000人信息 每个人信息: 姓名年龄性别电话地址 2.增加人的信息 3.删除指定人的信息 4修改指定人的信息 5.查找指定人的信息 6.排序通讯录的信息 contact.h 放头文件的声明 tset.c 测试通讯录模块 contact.c 函数的实现 test.c #include &…

基于不同操作系统升级知行之桥的常见问题

此前的文章知行之桥2022版本升级之页面变化以及监控邮件答疑给大家分享了一些升级到知行之桥最新版本关于Web页面显示和监控邮件的一些问题,本篇将分享一些windows和Linux不同操作系统升级部署知行之桥最新版本的一些Q&A。 EDI服务器是windows服务器 Windows操…

Smart JavaScript UI 14.4.0 Crack【htmlelements】

Smart是一个建立在 JavaScript、HTML 和 CSS 之上的全面且创新的 UI 库。Ω578867473使开发人员能够交付专业的、跨浏览器兼容的 Web 应用程序,同时显着缩短他们的开发时间。Smart HTML Elements 包含 60 多个 UI 组件,是 Web 上发展最快的 JavaScript U…

Centos7配置阿里云yum源及epel源

Background 踩坑记录吧。下次可以直接复制粘贴,不用再去排查是哪个字母字符少了多了,我这都是执行成功的命令粘贴过来的。 1、基础知识简介 yum: 全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器…

ubuntu 18.04 Pytorch安装GPU版本

先上成功的图片 过程总结: 之前也配置过,但是时间流逝,之前的方法也过时了(旧方法一般会提到先装nvidia驱动,再cuda,再cudnn之类)。 我今天尝试安装cuda 11.7时,发现cuda会自动安装…

使用 dict 对象创建多重索引 DataFrame

使用 dict 对象创建多重索引 DataFrame创作背景查看所需 dict 的格式结尾创作背景 本菜鸡最近碰到了需要使用字典创建多重索引 DataFrame 的场景,谨以本文记录解决过程。 如果觉得我这篇文章写的好的话,能不能给我 点个赞 ,评论 、收藏 一条…

对近似算法概念的学习

近似算法基本概念可近似分类最小顶点覆盖问题近似算法的分析:多机调度问题近似算法贪心G-MPS近似算法递降贪心法DG-MPS货郎问题最近邻NN算法最小生成树法MST最小权匹配MM算法0-1背包问题贪心G-KK多项式近似方案完全多项式时间的近似方案背包问题的对偶问题总结基本概…

彻底搞懂UML图

用例图 用例图的结构主要分为三个部分:参与者、用例、参与者与用例之间的关系。 参与者:不是特指人,是指系统以外的,在使用系统或与系统交互中所扮演的角色。因此参与者可以是人,可以是事物,也可以是时间…

关于alpine如何制作JDK镜像

Docker制作jdk镜像(v1.0)1.1首先编写Dockerfile文件#1.指定基础镜像,并且必须是第一条指令RROM centos:7#2.指明该镜像的作者和其电子邮件MAINTAINER xnx "zwcqq.com"#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作…

Python自制简易版计算器小程序

前言 今天来给你们分享一个自制的桌面小程序【简易版计算器】 文章内有效果展示,你们可以自行看看哦 不想看文章,想直接领取源码的话,可以直接点击文章末尾的名片哈 环境准备 Python 3.6 Pycharm 代码展示 界面设置 导入模块 所有 源码 …

STM32读取SHT3x系列温湿度传感器,标准库和HAL库

STM32读取SHT3x系列(SHT30、SHT31、SHT35)温湿度传感器的数据并显示在0.96寸OLED屏上。 我下面提供两份代码,一份是标准库使用硬件I2C的,另一份是HAL库使用软件模拟IIC的。 我用的单片机是STM32F103C8T6,温湿度传感器是SHT30。 STM32软件I…

Spring Cloud与Nacos部署Spring Boot项目

本文记录一个用于Spring Cloud 和nacos的一个项目配置方案 本文主要通过nacos实现了两点功能: 1、服务的注册与发现 2、nacos的动态配置 项目中主要包括了nacos-consumer和nacos-provider,一个消费者,一个生产者的角色,消费者负责…