redis10 应用问题(穿透、击穿、雪崩、分布式锁)

news2024/12/27 13:21:16

思维草图

缓存穿透

查询不存在的数据,穿透redis缓存,请求直接攻击后端db。

问题

当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回(相当于一道隔离闸,保护db),缓存中没有就去db中查询,db中如果有就会将其丢到缓存中。

但是有些key对应数据在db中并不存在,每次针对此次key的请求从缓存中取不到,请求都会压到db,从而可能压垮db。 比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用大量此类攻击可能压垮数据库。

解决方案

1.对空值缓存

如果一个查询返回的数据为空(不管数据库是否存在),我们仍然把这个结果(null)进行缓存,给其设置一个很短的过期时间,最长不超过五分钟。

2.设置可访问的名单(白名单)

使用redis中的bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次范文和 bitmap里面的id进行比较,如果访问的id不在bitmaps里面,则进行拦截,不允许访问。

3.采用布隆过滤器

布隆过滤器(Bloom Filter)是1970年有布隆提出的,它实际上是一个很长的二进制向量(位图)和一 系列随机映射函数(哈希函数)。 布隆过滤器可以用于检测一个元素是否在一个集合中,它的优点是空间效率和查询的世界都远远超过一 般的算法,缺点是有一定的误识别率和删除困难。 将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。

4.进行实时监控

当发现redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制对其提供服务(比如:IP黑名单)。

缓存击穿

当一个热点key突然失效,或者一个数据突然变成热点数据(key还没放进缓存),请求先查询redis,发现没有,所有的请求瞬间打到后端的db上,把db打穿。

问题

redis中某个热点key(访问量很高的key)过期,此时大量请求同时过来,发现缓存中没有命中,这些请求都打到db上了,导致db压力瞬时大增,可能会打垮db,这种情况成为缓存击穿。

key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据,这个时候,要考虑一个问题,缓存被“击穿”的问题

这种情况下redis正常运行,压力全都瞬间给到了db。

解决方案

1.预先设置热门数据,适时调整过期时间

在redis高峰之前,把一些热门数据提前存入到redis里面,对缓存中的这些热门数据进行监控,实时调 整过期时间。

2.使用锁

缓存中拿不到数据的时候,此时不是立即去db中查询,而是去获取分布式锁(比如redis中的setnx), 拿到锁再去db中load数据;没有拿到锁的线程休眠一段时间再重试整个获取数据的方法。

缓存雪崩

同一时间redis种大量的key同时失效,导致请求全部请求后端db,底层服务崩溃。

问题

key对应的数据存在,但是极短时间内有大量的key集中过期,此时若有大量的并发请求过来,发现缓存没有数据,大量的请求就会落到db上去加载数据,会将db击垮,导致服务奔溃。

缓存雪崩与缓存击穿的区别在于:前者是大量的key集中过期,而后者是某个热点key过期或者某个数据突然变成热点数据。

解决方案

1.构建多级缓存

nginx缓存+redis缓存+其他缓存(ehcache等)

2.使用锁或队列

用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上,不适用高并发情况。

3.监控缓存过期,提前更新

监控缓存,发下缓存快过期了,提前对缓存进行更新。

4.将缓存失效时间分散开(常用)

比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样缓存的过期时间重复率就会降低,就很难引发集体失效的事件。

(就是不要让所有的key同一时间失效)

分布式锁

问题

随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。

解决方案

1. 基于数据库实现分布式锁

2. 基于缓存(redis等)

3. 基于zookeeper

每一种分布式锁解决方案都有各自的优缺点,根据实际的业务场景进行选择

1. 性能:redis最高

2. 可靠性:zookeeper最高 

使用redis实现分布式锁

set key value NX PX 有效期(毫秒)

# 执行命令,返回ok表示执行成功,则获取锁成功,多个客户端并发执行此命令的时候,redis可确保只有一个可以执行成功。

总结

概括

  • 缓存穿透是指缓存中无法找到所需数据,导致每次请求都需要访问数据库,从而增加了数据库的负载。这种情况通常发生在恶意攻击或者查询不存在的数据时。
  • 缓存击穿是指一个缓存中的热点数据非常频繁地被大量并发请求访问,当该热点数据失效的瞬间,持续的大并发请求无法通过缓存获取到数据,而直接访问数据库。
  • 缓存雪崩是指在同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库给数据库带来巨大压力,可能导致数据库崩溃。

差异点

  • 缓存穿透是查询不存在的数据,而缓存击穿缓存雪崩是查询存在的数据。
  • 缓存击穿是一个热点key失效,而缓存雪崩是大量key同时失效。

记忆方法

  • 穿透:想象一个盗贼穿透了缓存直接攻击数据库,即查询不存在的数据。
  • 击穿:想象一个热门景点(热点key)被大量游客(并发请求)同时访问,但景点突然关闭(数据失效),游客只能转而访问其他景点(数据库)。
  • 雪崩:想象一场大雪压垮了多个景点(大量key同时失效),导致大量游客无处可去,只能涌向剩余的景点(数据库),给景点带来巨大压力。

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

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

相关文章

记录踩过的坑-macOS下使用VS Code

目录 切换主题 安装插件 方法1 方法2 搭建Python开发环境 装Python插件 配置解释器 打开项目 打开终端 INFO: pip is looking at multiple versions xxxx,过了很久后报错 方法1 方法2 ​​​​​​​ 切换主题 安装插件 方法1 方法2 搭建Python开发环境…

[Python人工智能] 四十二.命名实体识别 (3)基于Bert+BiLSTM-CRF的中文实体识别万字详解(异常解决中)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解如何实现中文命名实体识别研究,构建BiGRU-CRF模型实现。这篇文章将继续以中文语料为主,介绍融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。然而,该代码最终结…

外汇天眼:投资房地产轻松获利12%?台湾上百人因「庞氏骗局」损失6000万

现代社会因为金融体系不断发展与改革,衍生出各式各样投资理财的形式与标的,其中房地产因为具有对抗通胀、满足居住需求的双重特性,一直被视为一种稳健的投资标的。 然而,日前竟有多位民众向媒体爆料,表示碰到非法吸金的…

基于springboot+vue的周边游平台个人管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

使用华为云云函数functiongraph

之前使用腾讯云serverless,但是突然开始收费了。所以改用functiongraph 首先登陆华为云。 目录 1.登录华为云 2.在控制台找到functiongraph并开通 3.添加依赖包: 3.1 制作依赖包 3.2引入依赖包 4.发送请求 4.1直接发送 4.1.1uri 4.1.2 请求头…

稀碎从零算法笔记Day7-LeetCode:罗马数字转整数

题型:字符串转化、找规律 链接:13. 罗马数字转整数 - 力扣(LeetCode) 来源:LeetCode 题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 …

自然语言处理之语言模型(LM)介绍

自然语言处理(Natural Language Processing,NLP)是人工智能(Artificial Intelligence,AI)的一个重要分支,它旨在使计算机能够理解、解释和生成人类语言。在自然语言处理中,语言模型&…

拓尔微代理商 TMI3252T 600kHz 18V 2A同步COT降压转换器

TMI3252/S/T是高效率600kHz,恒定导通时间 (COT) 控制同步模式降压型DC-DC转换器,能够提供高达2A电流。TMI3252/S/T集成主要具有极低 RDS(ON) 的开关和同步开关以尽量减少传导损耗。低输出电压纹波和小尺寸的…

前端H5动态背景登录页面(上)

最近一段时间看一些关于前端的东西&#xff0c;下面分享两个非常不错的前端动态背景登陆页面&#xff0c;还有几个等后面有时间了再整理。 1、彩色气泡登录页面 下面是源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8…

跨地域传文件时 面临的安全、效率等问题要如何解决?

近年来&#xff0c;企业在异国、异地设立分支机构的越来越多&#xff0c;在日常经营中&#xff0c;企业总部和分支机构间存在平行、垂直及互相交叉的管理模式和业务往来需求&#xff0c;因此&#xff0c;大型企业存在必然的跨地域传文件场景&#xff0c;比如跨地理域文件交换、…

VS2015报错:error MSB8020和MSB8036的解决方案

VS2015编译报错&#xff1a;error MSB8020 提示信息&#xff1a;error MSB8020: The build tools for v141 (Platform Toolset ‘v141’) cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the c…

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…

中文文本分类_1(pytorch 实现)

import torch import torch.nn as nn import torchvision from torchvision import transforms, datasets import os, PIL, pathlib, warningswarnings.filterwarnings("ignore") # 忽略警告信息# win10系统 device torch.device("cuda" if torch.cuda.i…

【你刚好需要,我们刚好可以做到】戳!戳!戳!

你刚好需要&#xff0c;我们刚好可以做到&#xff01;&#xff01;&#xff01; 今天给大家介绍一个朋友的网络科技公司&#xff1a;天津集创科技有限公司。 这不仅仅是一家公司&#xff0c;更是一场变革的引领者。通过创新和前瞻性技术&#xff0c;创作打破传统&#xff0c;共…

医学与美学的聚能,雍禾医疗打造“好医生·一人一案”个性化服务

在当下社会&#xff0c;脱发问题已成为困扰许多人的头等大事。尤其是在年轻人群中&#xff0c;随着社会竞争的加剧和生活压力的增加&#xff0c;越来越多的年轻人意识到毛发对于个人形象的重要性。无论是在求职面试、社交场合还是日常生活中&#xff0c;浓密健康的头发都成为了…

分享一本好书《大模型应用开发极简入门:基于GPT-4和ChatGPT》

如果问个问题&#xff1a;有哪些产品曾经创造了伟大的奇迹&#xff1f;ChatGPT 应该会当之无愧入选。仅仅发布 5 天&#xff0c;ChatGPT 就吸引了 100 万用户——当然&#xff0c;数据不是关键&#xff0c;关键是其背后的技术开启了新的 AI 狂潮&#xff0c;成为技术变革的点火…

【脑切片图像分割】MATLAB 图像处理 源码

1. 简单图像处理 加载图像 Brain.jpg&#xff0c;使用直方图和颜色分割成区域这些区域有不同的颜色。 这是一个更高级的问题&#xff0c;有多个解决它的方法。 例如&#xff0c;您可以计算具有特定数字的图像的直方图&#xff08;例如 16 - 32&#xff09;&#xff0c;找到直方…

Python爬虫实战:京东商品信息爬取

项目背景 需要获取京东的某一领域的商品信息数据&#xff0c;为后续项目推进做准备 实现思路 京东商品API数据采集接口可以实现大批量稳定数据采集。去获取每一个商品的数据首先需要去利用京东的搜索&#xff0c;利用关键字得到相关商品信息&#xff0c;由搜索结果去进行信息…

数据库和缓存如何保持一致性

目录 前言 更新数据库更新缓存&#xff1a; 1.在更新缓存前先加一个分布式锁 2.在更新完缓存时&#xff0c;给缓存加上较短的过期时间 Cache Aside策略 1.先删除缓存&#xff0c;再更新数据库 延迟双删 2.先更新数据库&#xff0c;再删除缓存 保证两个操作都能执行成功…