大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (正在更新…)

章节内容

上节我们完成了:

  • Redis 通信协议
  • Redis 响应模式:串行模式、双工模式
  • Redis 数据格式
  • 处理流程、处理机制、文件事件
  • Reactor 多路复用等基础概念

在这里插入图片描述

缓存穿透

问题描述

一般的缓存系统,都是按照Key去缓存查询,如果不存在对应的Value,就会去后端中查询。
在高并发情况下,过量查找不存在的Key就会出现缓存穿透的问题,数据库会因为量过大而宕机。

解决方案

  • 对查询结果为空的情况也进行缓存,缓存时间(TTL)设置的短一点,或者Key对应的数据 INSERT 操作后清理缓存。
  • 使用布隆过滤器,在缓存之前加一层。在查询前先到布隆过滤器中查找,不存在则直接返回,不需要到DB查找。

在这里插入图片描述

布隆过滤器

布隆过滤器(BloomFilter)是1970年提出的,它实际上一个很长的二进制向量和一系列随机的Hash。

布隆过滤器的原理是:当一个元素被加入到集合中,通过 k 个Hash函数将这个元素映射成一个数组中的 k 个点,把它设置为1。
检索时:查询这些点是否为1即可,如果这些点存在任何一个0,那这个元素一定不存在。但是如果都是1,则这个元素是可能存在的。

在这里插入图片描述

缓存雪崩

问题描述

当缓存服务器重启或者压力过大宕机时,会有大量的访问到达DB,导致数据库奔溃。

解决方案

  • key 的失效期分散开,不同的key是指不同的过期时间
  • 设置二级缓存
  • 高可用

缓存击穿

问题描述

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发的访问,是一种非常热的数据。这个时候,可能会存在被击穿的问题。
缓存在某个时间点过期的时候,恰好有很多key的访问过来,这些请求都发现缓存中没有值,从而都到达DB。

解决方案

  • 分布式锁控制线程的访问
  • 不设置超时时间 但会造成读写一致问题

数据不一致

问题描述

缓存和DB中的数据不一致。

解决方案

强一致是非常难的,但是可以追求最终一致,采用 延时双删:

  • 先更新数据库的同时删除缓存,等读的时候就会填充缓存
  • 2秒后再删除一次缓存
  • 设置过期时间
  • 将缓存删除失败记录到日志中,利用脚本再次删除

更高级的方案:

  • 通过 binglog 日志来删除缓存

并发竞争

问题描述

多个客户端并发写一个 key,比如写请求:1、2、3、4,最后本来是4,但是由于到达时间顺序问题,成了 2、1、4、3。

解决方案: 分布式锁 + 时间戳

实现原理

准备一个分布式锁,让大家抢锁,抢到再做 SET 操作。
目的是为了让原来的并行操作变成串行操作。

在这里插入图片描述

Redis分布式锁

通过 setnx() 函数实现,但是要注意要有时间:

系统A key 1: {A: 10:00}
系统B key 1: {B: 10:01}

如果是B先抢到锁执行后,在A抢到锁后,发现时间已经过了,那就不做SET操作了。保证数据的顺序。

解决方案:消息队列

在并发量过高的情况下,消息队列排队串行化。
再从消息队列中取出一个一个执行。

HotKey

问题描述

当有大量的请求访问某个Redis中的Key,由于流量集中达到网络的上限。
当有大量的请求(几十万)访问Redis中某个Key时,导致Redis的服务宕机了。接下来就导致流量会进入到DB中。

在这里插入图片描述

如何发现

  • 预估热key,比如秒杀、火爆新闻
  • 客户端进行统计
  • Redis自带命令:monitor、hotkeys,但是执行慢
  • 利用大数据技术:Storm、Spark、Flink等,发现后写入到ZK中

在这里插入图片描述

解决方案

  • 变分布式缓存为本地缓存,发现hotkey后,加载本地的缓存(数据一致性可能会低)
  • 在每个主节点上备份呢热key数据,到时候随机选节点读取即可
  • 热点数据进行限流熔断

Big Key

问题描述

大Key指存储的值非常大:

  • 热门话题下的讨论
  • 大V的粉丝列表
  • 序列化后的图片
  • 没有及时处理的垃圾数据

大Key带来的问题:

  • 大key会占用大量的内存,集群中无法均衡
  • Redis性能下降,主从复制异常
  • 删除时操作时间过长导致阻塞

如何发现

  • 使用 --bigkeys 命令 但key较多时会很慢
  • 获取 RDB 文件,进行分析

如何处理

  • string类型的bigkey不要存入Redis,可用MongoDB或者CDN
  • string类型bigkey如果非要存Redis,则单独存储,比如一台Redis单独存。
  • 将Key拆分成多个 key-value,平摊到多次获取的压力上
  • 大Key不要del,del会阻塞,而删除时间很长会导致阻塞
  • 使用 lazy delelet (unlink指令)

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

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

相关文章

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中,OpenAI 推出的 GPT-4o mini 模型如同一阵春风,给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格,成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时,内心充满了好奇与期待…

解锁Conda配置的秘密:conda config --get命令全指南

🔑 解锁Conda配置的秘密:conda config --get命令全指南 Conda是一个功能强大的包管理器和环境管理器,它允许用户通过配置文件来自定义其行为。有时,了解当前的配置状态对于诊断问题、优化设置或确保环境的一致性至关重要。本文将…

Linux下学习Python包管理器Poetry教程 零基础入门到精通

Poetry [官网 - Poetry] https://python-poetry.org/ 安装 pip install poetry简单使用 初始化 poetry 项目 cd ~ && mkdir demo poetry init管理虚拟环境 poetry 预设了很多自己的虚拟环境配置,这些配置可以通过 poetry config 进行修改 当用户在执…

使用git工具管理泰山派内核源码目录及抽打补丁简易流程

目录 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 一、使用git维护源码 二、git 常用的一些操作 三、抽补丁 四、打补丁 五、补充 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 最近,在做linux开发的过程中入手了一块泰山派RK3566的开发板…

嵌入式初学-C语言-前言

概述 C语言是一种计算机编程语言,我们是利用代码来控制计算机的运行,从而达到某种目的,我们 就很有必要了解计算机的运行原理。 计算机组成 OS 应用程序 计算机硬件 基本组成: 输入设备:输入数据给计算机处理&…

详解Mysql InnoDB引擎 04

文章目录 1. InnoDB 简介2. 逻辑存储结构2.1 表空间 idb文件2.2 段2.3 区 1M2.4 页 16KB2.5 行 3. 架构3.1 内存结构3.1.1 Buffer Pool 缓冲池3.1.2 Change Buffer 更改缓冲区3.1.3 Adaptive Hash Index3.1.4 Log Buffer 3.2 磁盘结构 4. 后台线程5. 事务原理5.1 redo log 重做…

动态数据增强的艺术:Mojo模型的自定义应用

动态数据增强的艺术:Mojo模型的自定义应用 在机器学习和深度学习领域,数据增强是提升模型泛化能力的重要手段。Mojo模型,作为深度学习模型的一种封装形式,通常指的是通过训练得到的模型参数的集合,它能够被用于快速推…

运行python项目出现ModuleNotFoundError: No module named ‘sklearn‘问题

问题1:ModuleNotFoundError: No module named sklearn 1.WindowsR键,输入cmd,进入命令行窗口 2.安装sklearn,使用清华镜像安装: python -m pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple …

算法学习day22

一、函数的独占时间 给你一个进程数量,和运行日志。运行日志log的格式为:进程id:(start/end):运行时间 其中一个进程运行时可以被另一个优先级较高的进程抢占cpu。求每个进程独占cpu的时间。 输入:n 2, logs ["0:start:0","1:start:…

Spring Boot - 优雅实现支持通配符和IP段的IP访问黑白名单机制

文章目录 CodeIpAccessInterceptoraddInterceptor工具类配置文件 application.yml单元测试 Code 废话不多说,直接上码 IpAccessInterceptor package cn.cloud.bus.module.servicebus.framework.ipconfig;import cn.cloud.bus.module.servicebus.util.IpFilterUti…

深入理解计算机系统 CSAPP 家庭作业11.10

A: //home.html <form action"/cgi-bin/adder" method"GET"><ul><li><label for"n1">n1:</label><input type"text" id"n1" name"n1" /> //name的值决定页面提交后&#xf…

栈知识梳理和函数实现

参考此文章数据结构——栈&#xff0c;此文章写的更详细&#xff0c;由于我们都是学自于比特课程&#xff0c;这里做个自我备份&#xff0c;方便后续查阅、修改和补充。 栈知识梳理和函数实现 前言1.栈是什么&#xff1f;2.栈的接口实现2.1初始化栈2.2入栈2.3 出栈2.4 获取栈顶…

C语言图书信息管理系统

题目&#xff1a;图书信息管理系统 内容及主要功能描述&#xff1a; 该系统用于管理图书信息&#xff0c;包括图书的增加、删除、查找、修改、浏览、按出版社统计图书数量等功能。具体功能包括&#xff1a; 增加图书&#xff1a;输入图书信息并添加到系统中。删除图书&#x…

浅谈WebSerice

一. 什么是WebService Web Service也称为web服务&#xff0c;它是一种跨编程语言和操作系统平台的远程调用技术。Web Service采用标准的SOAP协议传输&#xff08;SOAP&#xff1a;Simple Object Access Protocol简单对象访问协议&#xff0c;soap属于w3c标准。并且soap协议是基…

C++ 算法:从基础到高级

C 算法&#xff1a;从基础到高级 C 是一种功能强大且高效的编程语言&#xff0c;广泛应用于系统编程、游戏开发、嵌入式系统以及高性能计算等领域。算法是程序设计的核心&#xff0c;掌握常用算法是成为优秀 C 程序员的必备技能。本文将介绍一些常用的 C 算法&#xff0c;从基…

【漏洞复现】phpStudy 小皮 Windows面板 存在RCE漏洞

靶场资料后台自行领取【靶场】 image-20240726092307252 PhpStudy小皮面板曝RCE漏洞&#xff0c;本质是存储型XSS引发。攻击者通过登录用户名输入XSS代码&#xff0c;结合后台计划任务功能&#xff0c;实现远程代码执行&#xff0c;严重威胁服务器安全。建议立即更新至安全版…

JAVA SE 类和对象

类和对象 类定义和使用类的定义格式 类的实例化什么是实例化 this 引用this引用的特性 对象的构造及初始化如何初始化对象构造方法概念特性 在这里插入图片描述 **注意**&#xff1a; 封装封装的概念封装扩展之包导入包中的类自定义包包的访问权限控制举例 static成员static修饰…

Spring Cloud全解析:入门指南与概览,轻松掌握微服务架构的基石

springcloud简介 微服务&#xff1f; 微服务是一种架构风格&#xff0c;将单体应用划分为小型的服务单元&#xff0c;微服务之间使用HTTP的API进行资源访问和操作&#xff0c;与SOA不同的是&#xff0c;SOA架构侧重于将每个单体应用的服务集成到ESB(消息总线)上&#xff0c;而…

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

[NOIP2001 普及组] 最大公约数和最小公倍数问题 题目描述 输入两个正整数 x 0 , y 0 x_0, y_0 x0​,y0​&#xff0c;求出满足下列条件的 P , Q P, Q P,Q 的个数&#xff1a; P , Q P,Q P,Q 是正整数。 要求 P , Q P, Q P,Q 以 x 0 x_0 x0​ 为最大公约数&#xff0c;以…

【计算机网络】TCP协议详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1、引言2、udp和tcp协议的异同3、tcp服务器3.1、接口认识3.2、服务器设计 4、tcp客户端4.1、客户端设计4.2、说明 5、再研Tcp服务端5.1、多进程版5.2、多线程版 5、守护进程化5.1、什么是守护进程5.2…