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

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案


本文是对 Redis 知识的补充,在了解了如何搭建多种类型的 Redis 集群,并清楚了 Redis 集群搭建的过程的原理和注意事项之后,就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。


引言:虽然 Redis 是单线程的,但它可以通过使用非阻塞 I/O 去高效地处理大量并发连接。具有事件驱动机制,可以基于事件循环机制,达到快速响应各种请求。另外,在 Redis 6.0 引入了多线程 I/O,可以利用多核 CPU 提高网络 I/O 的效率,是市面上高效的 NoSQL 缓存组件。尤其是在分布式系统中,Redis 缓存经常被用来减轻数据库的负载,提高系统的响应速度。

在具有高并发的项目环境或者秒杀环境等,前台会产生超量的请求到缓存或者数据库或者项目突然出现攻击,攻击者对某一个缓存键发起大量请求,或者缓存中不存在的数据直接命中数据库等情况。这些情况必定会导致系统性能下降,甚至完全崩溃。下面就常见的三个问题作解释。

文章目录

    • 一、什么是缓存雪崩?
    • 二、怎么解决缓存雪崩
      • 1、缓存预热(主要)
      • 2、过期时间错峰(主要)
      • 3、加锁控制对某个缓存的读线程数量
      • 4、设置二级缓存
      • 5、设置合理的 Redis 集群
      • 6、降级限流
    • 三、什么是缓存穿透?
    • 四、怎么解决缓存穿透
      • 1、缓存空值(主要)
      • 2、布隆过滤器(主要)
      • 3、增强数据的合法性校验(主要)
      • 4、使用分布式锁
      • 5、限流和熔断
      • 6、设置热点数据永不过期
      • 7、二级缓存
    • 五、什么是缓存击穿?
    • 六、怎么解决缓存击穿
      • 1、设置热点数据过期时间
      • 2、使用布隆过滤器
      • 3、使用互斥锁(分布式锁)
      • 4、使用逻辑过期
      • 5、本地缓存和Redis缓存(二级缓存)
    • 七、总结

一、什么是缓存雪崩?

缓存雪崩是指大量缓存数据在同一时间段失效,导致所有请求都涌向数据库,引发数据库崩溃,或者 Redis 宕机导致缓存系统失效。

这个问题的触发是具有条件性的,这个请况的出现原因在于高并发访问时,Redis 创建缓存时每一秒接收到的数据量大,同时这批数据又设置了相同的过期时间,导致的大量缓存数据在同一时间段失效。

所造成的危害就是数据库瞬间承载大量压力,可能直接导致数据库崩溃,系统性能急剧下降,用户体验变差。

缓存雪崩

二、怎么解决缓存雪崩

那如何避免或者解决这种情况呢?上述情况通常可以分为以下几种,我们要做多种措施,保证不会出现缓存雪崩的情况。

1、缓存预热(主要)

Redis 启动时是没有缓存任何数据的,在后续的时间就可能面临大量热点数据的请求,这时没有相应缓存,会全部命中数据库,造成数据库性能出现问题。这个的解决办法一般是 缓存预热

缓存预热就是系统上线时提前将相关的缓存数据直接加载到缓存系统,而不是等到用户请求的时候才将查询数据缓存,这样用户可直接查询事先被预热的数据。这样部署项目一般都在不常访问的时间段,提前缓存热点数据,在后续的时间就不会面临大量访问数据库的情况。

2、过期时间错峰(主要)

缓存预热并不能根本解决问题,在 新热点数据 出现时还是会出现缓存雪崩,例如某些黑料的出现等,这时就需要探究缓存大批失效的根本能问题。

热点数据同时失效的根本原因在于创建缓存时设置的过期时间是固定的,这种方式就会造成一批生成、一批失效。同一批创建的缓存可以 在固定的过期时间加上一个时间的随机值 ,按照项目要求设置随机值范围,就可以避免同时失效。

3、加锁控制对某个缓存的读线程数量

在缓存失效后,通过加锁或者队列的方式,来控制读数据库和写缓存的线程数量,例如对于某个 Key ,只允许一个线程查询数据和写缓存,其他线程等待。

4、设置二级缓存

设置二级缓存或者双缓存策略,A1为原始缓存,A2为拷贝缓存,A1失效后可以访问A2,A1缓存失效的时间可以设置短期,A2缓存可以设置为长期。其中A2可以是热点缓存,将A1中的热点缓存记录并放入A2,应对突发情况。

5、设置合理的 Redis 集群

使用高可用架构,根据自己系统的业务能力,合理设计Redis集群,例如:

  • 小型系统就是用一主一从的集群架构。
  • 对实时性要求不高并且有一定并发问题的系统就使用一主多从的集群架构。
  • 对于实时性要求高,存在高并发的系统使用多主多从的集群架构。

不同的集群架构会合理使用主从复制功能和哨兵模式来避免单点故障和因某个主节点崩溃而导致的系统问题。

6、降级限流

对于出现缓存雪崩后的补救措施可以使用服务降级和请求限流等机制进行补救。服务降级的最终目的就是保证核心服务可用,即使是有损的。服务降级应当提前确定好哪些服务是可降级的,不同情况下不同的服务的优先级也不同。

具体做法可以拒接服务,延迟服务和随即提供服务,或者说禁用某些功能或者禁用某些功能模块。

三、什么是缓存穿透?

缓存穿透是指客户端查询一个缓存中不存在的键,由于缓存中无数据,无法命中,所以每次查询都会直接访问数据库,并且数据库中也没有数据,这样就导致缓存一直无法生效,从而导致数据库负载增加,产生压力过大的情况。

缓存穿透

用户第一次请求,缓存没数据就会触发写缓存操作,第二次请求就会命中缓存。这种问题造成的危害是数据库负载增加,可能引发性能问题,恶意请求可能频繁访问数据库,导致资源浪费。例如如发起为 id-1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

四、怎么解决缓存穿透

1、缓存空值(主要)

顾名思义,就是收到一个查询后,发现缓存和数据库都没有要查询的数据,这时就将查询的数据以 null 值缓存到 Redis 中。

具体来说,当客户端访问数据时,先请求 Redis,但 Redis 中没有数据,这时会访问数据库,但是数据库中也没有数据。因此这个数据穿透了缓存,直击数据库,并且这种状态下该数据还无法生成缓存。

如果大量的请求同时访问这种不存在的数据,那么这些请求就都会访问到数据库,由于数据库能够承载的并发不如 Redis ,就会出现数据库性能出现问题。

解决方案对于数据库中不存在的数据如果被查询到了,就把这个数据存入到 Redis 缓存中去,下次用户过来访问这个不存在的数据,就能在 Redis 缓存中找到。

这种方式也会产生问题,面临大量的恶意请求,会导致缓存逐渐增加,进而影响服务性能,另外,如果该数据被写入到数据库中,缓存还是null值,会造成数据的短期不一致。

2、布隆过滤器(主要)

布隆过滤器是一种基于哈希算法的数据结构,用于快速判断一个元素是否存在于一个集合中。在请求到达缓存之前,先通过布隆过滤器判断该请求是否合法。如果布隆过滤器判断该请求不存在,则直接返回,避免查询数据库。

布隆过滤器的大致原理:布隆过滤器中存放二进制位,数据库的数据通过哈希算法计算其哈希值并存放到布隆过滤器中,后面判断该数据是否存在的时候,就是查找该数据的哈希值是 0 还是 1 。这是一种概率上的统计,能够保证该数据被判断不存在的时候就一定是不存在,被判断存在的时候不一定存在,存在一定的穿透风险。

优点是内存占用较少,适合处理大规模数据,Redis 缓存中也不会存储多余的键。但是实现相对复杂,并且存在一定的误判率,但可以通过调整布隆过滤器的参数来降低误判率。

3、增强数据的合法性校验(主要)

在请求到达缓存和数据库之前,增加对请求参数的合法性校验。例如,对于用户ID的请求,可以校验ID是否符合预期的格式或范围。如果参数不合法,则直接返回错误,避免不必要的查询。

4、使用分布式锁

在缓存穿透的场景下,当多个请求同时发现缓存中没有数据时,可以使用分布式锁(如 Redis 的 SETNX 命令)来确保只有一个请求去数据库查询数据并更新缓存,其他请求等待锁释放后直接从缓存获取数据。

5、限流和熔断

对于高频请求,可以采用限流策略,限制单位时间内对某个接口的访问次数。当请求量超过阈值时,直接返回错误或排队等待。此外,还可以结合熔断机制,在缓存穿透导致数据库压力过大时,暂时停止对数据库的访问。

6、设置热点数据永不过期

对于一些热点数据(如热门商品信息),可以设置其缓存永不过期,或者通过后台线程定期更新缓存。这样可以避免因缓存过期而导致的缓存穿透问题。

7、二级缓存

也可以采用缓存雪崩中的二级缓存解决办法,A1为原始缓存,A2为拷贝缓存,A1失效后可以访问A2,A1缓存失效的时间可以设置短期,A2缓存可以设置为长期。其中A2可以是热点缓存,将A1中的热点缓存记录并放入A2,应对突发情况。

不同的解决方案适用于不同的场景,可以根据实际需求选择合适的方法。例如,对于小规模应用,缓存空对象或增强数据校验可能足够;而对于大规模高并发系统,布隆过滤器或分布式锁可能是更好的选择。

五、什么是缓存击穿?

缓存击穿,是指一个 Key 在不停地支撑着高并发,高并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的高并发就穿破缓存,直接请求数据库。缓存击穿和缓存雪崩的区别在于缓存击穿是针对某一个 Key 缓存而盲,缓存雪崩则是针对很多 Key。

缓存击穿

六、怎么解决缓存击穿

首先要知道缓存击穿出现的场景,才好使用对应的解决方案,缓存击穿是指一个 Key 在不停地支撑着高并发,高并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的高并发就穿破缓存,直接请求数据库。

对一般的网站而言,很难有一个 Key 能达到缓存击穿的级别,一般是热门网站的秒杀或爆款商品,才有可能发生这种情况。当发生缓存击穿时,在这个 Key 没有被重新加载到缓存之前,或者过期时间超过抢购时段时是一种很好的避免发生缓存击穿的方法,这时这种可以不需要考虑数据一致性的问题的话。

1、设置热点数据过期时间

首先在秒杀环境中,设置 Key 的过期时间超过秒杀的时间是最好的一种办法,或者对于热点数据,可以设置其缓存永不过期,通过后台线程定期更新缓存。这就不会出现缓存击穿的情况,但是可能会出现数据不一致问题。

// 设置热点数据永不过期
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(data));// 后台线程定期更新缓存
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {Object newData = queryDatabase(key);setCache(key, newData);
}, 0, 10, TimeUnit.MINUTES);

2、使用布隆过滤器

布隆过滤器是用于快速判断一个元素是否存在于一个集合中。首先初始化布隆过滤器,将所有可能的Key加入布隆过滤器,在请求到达缓存之前,先通过布隆过滤器判断该请求是否合法。如果布隆过滤器判断该请求不存在,则直接返回,避免查询数据库。在缓存穿透的解决方案中也推荐过这种方法。

// 初始化布隆过滤器
BloomFilter<String> bloomFilter = new BloomFilter<>(100000, 0.01);
bloomFilter.add("hotKey1");
bloomFilter.add("hotKey2");// 查询缓存
if (!bloomFilter.contains(key)) {return null; // Key不存在,直接返回
}
String json = stringRedisTemplate.opsForValue().get(key);
if (StrUtil.isNotBlank(json)) {return JSONUtil.toBean(json, type);
}

3、使用互斥锁(分布式锁)

在查询缓存时,如果发现缓存失效,尝试获取分布式锁。通过分布式锁(如Redis的SETNX命令)确保只有一个线程去查询数据库并更新缓存,其他线程等待锁释放后直接从缓存获取数据。如果获取锁成功,则查询数据库并更新缓存。如果获取锁失败,则等待锁释放后再次查询缓存。

String lockKey = "lock:" + key;
boolean isLock = tryLock(lockKey);
if (isLock) {// 查询数据库并更新缓存Object data = queryDatabase(key);setCache(key, data);
} else {// 等待锁释放后再次查询缓存Thread.sleep(50);return queryCache(key);
}

4、使用逻辑过期

逻辑过期是指在缓存中存储数据时,将数据和过期时间一起存储。当查询缓存时,先检查数据是否过期,如果未过期,直接返回数据,如果已过期,启动独立线程去更新缓存,同时返回旧数据。这样做的优点在于即使缓存已过期,也可以先返回旧数据。

@Data
public class RedisData {private LocalDateTime expireTime;private Object data;
}// 查询缓存
String json = stringRedisTemplate.opsForValue().get(key);
if (StrUtil.isNotBlank(json)) {RedisData redisData = JSONUtil.toBean(json, RedisData.class);if (redisData.getExpireTime().isAfter(LocalDateTime.now())) {return redisData.getData();} else {// 启动独立线程更新缓存CACHE_REBUILD_EXECUTOR.submit(() -> {try {Object newData = queryDatabase(key);setCacheWithLogicalExpire(key, newData, expireTime);} catch (Exception e) {throw new RuntimeException(e);}});return redisData.getData(); // 返回旧数据}
}

5、本地缓存和Redis缓存(二级缓存)

采用多级缓存架构,在本地缓存中存储热点数据,先查询本地缓存,如果本地缓存失效,则查询Redis缓存。

// 查询本地缓存
Object data = localCache.get(key);
if (data == null) {// 查询Redis缓存String json = stringRedisTemplate.opsForValue().get(key);if (StrUtil.isNotBlank(json)) {data = JSONUtil.toBean(json, type);localCache.put(key, data); // 更新本地缓存}
}
return data;

不同的解决方案适用于不同的场景,可以根据实际需求选择合适的方法。

  • 互斥锁适用于缓存失效时需要保护数据库的场景。
  • 逻辑过期适用于需要快速返回数据且对数据实时性要求不高的场景。
  • 热点数据永不过期适用于热点数据频繁访问的场景。
  • 布隆过滤器适用于数据量大且需要快速判断Key是否存在的场景。
  • 多级缓存适用于需要进一步减轻数据库压力的场景。

七、总结

看到最后的读者也明白了,缓存雪崩、缓存穿透和缓存击穿出现的场景各有不同,但是解决办法都是存在一定的共同点,相似的解决方案基本都是辅助解决问题,而对于不同场景独特的解决方案才是解决该问题的核心。在各种解决方案中,大家一定要注意数据的实时性和一致性,在保障了这两个前提下才能更好的解决问题,实现高可用的系统。

相关文章:

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案

本文是对 Redis 知识的补充&#xff0c;在了解了如何搭建多种类型的 Redis 集群&#xff0c;并清楚了 Redis 集群搭建的过程的原理和注意事项之后&#xff0c;就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言&#xff1a;虽然 Redis 是单线程的&#xf…...

DevOps工具链概述

1. DevOps工具链概述 1.1 DevOps工具链的定义 DevOps工具链是支持DevOps实践的一系列工具的集合&#xff0c;这些工具覆盖了软件开发的整个生命周期&#xff0c;包括需求管理、开发、测试、部署和运维等各个环节。它旨在通过工具的集成和自动化&#xff0c;打破开发与运维之间…...

开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~

Stable diffusion介绍&#xff1a; “StableDiffusion是一款创新的AI工具&#xff0c;将原始文本转化为精美图像。用户可调整图像的细节、风格、明暗等参数&#xff0c;创建个性化的高质量图像。这款高效的绘图工具便利了建筑、设计和插画等行业的专业人士&#xff0c;满足了他…...

LVS 负载均衡集群(DR 模式)

一、LVS-DR 模式核心原理 1.1. DR 模式工作原理 LVS-DR&#xff08;Direct Routing&#xff09;模式通过 数据链路层&#xff08;MAC 层&#xff09; 实现负载均衡&#xff0c;其核心特点是 请求流量经过 Director&#xff0c;响应流量由 Real Server 直接返回客户端&#xf…...

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…...

网页五子棋——通用模块

目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目&#xff0c;并引入相关依赖&#xff1a; 配置 MyBatis&#xff1a; 编辑 application.yml&#xff1a; spring:datasource: # 数据库连接配…...

FastAPI 高并发与性能优化

FastAPI 高并发与性能优化 目录 &#x1f680; 高并发应用设计原则&#x1f9d1;‍&#x1f4bb; 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序&#x1f512; 高并发中的共享资源与线程安全问题 1. &#x1f680; 高并发应用设计原则 在构建高并发应…...

阿里云IOT消息处理

文章主要讲述了阿里云IOT平台如何处理设备上报的消息、如何将消息路由到不同的处理逻辑、如何进行消息转发与转换等操作。 一、接收IOT消息 1.创建订阅 2.案列代码 官网案例代码&#xff1a;如何将AMQP JMS客户端接入物联网平台接收消息_物联网平台(IoT)-阿里云帮助中心 代码…...

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…...

如何在VSCode中免费使用DeepSeek R1:本地大模型编程助手全攻略

目录 一、DeepSeek R1为何值得开发者关注? 1.1 开源的推理王者 1.2 性能实测对比 二、三步搭建本地AI编程环境 2.1 硬件准备指南 2.2 三大部署方案详解 方案一:LM Studio(新手友好) 方案二:Ollama(Docker玩家首选) 方案三:Jan(跨平台利器) 2.3 常见报错解决…...

ECCV2022 | LGV | LGV:利用大几何邻域提升对抗样本的可迁移性

LGV: Boosting Adversarial Example Transferability from Large Geometric Vicinity 摘要-Abstract引言-Introduction实验设置-Experimental SettingsLGV: 源于大几何邻域的迁移性-LGV: Transferability from Large Geometric Vicinity研究LGV特性&#xff1a;损失几何的重要性…...

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…...

麒麟操作系统-rabbitmq二进制安装

1、通过官网下载https://www.rabbitmq.com/ 官网网址&#xff1a;https://www.rabbitmq.com 首先下载erlang-23.3.4.11-1.el7.x86_64.rpm&#xff0c;其次下载rabbitmq-server-3.10.0-1.el7.noarch.rpm 2、安装erlang yum install -y erlang-23.3.4.11-1.el7.x86_64.rpm 3、…...

说说平衡树的基本实现,与红黑树的区别是什么

说说平衡树的基本实现&#xff0c;与红黑树的区别是什么 平衡树是一种能够在插入、删除和查找操作中保持平衡的二叉搜索树。其目的是确保树的高度在一定范围内&#xff0c;防止出现极端情况&#xff08;如链表化&#xff09;&#xff0c;以便提高操作效率。常见的平衡树有 AVL …...

uniapp实现首行首列冻结效果

uniapp首行首列冻结 <template><view class"height800 flex-column absolute bgc-withe"><!-- 第一行 --><view class"flex diy-header"><view class"box">时间</view><scroll-view id"1" ena…...

MySQL单表存多大的数据量比较合适

前言 经常使用MySQL数据库的小伙伴都知道&#xff0c;当单表数据量达到一定的规模以后&#xff0c;查询性能就会显著降低。因此&#xff0c;当单表数据量过大时&#xff0c;我们往往要考虑进行分库分表。那么如何计算单表存储多大的数据量合适&#xff1f;当单表数据达到多大的…...

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以&#xff1a; 0. 首先下载鸿蒙字体&#xff1a; 鸿蒙资源 下载后解压&#xff0c;发现里面有几个文件夹&#xff1a; 字体名称说明Sans默认的鸿蒙字体&#xff0c;支持基本的多语言字符&#xff08;包括字…...

SiliconCloud 支持deepseek,送2000w token

SiliconCloud SiliconCloud 邀请奖励持续进行&#xff0c;2000 万 Tokens 送不停&#xff01; 邀请好友赚 2000 万 Tokens&#xff1a;每成功邀请一位新用户通过手机号码注册&#xff0c;您将获得 2000 万 Tokens&#xff1b;注册即送 2000 万 Tokens&#xff1a;受邀好友作为…...

从零开始设计一个完整的网站:HTML、CSS、PHP、MySQL 和 JavaScript 实战教程

前言 本文将从实战角度出发&#xff0c;带你一步步设计一个完整的网站。我们将从 静态网页 开始&#xff0c;然后加入 动态功能&#xff08;使用 PHP&#xff09;&#xff0c;连接 数据库&#xff0c;最后加入 JavaScript 实现交互功能。通过这个教程&#xff0c;你将掌握一个…...

【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅

目录 一、TensorFlow 简介1.1 定义与背景1.2 特点 二、Python 3 与 TensorFlow 的关系2.1 版本对应2.2 为何选择 Python 3 三、安装 TensorFlow3.1 安装步骤3.2 验证安装 四、TensorFlow 基本概念与使用方法4.1 计算图&#xff08;Graph&#xff09;4.2 会话&#xff08;Sessio…...

CMakeLists使用

1.预定义宏 宏 功能 PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录&#xff0c;一般是工程的根目录 PROJECT_BINARY_DIR 执行cmake命令的目录 CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径…...

P7201 [COCI 2019/2020 #1] Džumbus

题目背景 Marin 是一个心地善良的人,因此他将为他的 N 个朋友组织 Q 次宴会。宴会上唯一的饮料被称为 džumbus。 每位朋友对这种饮料的需求量是已知的。在这些朋友中,有 M 组朋友。每一组中的两位在同时满足他们各自的需求量后,将开始互相核对自己对往届 COCI 题目的答案…...

网络性能测试工具ipref

文章目录 一、ipref的介绍二、iperf安装配置三、iperf使用四、iperf常见故障处理 一、ipref的介绍 ipref是一种常用的网络性能测试工具&#xff0c;用于评估网络带宽、延迟和吞吐量等性能指标。它通过在客户端和服务器之间发送数据流来测量网络的性能&#xff0c;可以帮助管理…...

C# Dictionary的实现原理

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个基于哈希表&#xff08;Hash Table&#xff09;实现的键值对集合。它提供了高效的插入、删除和查找操作&#xff0c;平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理&#xff1a; 1. Dictionary 的核心数…...

在项目中操作 MySQL

在现代Web开发中&#xff0c;Node.js因其非阻塞I/O模型和高效的性能成为了构建后端服务的热门选择之一。与此同时&#xff0c;MySQL作为最流行的关系型数据库管理系统之一&#xff0c;凭借其稳定性、可靠性和易用性&#xff0c;在数据存储方面扮演着重要角色。本文将详细介绍如…...

第6章 6.4 ASP.NET Core Web API各种技术及选择

6.4.1 控制器父类用哪个 6.2小节和6.3小节所演示的ASP.NET Core Web API 的控制器类都继承自ControllerBase&#xff0c;而6.1中MVC的控制器继承自Controller&#xff0c;Controller又继承自ControllerBase。 所以&#xff0c;一般情况下&#xff0c;编写的WebAPI控制器类继承…...

DeepSeek本地化部署【window下安装】【linux下安装】

一、window 本地安装指导 1.1、下载window安装包 https://ollama.com/download/OllamaSetup.exe 1.2、点击下载好的安装包进行安装 检测安装是否成功&#xff1a; C:\Users\admin>ollama -v ollama version is 0.5.7有上面的输出&#xff0c;则证明已经安装成功。 配置…...

字玩FontPlayer开发笔记14 Vue3实现多边形工具

目录 字玩FontPlayer开发笔记14 Vue3实现多边形工具笔记整体流程临时变量多边形组件数据结构初始化多边形工具mousedown事件mousemove事件监听mouseup事件渲染控件将多边形转换为平滑的钢笔路径 字玩FontPlayer开发笔记14 Vue3实现多边形工具 字玩FontPlayer是笔者开源的一款字…...

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 1 kkFileView源码下载及编译2 Pdf转图片接口2.1 背景2.2 分析2.2 接口开发2.2.1 编写Pdf转图片方法2.2.2 编写转换接口 2.3 接口测试2.3.1 Pdf文件准备2.3.2 pdf2Image 3 部署 1 kkFileView源码下载及编译 前文 【kkFileView二开之源码编译及部…...

达梦tpcc压测

造数 在这个日志输出中&#xff0c;主要执行了一系列数据库操作&#xff0c;涵盖了数据库信息检查、表的创建与数据加载、索引的添加、数据验证等步骤。具体分析如下&#xff1a; 数据库信息检查&#xff1a; 查询了数据库的版本、实例名称、日志文件大小、字符集等信息。 删…...

计算机毕业设计PySpark+hive招聘推荐系统 职位用户画像推荐系统 招聘数据分析 招聘爬虫 数据仓库 Django Vue.js Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

DeepSeek正重构人形机器人和具身大模型赛道!

中国人工智能公司DeepSeek&#xff08;深度求索&#xff09;以“低成本、高效率、强开放”的研发范式横空出世&#xff0c;火遍并震撼全球科技圈&#xff1b;DeepSeek展现出来的核心竞争力&#xff0c;除了低成本及推理能力&#xff0c;更重要的是开源模型能力追赶上了最新的闭…...

第1章 信息化发展(一)

1.1信息与信息化 1.1.1信息基础 1.信息的定义 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。它以物质介质为载体&#xff0c;传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质也不是能量&#xff0c;它以一种普遍形式&#xff0c;表达…...

面试经典150题——字典树

文章目录 1、实现 Trie (前缀树)1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、添加与搜索单词 - 数据结构设计2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词搜索 II3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 对于字典树而言&#xff0c;之前做过…...

【前端 DevOps】GitHub Actions 与 GitLab CI 实战:实现前端项目的自动化测试与部署

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

SQLMesh系列教程-3:SQLMesh模型属性详解

SQLMesh 的 MODEL 提供了丰富的属性&#xff0c;用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性&#xff0c;可以构建高效、可维护的数据管道。在 SQLMesh 中&#xff0c;MODEL 是定义数据模型的核心结构&#xff0c;初学SQLMesh&#xff0c;定义模型看到属…...

【Maven】多module项目优雅的实现pom依赖管理

【Maven】多module项目优雅的实现pom依赖管理 【一】方案设计原则【二】项目结构示例【三】实现思路【1】可能的问题点&#xff1a;【2】解决方案的思路&#xff1a;【3】需要注意的地方&#xff1a;【4】可能的错误&#xff1a; 【四】实现案例【1】父POM设计&#xff08;pare…...

【数字】异步FIFO面试的几个小问题与跨时钟域时序约束

入门数字设计的时候&#xff0c;跨时钟域的数据处理是绕不开的课题&#xff0c;特别是多比特数据跨时钟域时&#xff0c;都会采用异步FIFO的方法。 异步FIFO中涉及较多的考点这里记录几个以供大家参考。 1. 异步FIFO的空满判断分别在哪个域&#xff1f; 根据异步FIFO的结构&…...

云原生时代的开发利器

云原生时代的开发工具集之中&#xff0c;至少应有这样一种利器&#xff1a;基于微服务架构的低代码开发平台&#xff0c;同时与业界标准的云原生技术支撑设施能够完全协同和融合。低代码开发平台的构建不仅仅是采用微服务开发框架&#xff0c;更加重要的是符合当前主流的中台和…...

利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析

文章目录 引言&#xff1a;当.class文件遇到源代码缺失第一章&#xff1a;反编译技术基础认知1.1 Java编译执行原理1.2 反编译的本质1.3 法律与道德边界 第二章&#xff1a;IDEA内置反编译工具详解2.1 环境准备2.2 三步完成基础反编译2.3 高级反编译技巧2.3.1 调试模式反编译2.…...

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

2.7 静态方法/构造函数Mock

静态方法/构造函数Mock 在单元测试中&#xff0c;静态方法和构造函数的Mock是相对复杂的需求&#xff0c;因为Mockito的核心设计基于对象实例的模拟。然而&#xff0c;通过扩展工具或特定技巧&#xff0c;可以实现对这些场景的处理。本章详解两种主流方案&#xff1a;PowerMoc…...

注册Gmail如何跳过手机验证环节?

很多小伙伴在注册Gmail的时候都会遇到一个难题&#xff1a;手机号码验证&#xff0c;有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题&#xff0c;但 根据真实案例&#xff0c;还有部分人则是“幸运地”没有手机号验证环节&#xff0c;那么今…...

【算法专场】哈希表

目录 前言 哈希表 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法代码 面试题 01.02. 判定是否互为字符重排 ​编辑算法分析 算法代码 217. 存在重复元素 算法分析 算法代码 219. 存在重复元素 II 算法分析 算法代码 解法二 算法代码 算法…...

5、pod 详解 (kubernetes)

pod 详解 &#xff08;kubernetes&#xff09; Pod 的基础概念pause 容器Pod 的分类与创建自主式 Pod控制器管理的 Pod静态 Pod Pod容器的分类基础容器&#xff08;infrastructure container&#xff09;初始化容器&#xff08;initcontainers&#xff09;应用容器&#xff08;…...

二叉树详解:Java实现与应用

在计算机科学中&#xff0c;数据结构是构建高效算法的基石&#xff0c;而二叉树作为一种基础且重要的树形结构&#xff0c;在诸多领域都有着广泛应用&#xff0c;如数据库索引、文件系统、编译器设计等。本文将从基础概念入手&#xff0c;带你逐步深入理解二叉树&#xff0c;并…...

GPT和BERT

笔记来源&#xff1a; Transformer、GPT、BERT&#xff0c;预训练语言模型的前世今生&#xff08;目录&#xff09; - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频&#xff08;RNN模型与NLP应用&#xff09; 一、GPT 1.1 GPT 模型的…...

【工业安全】-CVE-2024-30891- Tenda AC18路由器 命令注入漏洞

1.漏洞描述 2.漏洞复现 2.1 qemu-user 模拟&#xff1a; 2.2 qemu-system模拟&#xff1a; 3.漏洞分析 4.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2024-30891 漏洞名称&#xff1a;Tenda AC18 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1a;Ten…...

如何从0开始将vscode源码编译、运行、打包桌面APP

** 网上关于此的内容很少&#xff0c;今天第二次的完整运行了&#xff0c;按照下文的顺序走不会出什么问题。最重要的就是环境的安装&#xff0c;否则极其容易报错&#xff0c;请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步&#xff1a;克隆 VSCode 源码 首先…...

登录弹窗效果

1&#xff0c;要求 点击登录按钮&#xff0c;弹出登录窗口 提示1&#xff1a;登录窗口 display:none 隐藏状态&#xff1b; 提示2&#xff1a;登录按钮点击后&#xff0c;触发事件&#xff0c;修改 display:block 显示状态 提示3&#xff1a;登录窗口中点击关闭按钮&#xff0…...