redis缓存击穿 穿透

news2024/11/20 18:21:53

在这里插入图片描述

我们之前写了一把分布式锁 并且用redis写的,
redis内部实现是比较完善的,但是我们公司用的时候 redis 至少都是主从,哨兵,cluster
很少有单机的 
呢么我们分布式锁基于集群问题下会有什么问题
比如说当第一个线程设置一个key过来进行加锁,加锁成功后,就执行业务了,redis从主节点到从节点的
同步默认是异步的,如果说我主节点刚写成功,准备吧key同步给从节点,这个时候主节点挂了
此时从节点变成新的主节点,或者说他多个从节点会过来进行选举,来选举一个新的master,新的主节点中是没有key的,它也可以加锁成功,这种情况下又超卖了

redis 主从或者集群,会有这么个问题,他的锁有一种情况下会失效
zk也是集群架构,比如说3个节点组成的集群架构,也可使实现分布式锁,他也有leader和follow节点
对于zk实现分布式锁,他是有一些区别的,如果是redis集群的话,从CAP角度来说
redis满足的更多的是ap,也就是他满足的是可用性,他满足的是多一些
zk满足的是cp,他对数据的一致性要求高一些
怎么体现的?
比方说我要基于zk实现分布式锁,我也要实现key value
他也是leader节点才可以写数据,假设这个分布式锁的key 写在了leader节点 他并不会马上给你返回
加锁成功,他会进行数据同步,如果同步成功(他会进行过半机制的校验) 比如说3个节点同步2个
才算成功,有半数以上的节点写入key 成功,我们这个zk才算是加锁成功,才会返回给主线程是加锁成功的

主从切换的 过程中导致锁key丢失的问题,呢我到底使用redis还是zk实现分布式锁
zk性能肯定不如redis,如果你对性能有要求的话 就用redis,
主从节点切换锁失效
可以使用redLock

在这里插入图片描述

redLock 我们要加一把锁的话 一般来说我们要搞多个redis节点,一般来说搞基数个redis节点  比方说此时搞3个我们要加锁的话,我们set key会发到3个节点上,我客户端至少要收到整个集群节点的半数以上返回OK,也就是说设置分布式锁成功的节点我才会认为你加锁成功
因为这个半数机制存在,再来一个客户端的话 任何一种情况下都不会加锁成功,和zk差不多 也就是我要保证数据一致的话 我可以牺牲一点可用性,我要在多个节点中写锁的话 实际上是对我的可用性有影响的
相对来说可用性上面有一点点延迟 但是这么来说 他的好处,数据一致性会高一些
红锁不推荐用的,如果说都给redis加个从节点  为了高可用,因为红锁的三个redis是互不相干的
比如说redis1万一挂了没有关系,从节点会顶上去变成主节点,这个时候从节点是没有Key信息的  
此时还是会有锁失效的问题产生的

在这里插入图片描述

如果不搞从节点就不会出现问题,红锁的话 如果挂了半数以上节点  此时这个锁就会加不成功
红锁或者zk有一个缺点就是我就加一把锁性能就会降低,按照我们刚才说的
如果节点过多的情况下,加一把锁的话就会往更多的节点发送加锁请求,此时性能就会降低吧

红锁不能解决锁丢失的问题
只不过他丢失锁的概率会小一点点 但是他带来的后果就是 他的性能会损失一些
还不如基于zk 来做,所以redLock是有问题的
大促场景下 提升分布式锁性能的问题
分布式锁帮我们解决并发设计的思想是什么,利用redis单线程进行的串行化实现的
我们优化分布式锁比如说 我们要考虑锁的粒度,越小越好,我们加锁的范围肯定是越小越好
第二我们可以利用分段锁类似于currentHashMap来进行分段存储
缓存架构   
中小型公司利用redis作为缓存,放到缓存中的,比如说基于缓存做的crud

在这里插入图片描述

creat 的之后丢到缓存中
新增或者更新商品的时候 都要维护redis的缓存 

在这里插入图片描述

get 的时候先从redis缓存中去取,没有再去从数据库中拿到,之后放到redis缓存
但是如果并发量大的话  就会有redis 缓存问题

如果在高并发情况下有什么问题,例如京东
后台商品很多,我的redis 里面会有很多缓存,呢么我的redis容量要很大
呢对于我们redis,整个线上数据上亿,你丢到redis中对我们redis存储容量是很大的
我们真正的电商网站 真正高频访问的电商不到1%.大量商品都是冷门商品
我没有必要吧很少去访问的商品也丢到缓存浪费我们的资源
其实我们真正用缓存的目的是尽可能吧经常访问的 热点缓存 尽量在缓存中多呆一会
冷门数据 不用一直呆在缓存中,丢缓存的时候 放个时间

在这里插入图片描述

所以我们set的时候在里面放个缓存失效时间,如果get的时候 能get到的话 我们就给他续时间

在这里插入图片描述

这样的话,不怎么访问的冷门商品在缓存中存储1天就失效了
对于我们一直在访问的商品,尽可能的一直呆在缓存中 这样会对我们数据库的请求会大大减少
呢所以在查询缓存,做一个读取延期,如果我这么来做的话,对于每天都来访问的商品会一直在我们缓存中
那些不怎么访问的商品可能也就上架完毕就不在缓存中,实际上我就实现了数据的冷热分离,热点数据我尽可能的留在缓存中.对于冷门的数据,不会在缓存中简单方案的冷热数据分离,大规模数据我们要做一些数据的冷热分离,让热数据尽可能丢到缓存,而且要常驻缓存,冷数据可能要查数据库的,呢么数据库就可以给其他模块用了
比如说大V带货这种场景,冷门突然被发现
冷门商品几万个请求来调用这里直接打到db了,冷门数据突发变为热点数据,大量请求对我们突发性的数据重建缓存,我们可以加锁进行重建 比如说有一个线程进行放缓存的操作 
呢么多个节点的web应用集群这么再每一个web服务器上都要重建一次

在这里插入图片描述
在这里插入图片描述

我们这个时候可以利用redis分布式锁进行重建 基于什么商品加的锁啊

在这里插入图片描述

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

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

相关文章

html/css/javascript/js实现的简易打飞机游戏

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 视频浏览地址

Maven项目转为SpringBoot项目

Maven项目转为SpringBoot项目 前言创建一个maven项目前的软件的一些通用设置Maven仓库的设置其他的设置字符编码编译器注解支持 创建的Maven项目修改为Spring Boot项目修改pom.xml文件修改启动类-Main新建WAR包所需的类 添加核心配置文件 测试的控制器最后整个项目的目录结构![…

Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载:Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征,在正态分布假设下利用最大似然法估计分布密度参数,建立最小错误率Bayes分类器,写出得到的决…

@AutoConfigurationPackage注解类

包名package org.springframework.boot.autoconfigure 方法 String[] basePackages() 向AutoConfigurationPackages中注册的基本包&#xff0c;使用basePackageClasses作为基于字符串的包的类型安全替代方案 Class<?>[] basePackageClasses() 键入basePackage…

VL10F后台生成发货单时报错:物料 XXXXX 状态被锁定/未激活(不允许发货)

错误原因&#xff1a;物料主数据&#xff1a;销售视图1中&#xff0c;物料的发货状态没有激活。MM02修改物料的发货状态后正常生成单据。

双十一值得买的数码产品、这几款都不容错过

一年一度的双11终于来了&#xff0c;相信很多朋友都打算在此次的双11入手自己想要的产品&#xff0c;作为一个数码爱好者&#xff0c;我也是在此次的双11入手了下面4款数码产品&#xff0c;一起来看看吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 …

WebSocket协议:5分钟从入门到精通

一、内容概览 WebSocket的出现&#xff0c;使得浏览器具备了实时双向通信的能力。本文由浅入深&#xff0c;介绍了WebSocket如何建立连接、交换数据的细节&#xff0c;以及数据帧的格式。此外&#xff0c;还简要介绍了针对WebSocket的安全攻击&#xff0c;以及协议是如何抵御类…

互联网产品说明书指南,附撰写流程与方法

产品说明书&#xff0c;对于普通产品而言&#xff0c;再常见不过。药物、电器、电子产品等产品在正式出售时&#xff0c;往往都会附带一份产品说明书&#xff0c;以此告诉用户这个产品的功能与特性&#xff0c;并指导用户如何来使用这个产品。 产品说明书 那么&#xff0c;对于…

洗衣行业在线预约小程序+前后端完整搭建教程

大家好哇&#xff0c;好久不见&#xff01;今天源码师父来给大家推荐一款洗衣行业在线预约的小程序&#xff0c;带有前后端的完整搭建教程。 目前&#xff0c;人们对生活品质的追求不断提高&#xff0c;但生活节奏却也不断加快。对品质的追求遇到了忙碌的生活节奏&#xff0c;…

天锐绿盾终端安全管理系统

所谓透明&#xff0c;是指对使用者来说是未知的。当使用者在打开或编辑指定文件时&#xff0c;系统将自动对未加密的文件进行加密&#xff0c;对已加密的文件自动解密。文件在硬盘上是密文&#xff0c;在内存中是明文。一旦离开使用环境&#xff0c;由于应用程序无法得到自动解…

web安全-原发抗抵赖

原发抗抵赖 原发抗抵赖也称不可否认性&#xff0c;主要表现以下两种形式&#xff1a; 数据发送者无法否认其发送数据的事实。例如&#xff0c;A向B发信&#xff0c;事后&#xff0c;A不能否认该信是其发送的。数据接收者事后无法否认其收到过这些数据。例如&#xff0c;A向B发…

动态规划(记忆化搜索)

AcWing 901. 滑雪 给定一个 R行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能…

git更新代码时显示“auto-detection of host provider took too long“移除方法

git更新代码时显示"auto-detection of host provider took too long"移除方法 问题描述 在windows操作系统&#xff0c;未连接互连网电脑&#xff0c;更新内网代码库时显示“auto-detection of host provider took too long (>2000ms)”&#xff0c;如下图所示。…

idea 中配置 maven

前文叙述&#xff1a; 配置 maven 一共要设置两个地方&#xff1a;1、为当前项目设置2、为新项目设置maven 的下载和安装可参考我之前写过的文章&#xff0c;具体的配置文章中也都有讲解。1、为当前项目进行 maven 配置 配置 VM Options: -DarchetypeCataloginternal2、为新项…

设将n(n>1)个整数存放在一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<P<n)个位置

设将n&#xff08;n>1&#xff09;个整数存放在一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P&#xff08;0<P<n&#xff09;个位置。即将R中保存的数据由&#xff08;x0,x1…,xn-1&#xff09;变为&#xff08;xp,xp1…x0,x…

vscode下ssh免密登录linux服务器

vscode使用ssh免密登录linux 1、安装SSH插件2、生成密钥3、linux安装ssh服务4、linux下配置公钥5、vscode远程登录 注&#xff1a;测试环境为window10Ubuntu1804/Ubuntu2204 1、安装SSH插件 扩展->搜索SSH->点击install进行安装&#xff0c;如下图所示&#xff1a; 2、…

【Linux】安装部署Redis

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis安装部署linux 1.gcc编译环境2.c库环境3.…

记src-Juniper

一、hunter搜索web.title”Juniper Web Device Manager”&#xff0c;查找到香港的一处资产。 二、访问相关网页&#xff0c;界面就是Juniper登录界面。 三、根据编号为CVE-2023-36845的利用方法&#xff0c;抓包&#xff0c;修改提交方式&#xff0c;成功读取到文件。 原始包…

09. 主频和时钟配置

09. 主频和时钟配置 硬件原理图分析7路PLL时钟源时钟树简介内核时钟系统主频设置CCM_CACRRCCSRCCM_ANALOG_PLL_ARMn代码实例 PFD时钟设置PLL2的4路设置PLL3的4路设置代码实例 AHB、IPG和PERCLK根时钟设置AHB_CLK_ROOT 和 IPG_CLK_ROOTPERCLK_CLK_ROOTCCM_CBCDRCCM_CBCMRCCM_CSC…

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…