当前位置: 首页 > news >正文

做运营必看的网站/seo快排优化

做运营必看的网站,seo快排优化,企业简介 网站建设,网站建设不完整目录 介绍 缓存穿透 缓存击穿 缓存雪崩 原因 影响 解决方案 缓存穿透 防止缓存穿透->空值缓存案例 缓存击穿 使用互斥锁解决缓存击穿 介绍 缓存穿透 定义:缓存穿透是指用户查询数据,缓存和数据库中都不存在该数据(一般是发起恶意…

目录

介绍

缓存穿透

缓存击穿

缓存雪崩

原因

影响

解决方案

缓存穿透

防止缓存穿透->空值缓存案例

缓存击穿

使用互斥锁解决缓存击穿


                                                    介绍

   缓存穿透

定义:缓存穿透是指用户查询数据,缓存和数据库中都不存在该数据(一般是发起恶意的查询,试图击穿缓存,直接查询数据库),这时用户每次查询都会直接打到数据库上,而数据库中也没有该数据,如果用户不断发起这样的请求,数据库压力会非常大,甚至可能拖垮数据库。

解决方案

  1. 布隆过滤器(Bloom Filter):布隆过滤器可以快速判断一个元素是否在一个集合中,但是会有一定的误判率。在数据放入缓存之前,先使用布隆过滤器判断数据是否存在,如果不存在则直接返回,不进行数据库查询。
  2. 空值缓存:对于不存在的数据,也在缓存中存放一个空值(或者一个特殊标记),这样下次查询相同的数据时,可以直接返回缓存中的空值,避免了对数据库的查询。但是这种方法需要设置合理的过期时间,避免数据长时间不更新。
  3. 请求限流:对查询请求进行限流,限制查询频率,防止恶意查询。

   缓存击穿

定义:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决方案

  1. 设置热点数据永不过期,即逻辑缓存:对于一些热点数据,可以将其设置为永不过期,从而避免缓存击穿问题。但是这种方法会占用较多的缓存空间,需要谨慎使用。
  2. 加互斥锁:在查询数据库之前,先尝试获取一个分布式锁,如果获取到锁,则查询数据库并更新缓存;如果未获取到锁,则等待一段时间后重试。这样可以保证同一时间只有一个请求去查询数据库,从而减轻数据库压力。
  3. 双缓存策略:使用两个缓存,一个缓存的过期时间较短,用于应对大部分请求;另一个缓存的过期时间较长,用于应对缓存击穿的情况。当短缓存过期时,先从长缓存中获取数据,然后再去查询数据库并更新两个缓存。

   缓存雪崩

缓存雪崩是指在缓存中存储的大量数据同时失效或过期,导致缓存系统无法承载大量请求压力,造成服务宕机甚至瘫痪的情况。这种情况下,大量的请求会直接涌入数据库,导致数据库崩溃或响应缓慢,影响应用程序的正常使用。

原因

缓存雪崩通常由于以下几个原因引起:

  1. 缓存过期策略:如果大量的缓存数据被设置为相同的过期时间,那么在这些数据同时过期时,就会引发缓存雪崩。
  2. 缓存服务器故障:当缓存服务器(如Redis)宕机或网络中断时,缓存服务将不可用,所有请求都会直接打到数据库上。
  3. 大量突发请求:在特定时间段内,如果请求量激增且超出缓存系统的处理能力,也可能导致缓存雪崩。

 影响

缓存雪崩的影响是灾难性的,主要包括以下几个方面:

  1. 数据库负载过高:大量的请求直接打到数据库上,导致数据库负载急剧增加,响应时间延长。
  2. 服务不可用:在极端情况下,数据库可能因为压力过大而崩溃,导致整个服务不可用。
  3. 性能瓶颈:数据库成为瓶颈,系统整体处理能力下降,用户体验受到严重影响。
  4. 连锁反应:由于服务间的依赖关系,缓存雪崩可能导致多个服务相继瘫痪,形成连锁反应。

 解决方案

为了防范和应对缓存雪崩,可以采取以下策略:

  1. 设置随机过期时间:为不同的缓存数据设置随机的过期时间,避免大量数据同时过期。
  2. 限流和熔断:当检测到缓存系统压力过大时,通过限流组件限制请求量,并在必要时采取熔断措施,如返回默认数据或静态页面。
  3. 主动更新缓存:在缓存失效前,主动提前重新加载数据至缓存,以减轻数据库压力。
  4. 加锁机制:当缓存失效后,通过加锁机制控制只有一个线程负责从数据库加载数据并回填缓存,其他线程等待或返回旧数据。
  5. 部署缓存集群:部署Redis Sentinel或Cluster集群等缓存集群方案,确保单点故障时能自动切换到其他节点。
  6. 使用布隆过滤器:在缓存之前使用布隆过滤器判断请求的键是否存在,减少对数据库的无效访问。

                                         缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。给数据库带来巨大压力

常见的解决方案有两种:

缓存空对象

  • 优点:实现简单,维护方便
  • 缺点:额外的内存消耗    可能造成短期的不一致

布隆过滤

优点:内存占用较少,没有多余key

缺点:实现复杂      存在误判可能

还有的解决方案:主动性的方案

  • 增强id的复杂性,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

  防止缓存穿透->空值缓存案例

public Shop queryWithPassThrough(Long id) {String key = CACHE_SHOP_KEY + id;Map<Object, Object> shopFromCache = stringRedisTemplate.opsForHash().entries(key);System.out.println("Redis: " + shopFromCache);// 检查 Redis 返回的 shopFromCache 是否为 nullif (shopFromCache != null && !shopFromCache.isEmpty()) {// 缓存中有值,尝试反序列化 Shop 对象Shop shopFromCacheBean = BeanUtil.fillBeanWithMap(shopFromCache, new Shop(), false);return shopFromCacheBean;}// Redis 中不存在,从数据库中查询Shop shopFromDb = baseMapper.selectById(id);// 数据库中也不存在,则缓存空值以防缓存穿透if (ObjectUtil.isNull(shopFromDb)) {stringRedisTemplate.opsForHash().put(key, CACHE_SHOP_EMPTY_KEY, CACHE_SHOP_EMPTY_VALUE); // 使用特殊标记表示空值stringRedisTemplate.expire(key, RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);return null;}// 将 Shop 对象转换为 Map 并写入 RedisMap<String, Object> shopMap = BeanUtil.beanToMap(shopFromDb, new HashMap<>(),CopyOptions.create().ignoreNullValue().setFieldValueEditor((fieldName, fieldValue) -> fieldValue != null ? fieldValue.toString() : null));stringRedisTemplate.opsForHash().putAll(key, shopMap);// 设置超时时间stringRedisTemplate.expire(key, RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);return shopFromDb;
}

                 缓存击穿                       

缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击

解决方案 优点 缺点

互斥锁 没有额外的内存消耗 线程需要等待,性能受影响

保证一致性 可能有死锁风险

实现简单

逻辑过期 线程无需等待,性能较好 不保证一致性

有额外内存消耗

实现复杂

使用互斥锁解决缓存击穿

@Overridepublic Result queryById(Long id) throws InterruptedException {// 缓存穿透
//            queryWithPassThrough(id);// 互斥锁解决缓存击穿Shop shop = queryWithMutex(id);if (shop==null) {return Result.fail("商品不存在");}return Result.ok(shop);}public Shop queryWithMutex(Long id) throws InterruptedException {String key = CACHE_SHOP_KEY + id;Map<Object, Object> shopFromCache = stringRedisTemplate.opsForHash().entries(key);System.out.println("Redis: " + shopFromCache);// 检查 Redis 返回的 shopFromCache 是否为 nullif (shopFromCache != null && !shopFromCache.isEmpty()) {// 缓存中有值,尝试反序列化 Shop 对象Shop shopFromCacheBean = BeanUtil.fillBeanWithMap(shopFromCache, new Shop(), false);return shopFromCacheBean;}// Redis 中不存在,从数据库中查询// 4.实现缓存重建// 4.1获取互斥锁// 4.2获取失败,休眠然后重试// 4.3获取成功,返回数据,释放锁Shop shopFromDb=null;try {boolean isLock = tryLock(LOCK_SHOP_KEY + id);if (!isLock) {// 拿不到锁,休眠,然后递归不断尝试// 这个返回结果会是在redis里拿到的数据Thread.sleep(50);return queryWithMutex(id);}// 拿到互斥锁,查询数据库,重建缓存shopFromDb= baseMapper.selectById(id);
//            模拟重建延迟Thread.sleep(200);// 数据库中也不存在,则缓存空值以防缓存穿透stringRedisTemplate.opsForHash().put(key, CACHE_SHOP_EMPTY_KEY, CACHE_SHOP_EMPTY_VALUE); // 使用特殊标记表示空值stringRedisTemplate.expire(key, RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);return null;}// 将 Shop 对象转换为 Map 并写入 RedisMap<String, Object> shopMap = BeanUtil.beanToMap(shopFromDb, new HashMap<>(),CopyOptions.create().ignoreNullValue().setFieldValueEditor((fieldName, fieldValue) -> fieldValue != null ? fieldValue.toString() : null));stringRedisTemplate.opsForHash().putAll(key, shopMap);// 设置超时时间stringRedisTemplate.expire(key, RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {// 释放锁unLock(LOCK_SHOP_KEY + id);}return shopFromDb;}
public   boolean tryLock(String key) {Boolean b = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS);return BooleanUtil.isTrue(b);
}public   void unLock(String key) {stringRedisTemplate.delete(key);
}

相关文章:

缓存穿透,缓存击穿,缓存雪崩

目录 介绍 缓存穿透 缓存击穿 缓存雪崩 原因 影响 解决方案 缓存穿透 防止缓存穿透->空值缓存案例 缓存击穿 使用互斥锁解决缓存击穿 介绍 缓存穿透 定义&#xff1a;缓存穿透是指用户查询数据&#xff0c;缓存和数据库中都不存在该数据&#xff08;一般是发起恶意…...

运维 | 清理 Linux 磁盘空间方法汇总

清理 Linux 磁盘空间方法汇总 前言 系统磁盘不够用或占满了&#xff0c;导致部分应用或程序无法正常使用。 本章节将记录一些常用或常见的方法清理系统磁盘&#xff08;持续更新中&#xff09;。 常见操作 查看磁盘使用情况 cd / df -Th查找大文件和目录&#xff08;根目…...

googleTest 源码主线框架性分析——TDD 01

TDD&#xff0c;测试驱动开发&#xff0c;英文全称Test-Driven Development&#xff0c;简称TDD&#xff0c;是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码&#xff0c;然后只编写使测试通过的功能代码&#xff0c;通过测试来推…...

Python:对常见报错导致的崩溃的处理

Python的注释&#xff1a; mac用cmd/即可 # 注释内容 代码正常运行会报以0退出&#xff0c;如果是1&#xff0c;则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字&#xff0c;程序会崩溃&#xff0c;也就是破坏了程序&#xff0c;终止运行 解决方案&#xf…...

linux系统进程占cpu 100%解决步骤

1.查找进程 ps aux 查看指定进程: ps aux | grep process_name2.根据进程查找对应的主进程 pstree -p | grep process_name 3.查看主进程目录并删除 ps -axu | grep process_name rm -rf /usr/bin/2cbbb...

数据传输安全--IPSEC

目录 IPSEC IPSEC可以提供的安全服务 IPSEC 协议簇 两种工作模式 传输模式 隧道模式 两个通信保护协议&#xff08;两个安全协议&#xff09; AH&#xff08;鉴别头协议&#xff09; 可以提供的安全服务 报头 安全索引参数SPI 序列号 认证数据 AH保护范围 传输模…...

Unity XR Interaction Toolkit的安装(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、安装1.打开unity项目2.打开包管理器&#xff08;PackageManage&#xff09;3.导入Input System依赖包4.Interaction Layers unity设置总结 前言 安装前请注意&#xff1a;需要…...

什么是PCB流锡槽焊盘/C型焊盘,如何设计?-捷配笔记

在PCB进行机器组装器件时&#xff08;如波峰焊&#xff09;&#xff0c;为了防止部分需要二次焊接的元器件的焊盘堵孔&#xff0c;就需要在PCB焊盘上面开个过锡槽&#xff0c;以便过波峰焊时&#xff0c;这些焊锡会流掉。开流锡槽就是在焊盘裸铜&#xff08;敷锡&#xff09;部…...

电缆故障精准定位系统

简介 电缆故障精准定位系统应用于35~500kV电压等级电缆线路故障精准定位与故障识别。基于百兆高速采样、北斗高精度授时、信号相位误差精确校准等 先进技术的应用&#xff0c;其定位精度小于5米&#xff0c;业内领先。 基于人工智能深度学习算法核心模块可自动、 快速进行故障…...

Google Chrome 浏览器在链接上点右键的快捷键

如今&#xff0c;越来越多的软件都懒得设个快捷键&#xff0c;就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)...

Redis在SpringBoot中遇到的问题:预热,雪崩,击穿,穿透

缓存预热 预热即在产品上线前&#xff0c;先对产品进行访问或者对产品的Redis中存储数据。 原因&#xff1a; 1. 请求数量较高 2. 主从之间数据吞吐量较大&#xff0c;数据同步操作频度较高,因为刚刚启动时&#xff0c;缓存中没有任何数据 解决方法&#xff1a; 1. 使用脚…...

Pytorch 6

罗切斯特回归模型 加了激活函数 加了激活函数之后类 class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear torch.nn.Linear(1,1)def forward(self, x):# y_pred F.sigmoid(self.linear(x))y_p…...

iterator(迭代器模式)

引入 在想显示数组当中所有元素时&#xff0c;我们往往会使用下面的for循环语句来遍历数组 #include <iostream> #include <vector>int main() {std::vector<int> v({ 1, 2, 3 });for (int i 0; i < v.size(); i){std::cout << v[i] << &q…...

使用Web控制端和轻量级客户端构建的开放Web应用防火墙(OpenWAF)

目录 1. 简介2. 项目结构3. Web控制端3.1. 功能概述3.2. 审计&#xff08;攻击&#xff09;日志查看3.3. 多个WAF的集中监控和操作3.4. 使用socket进行封装3.5. 日志的高效存储和检索&#xff08;Redis&#xff09; 4. 轻量级客户端4.1. 功能概述4.2. 对Web程序的防护4.3. 网络…...

设计模式在FileBrowser中的几个应用

设计模式是代码重构的最终目标&#xff0c;在程序设计中有效的运用这项技术&#xff0c;可以大大提高代码的可读性和可维护性。使整个程序设计结构趋向精致完美。在我维护的FileBrowser模块中可以针对以下方面 应用相应的模式。 1. 使用策略模式来处理文件夹扫描操作 作为网…...

【JavaEE进阶】——Spring AOP

目录 &#x1f6a9;Spring AOP概述 &#x1f6a9;Spring AOP快速⼊⻔ &#x1f393;引入AOP依赖 &#x1f393;编写AOP程序 &#x1f6a9;Spring AOP 详解 &#x1f393;Spring AOP核⼼概念 &#x1f393;通知类型 &#x1f393;PointCut &#x1f393;切⾯优先级 Ord…...

Python - conda使用大全

如何使用Conda&#xff1f; 环境 创建环境 conda create -n spider_env python3.10.11查看环境 conda env listconda info -e激活环境 conda activate spider_env退出环境 conda deactivate删除环境 conda env remove -n spider_env包 导出包 说明&#xff1a;导出当前虚拟…...

ASPICE在汽车软件开发中的作用

ASPICE是一个专门为汽车软件开发过程而设计的评估和改进框架。它基于ISO/IEC 15504标准&#xff0c;为汽车供应商提供了一个评估和改进其软件开发流程的方法。ASPICE的目标是确保软件开发过程的一致性和可预测性&#xff0c;从而提高软件的质量和可靠性。 ASPICE的实施对汽车软…...

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全&#xff0c;将于7月25日本周四在北京富力万丽酒店揭幕...

Lottie:动态动画的魔法棒

文章目录 引言官网链接Lottie 的原理基础使用1. 导出动画2. 引入 Lottie 库3. 加载和播放动画 高级使用1. 动画控制2. 交互性3. 自定义动画例子&#xff1a;交互式按钮动画 优缺点优点缺点 结语 引言 Lottie 是 Airbnb 开源的一个动画库&#xff0c;它允许设计师在 Adobe Afte…...

IPython使用技巧整理

IPython 是一个增强的 Python 交互式 shell&#xff0c;它提供了许多便利的功能&#xff0c;比如自动补全、魔术命令、对象内省等。以下是 IPython 的一些使用技巧和示例&#xff0c;结合您提供的列表数据&#xff0c;我将给出一些相关的使用示例。 1. 自动补全&#xff08;Tab…...

C#数组复习

一、一维数组 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ShuZu : MonoBehaviour {#region 知识点一 基本概念//数组是存储一组相同类型数据的集合//数组分为 一维、二维、交错数组//一般情况 一维数组 就简称为数组#en…...

无人机之在农业上的用途

随着无人机技术的发展&#xff0c;农业现代化也迎来了崭新局面&#xff0c;田间随处可见无人机矫健的身影。当农业遇上科技&#xff0c;变革正悄然进行。农业无人机主要应用于农业、种植业、林业等行业。在使用过程中&#xff0c;其功能和作用并不单一&#xff0c;一般用于种植…...

opengaussdb在oepnEuler上安装

安装前提&#xff1a; 软件环境&#xff1a;openEuler 20.03LTS 个人开发者最低配置2核4G&#xff0c;推荐配置4核8G 数据库版本&#xff1a;openGauss-5.0.2-openEuler-64bit-all.tar.gz 数据库下载地址&#xff1a; https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/In…...

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合...

Linux系统编程-文件系统

目录 什么是Linux文件系统 文件系统的职责 存储介质抽象 inode&#xff1a;文件系统的核心 文件分配策略 目录结构 文件系统布局 日志和恢复机制 目录权限 粘滞位(t位)&#xff1a; 硬链接和符号链接 硬链接的特点&#xff1a; 创建硬链接&#xff1a; 符号链接的…...

【解决】ubuntu20.04 root用户无法SSH登陆问题

Ubuntu root用户无法登录的问题通常可以通过修改‌SSH配置文件和系统登录配置来解决。 修改SSH配置文件 sudo vim /etc/ssh/sshd_config 找到 PermitRootLogin 设置&#xff0c;并将其值更改为 yes 以允许root用户通过SSH登录 保存并关闭文件之后&#xff0c;需要重启SSH服务…...

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…...

【JVM基础05】——组成-能不能解释一下方法区?

目录 1- 引言&#xff1a;方法区概述1-1 方法区是什么&#xff1f;(What)1-2 为什么用方法区&#xff1f;方法区的作用 (Why) 2- ⭐核心&#xff1a;详解方法区(How)2-1 能不能解释一下方法区&#xff1f;2-2 元空间内存溢出问题2-3 什么是常量池&#xff1f;2-4 运行时常量池 …...

前端:Vue学习-3

前端&#xff1a;Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容&#xff08;默认值&#xff09;2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…...