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

Redis--缓存穿透、击穿、雪崩以及预热问题(面试高频问题!)

缓存穿透、击穿、雪崩以及预热问题

  • 如何解决缓存穿透?
    • 方案一:缓存空对象
    • 方案二:布隆过滤器
      • 什么是布隆过滤器?
      • 优缺点
    • 方案三:接口限流
  • 如何解决缓存击穿问题?
    • 方案一:分布式锁
      • 方案一改进成双重判定锁
      • 高并发情况使用double check+ trylock解决
    • 方案二:缓存预热方案
      • 什么是缓存预热?
      • 如何进行缓存预热?
    • 方案三:热点数据永不过期
  • 如何解决缓存雪崩?
    • 对于大量缓存数据同时失效的解决办法
      • 方案一:均匀设置过期时间
      • 方案二:使用锁机制避免数据库频繁访问
      • 方案三:后台更新缓存
    • 对于Redis 故障宕机的解决办法
      • 方案一:服务熔断或请求限流机制
      • 方案二:构建 Redis 缓存高可靠集群

如何解决缓存穿透?

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

方案一:缓存空对象

当查询结果为空时,也将结果进行缓存但是设置一个较短的过期时间。这样在接下来的一段时间内,如果再次请求相同的数据,就可以直接从缓存中获取,而不是再次访问数据库,可以一定程度上解决缓存穿透问题。

这种方式是比较简单的一种实现方案,会存在一些弊端。那就是当短时间内存在大量恶意请求缓存系统会存在大量的内存占用。如果要解决这种海量恶意请求带来的内存占用问题,需要搭配一套风控系统,对用户请求缓存不存在数据进行统计,进而封禁用户。整体设计就较为复杂,不推荐使用。
在这里插入图片描述

方案二:布隆过滤器

什么是布隆过滤器?

隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。具体来说,布隆过滤器包含一个位数组和一组哈希函数。位数组的初始值全部置为 0。在插入一个元素时,将该元素经过多个哈希函数映射到位数组上的多个位置,并将这些位置的值置为 1。

1字节(Byte)=8位(Bit)
image.png
在查询一个元素是否存在时,会将该元素经过多个哈希函数映射到位数组上的多个位置,如果所有位置的值都为 1,则认为元素存在;如果存在任一位置的值为 0,则认为元素不存在。
在这里插入图片描述

优缺点

优点:

  • 高效地判断一个元素是否属于一个大规模集合。
  • 节省内存。

缺点:

  • 可能存在一定的误判。

方案三:接口限流

根据用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制,例如将异常 IP 列入黑名单。

后面提到的缓存击穿和雪崩都可以配合接口限流来解决,毕竟这些问题的关键都是有很多请求落到了数据库上造成数据库压力过大。

如何解决缓存击穿问题?

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

方案一:分布式锁

因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压力过大。

假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。
在这里插入图片描述
伪代码如下:

public String selectTrain(String id) {String cacheData = cache.get(id);// 查询缓存不存在,去数据库查询并放入到缓存if (StrUtil.isBlank(cacheData)) {// 为避免大量请求同时访问数据库,通过分布式锁减少数据库访问量Lock lock = getLock(id);lock.lock();try {// 获取数据库中存在的数据String dbData = trainMapper.selectId(id);if (StrUtil.isNotBlank(dbData)) {// 将查询到的数据放入缓存,下次查询就有数据了cahce.set(id, dbData);cacheData = dbData;}} finally {lock.unlock();}}return cacheData;
}

这种方案有效地避免了缓存击穿问题,因为只有一个线程能够在同一时间内查询数据库,其他线程需要等待,不会同时穿透到后端存储系统。性能较低,不适合高并发场景

方案一改进成双重判定锁

上边还有一个问题就是,假如 100w 的请求读取一个缓存,100w 的请求全部卡在 lock.lock 获取分布式锁处,只有一个线程会执行逻辑请求数据库并放入缓存。
问题来了,剩下正在获取分布锁的请求,就是 100w 个请求减去一个获取到锁的请求,还是会继续请求数据库获取数据。大家读一下上面的伪代码就明白了。

这会造成两个实际的问题:

  1. 全部用户获取锁后查询数据库,会对数据库造成无用的性能浪费,因为这 100w 的请求,只有第一次是有效的。
  2. 查询数据库会造成用户响应时间变长,接口吞吐量下降

双重判断:获取锁后,在查询数据库之前,再次检查一下缓存中是否存在数据。这是一个双重判断,如果缓存中存在数据,就直接返回;如果不存在,才继续执行查询数据库的操作。
伪代码如下:

public String selectTrain(String id) {// 查询缓存不存在,去数据库查询并放入到缓存String cacheData = cache.get(id);if (StrUtil.isBlank(cacheData)) {// 为避免大量请求同时访问数据库,通过分布式锁减少数据库访问量Lock lock = getLock(id);lock.lock();try {// 获取锁后双重判定cacheData = cache.get(id);// 理论上只有第一个请求加载数据库是有效的,因为它加载后会把数据放到缓存// 后面的请求再请求数据库加载缓存就没有必要了if (StrUtil.isBlank(cacheData)) {// 获取数据库中存在的数据String dbData = trainMapper.selectId(id);if (StrUtil.isNotBlank(dbData)) {// 将查询到的数据放入缓存,下次查询就有数据了cahce.set(id, dbData);cacheData = dbData;}}} finally {lock.unlock();}}return cacheData;
}

下面是这种场景下解决方案的一般步骤:

  1. 获取锁:在查询数据库前,首先尝试获取一个分布式锁。只有一个线程能够成功获取锁,其他线程需要等待。
  2. 查询数据库:如果双重判断确认数据确实不存在于缓存中,那么就执行查询数据库的操作,获取数据。
  3. 写入缓存:获取到数据后,将数据写入缓存,并设置一个合适的过期时间,以防止缓存永远不会被更新。
  4. 释放锁:最后,释放获取的锁,以便其他线程可以继续使用这个锁。

高并发情况使用double check+ trylock解决

有一万个请求同一时间访问触发了缓存击穿,如果用双重判定锁,逻辑是这样的:

  1. 第一个请求加锁、查询缓存是否存在、查询数据库、放入缓存、解锁,假设我们用了 50 毫秒;
  2. 第二个请求拿到锁查询缓存、解锁用了 1 毫秒;
  3. 那最后一个请求需要等待 10049 毫秒后才能返回,用户等待时间过长,极端情况下可能会触发应用的内存溢出。

像上面这种场景,类似于秒杀的架构,我们要做的就是不让用户请求在服务端阻塞过长时间。那就可以使用尝试获取锁 tryLock API,它的语义是如果拿锁失败直接返回,而不是阻塞等待直到获取锁。

public String selectTrain(String id) {// 查询缓存不存在,去数据库查询并放入到缓存String cacheData = cache.get(id);if (StrUtil.isBlank(cacheData)) {// 为避免大量请求同时访问数据库,通过分布式锁减少数据库访问量Lock lock = getLock(id);// 尝试获取锁,获取失败直接返回用户请求,并提醒用户稍后再试if (!lock.tryLock()) {throw new RuntimeException("当前访问人数过多,请稍候再试...");}try {// 获取数据库中存在的数据String dbData = trainMapper.selectId(id);if (StrUtil.isNotBlank(dbData)) {// 将查询到的数据放入缓存,下次查询就有数据了cahce.set(id, dbData);cacheData = dbData;}} finally {lock.unlock();}}return cacheData;
}

方案二:缓存预热方案

什么是缓存预热?

缓存预热是指在应用程序启动或系统负载低峰期,提前将应用程序需要访问缓存的数据加载到缓存中,以便在实际的请求到来时能够快速响应。

缓存预热的目的是避免在实际请求到来时由于缓存冷启动而导致的延迟或性能下降。缓存冷启动是指在缓存中没有预先加载数据的情况下,第一次请求到达时需要从后端系统或数据库获取数据,并将其存储到缓存中。这个过程可能需要花费较长的时间,延迟了实际请求的响应时间。

如何进行缓存预热?

缓存预热有很多种方式,比如定时任务从数据库中查询进行预热等。我们这里在创建完短链接后就将短链接记录新增到缓存中。

@Transactional(rollbackFor = Exception.class)
@Override
public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {verificationWhitelist(requestParam.getOriginUrl());String shortLinkSuffix = generateSuffix(requestParam);String fullShortUrl = StrBuilder.create(createShortLinkDefaultDomain).append("/").append(shortLinkSuffix).toString();ShortLinkDO shortLinkDO = xxx;ShortLinkGotoDO linkGotoDO = ShortLinkGotoDO.builder().fullShortUrl(fullShortUrl).gid(requestParam.getGid()).build();try {baseMapper.insert(shortLinkDO);shortLinkGotoMapper.insert(linkGotoDO);} catch (DuplicateKeyException ex) {if (!shortUriCreateCachePenetrationBloomFilter.contains(fullShortUrl)) {shortUriCreateCachePenetrationBloomFilter.add(fullShortUrl);}throw new ServiceException(String.format("短链接:%s 生成重复", fullShortUrl));}// 将短链接新增到缓存中进行预热stringRedisTemplate.opsForValue().set(String.format(GOTO_SHORT_LINK_KEY, fullShortUrl),requestParam.getOriginUrl(),LinkUtil.getLinkCacheValidTime(requestParam.getValidDate()), TimeUnit.MILLISECONDS);shortUriCreateCachePenetrationBloomFilter.add(fullShortUrl);return ShortLinkCreateRespDTO.builder().fullShortUrl("http://" + shortLinkDO.getFullShortUrl()).originUrl(requestParam.getOriginUrl()).gid(requestParam.getGid()).build();
}

将缓存预热的话,有个小技巧,是否要设置缓存的过期时间?如果设置,那设置多少合适?

因为咱们短链接创建时是可以设置过期时间的,所以对于设置了过期时间的短链接,我们在缓存中也设置对应的时间即可。

那对于永久有效的短链接难道就不设置过期时间么?大家知道,短链接一般来说具有时效性,很多时候只会在一定时间内使用,过了这个时间后,用的人就很少了。所以,即使短链接永久有效,我们也得设置过期时间。不然,大量不使用的短链接放在缓存中,存储压力会比较大。

如果短链接设置的永久有效,我们默认一个月的过期时间。如果一个月后还有人访问,再去数据库加载数据,再设置一个月的过期时间即可。

方案三:热点数据永不过期

热点数据永不过期,指的就是可以预知的热点数据,在活动开始前,设置过期时间为 -1。这样的话,就不会有缓存击穿的风险。

这个可以搭配热点数据预加载一起完成。等对应热点缓存的活动结束后,这些数据访问量就比较低了,可以通过后台任务的方案对指定缓存设置过期时间,这样可以有效降低 Redis 存储压力。

如何解决缓存雪崩?

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

对于大量缓存数据同时失效的解决办法

方案一:均匀设置过期时间

避免所有缓存在同一时间点失效,可以采用随机分布的方式设置缓存失效时间,或者使用带有随机偏移的失效时间。

通过以上几种方案组合使用,可以一定程度上减少缓存雪崩的可能性。

方案二:使用锁机制避免数据库频繁访问

当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
实现互斥锁的时候,最好设置超时时间,不然第一个请求拿到了锁,然后这个请求发生了某种意外而一直阻塞,一直不释放锁,这时其他请求也一直拿不到锁,整个系统就会出现无响应的现象。

方案三:后台更新缓存

对于一些热点数据,可以设置永不过期,以保证这部分数据始终在缓存中可用。同时,需要保障缓存设置的内存淘汰策略是不淘汰或者从带过期时间 Key 中去淘汰。

咱们以两种系统举例,分别是电商系统以及 12306 铁路购票系统:

电商系统:比如需要参加秒杀的商品数据,我们为了避免因设计过期时间自动过期或者不合适的 Redis 过期策略自动清楚,需要将参与秒杀的商品数据直接设置为永不过期。
12306:同上,如果在售票期间的列车数据缓存就不要设置过期时间了。
如果商品过了秒杀时间或者 12306 列车时间过了售票时间,这些数据岂不是会占用缓存空间么?

这种一般都会有定时任务在活动结束或过了售票周期后统一删除。

对于Redis 故障宕机的解决办法

方案一:服务熔断或请求限流机制

因为 Redis 故障宕机而导致缓存雪崩问题时,我们可以启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不用再继续访问数据库,从而降低对数据库的访问压力,保证数据库系统的正常运行,然后等到 Redis 恢复正常后,再允许业务应用访问缓存服务。
为了减少对业务的影响,我们可以启用请求限流机制,只将少部分请求发送到数据库进行处理,再多的请求就在入口直接拒绝服务,等到 Redis 恢复正常并把缓存预热完后,再解除请求限流的机制。

方案二:构建 Redis 缓存高可靠集群

服务熔断或请求限流机制是缓存雪崩发生后的应对方案,我们最好通过主从节点的方式构建 Redis 缓存高可靠集群

如果 Redis 缓存的主节点故障宕机,从节点可以切换成为主节点,避免了由于 Redis 故障宕机而导致的缓存雪崩问题。

相关文章:

Redis--缓存穿透、击穿、雪崩以及预热问题(面试高频问题!)

缓存穿透、击穿、雪崩以及预热问题 如何解决缓存穿透?方案一:缓存空对象方案二:布隆过滤器什么是布隆过滤器?优缺点 方案三:接口限流 如何解决缓存击穿问题?方案一:分布式锁方案一改进成双重判定…...

【Python高级353】python实现多线程版本的TCP服务器

前面学了了套接字编程、tcp服务端客户端开发、面向对象版的服务端客户端、带有端口复用的服务端。 这里使用多线程开发多任务版的服务端 多任务版本的TCP服务器 来一个客户,就为其创建一个线程 import socket import threadingclass WebServer:# 3、定义一个__ini…...

【Pandas】pandas Series to_period

Pandas2.2 Series Conversion 方法描述Series.astype用于将Series对象的数据类型转换为指定类型的方法Series.convert_dtypes用于将 Series 对象的数据类型智能地转换为最佳可能的数据类型的方法Series.infer_objects用于尝试推断 Series 中对象(object&#xff0…...

深度学习领域车辆识别与跟踪

深度学习中车辆识别是一个广泛应用的领域,它涵盖了从车辆检测到车型识别的多个方面。以下是对深度学习中车辆识别与车辆相关内容的详细探讨: 一、车辆检测 车辆检测是车辆识别中的基础任务,其目标是在图像或视频中准确地定位出车辆的位置。…...

数学建模 绘图 图表 可视化(2)

文章目录 前言柱形图条形图克利夫兰点图系列坡度图南丁格尔玫瑰图径向柱图极坐标图词云图总结参考资料 前言 承接上期 数学建模 绘图 图表 可视化(1)的总体描述,这期我们继续跟随《Python 数据可视化之美 专业图表绘制指南》步伐来学习其中l…...

vue源码分析(十)—— 生命周期

文章目录 前言一、关键方法 callHook二、详细的钩子函数说明1.beforeCreate和create2.beforeMount & mounted注意点组件(非根组件)的渲染节点(1)invokeInsertHook函数(2)insert方法(3&#…...

[创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较

目录 一、波士顿矩阵 1、基本原理 2、各象限产品的定义及战略对策 3、应用 4、优点与局限性 二、技术成熟度模型与产品生命周期模型的配对 1、技术成熟度模型 2、产品生命周期模型 3、技术成熟度模型与产品生命周期模型的配对 三、产品生命周期与产品类型的对应关系 …...

# 【超全面了解鸿蒙生命周期】-生命周期补充

【超全面了解鸿蒙生命周期】-生命周期补充 鸿蒙所有的生命周期函数梳理 文章目录 【超全面了解鸿蒙生命周期】-生命周期补充前言一、AbilityStage的生命周期二、ExtensionAbility卡片生命周期三、Web组件常用生命周期 前言 本文是继之前写的生命周期函数梳理的进一步补充&…...

sentinel-请求限流、线程隔离、本地回调、熔断

请求限流:控制QPS来达到限流的目的 线程隔离:控制线程数量来达到限流的目录 本地回调:当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 熔断:熔断也叫断路器,当失败、或者…...

unplugin-vue-router 的基本使用

1. 前言 在Vue3开发过程中,每次创建新的页面都需要注册路由,需要在src/router.ts中新增页面的路径,并将URL路径映射到组件中,如下所示: import { createMemoryHistory, createRouter } from vue-routerimport HomePage…...

[Leetcode] 最大子数组和 [击败99%的解法]

解法1&#xff1a; 暴力解法 遍历每个元素&#xff0c;从它当前位置一直加到最后&#xff0c;然后用一个最大值来记录全局最大值。 代码如下&#xff1a; class Solution {public int maxSubArray(int[] nums) {long sum, max nums[len-1];for (int i0; i<nums.length;…...

SSRF服务端请求Gopher伪协议白盒测试

前言 是什么SSRF&#xff1f; 这个简单点说就是 服务端的请求伪造 就是这个如果是个 请求图片的网站 他的目的是请求外部其他网站的 图片 但是 SSRF指的是让他请求本地的图片 再展示出来 请求的是他的服务器上的图片 SSRF(Server-Side Request Forgery:服务器端请求伪造) …...

[2029].第6-06节:MyISAM引擎中的索引与 InnoDB引擎中的索引对比

所有博客大纲 后端学习大纲 MySQL学习大纲 1.MyISAM索引&#xff1a; 1.1.B树索引适用存储引擎&#xff1a; 1.B树索引适用存储引擎如下表所示&#xff1a; 2.即使多个存储引擎都支持同一种类型的B树索引&#xff0c;但它们的实现原理也是不同的 Innodb和MyISAM默认的索引是B…...

WOFOST作物模型(3):(本地化校准)优化PCSE模型中的参数

目录 一、准备自己的LAI观测数据二、优化参数三、损失函数四、NLOPT优化五、优化结果可视化一、准备自己的LAI观测数据 在进行田间实测后,得到自己的LAI观测数据 在程序这个地方输入自己的LAI采样日期和观测值 二、优化参数 这里主要选择了TDWI(Total Dry Weight at ger…...

如何修改pip全局缓存位置和全局安装包存放路径

使用场景&#xff1a; 在默认情况下&#xff0c;pip 会将安装的包存放在 Python 环境的 site-packages 目录下&#xff0c;会使用到系统盘的内存。 当遇到系统盘的内存很小的时候,需要修改pip的全局缓存位置和全局安装包存放路径,可以极大的节省系统盘内存 详细步骤&#xff…...

ZooKeeper注册中心实现

具体步骤 安装ZooKeeper&#xff08;启动端口占用&#xff0c;2181&#xff1a;客户端&#xff0c;8080&#xff1a;管理端&#xff09;引入客户端依赖实现注册中心接口SPI补充ZooKeeper注册中心 引入依赖 <!-- zookeeper --> <dependency><groupId>org.a…...

PyTorch快速入门教程【小土堆】之DataLoader的使用

视频地址DataLoader的使用_哔哩哔哩_bilibili dataset数据集&#xff0c;相当于一副扑克&#xff0c;dataloader数据加载器相当于我们的手&#xff0c;选择摸几张牌&#xff0c;怎么摸牌 import torchvision# 准备的测试数据集 from torch.utils.data import DataLoader from …...

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像 一、资源准备1.1 镜像文件1.2 刷机工具1.3 ubuntu20.04 docker镜像&#xff08;具备demon无人机所需各种驱动&#xff09; 二、开始刷机&#xff08;安装ubuntu22.04系统&#xff09;2.1 进入刷机状态2.2 刷机 三、docker…...

大数据面试笔试宝典之Kafka面试

1.Kafka 如何实现高吞吐率 Kafka 如何实现高吞吐率? 参考答案: 1)顺序读写...

新手SEO入门指南如何有效提升网站排名

内容概要 在进行搜索引擎优化&#xff08;SEO&#xff09;时&#xff0c;了解基本概念与重要性是首要步骤。SEO不仅仅是提升网站在搜索引擎中排名的手段&#xff0c;它还关乎用户体验和网站内容的质量。随着互联网的发展&#xff0c;越来越多的人意识到优秀的SEO策略能带来持续…...

【Redis】:初识Redis

1.1 盛赞 Redis Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xf…...

C-5 B样条曲线

C-5 B样条曲线 N i , 0 ( u ) { 1 , u i ≤ u < u i 1 0 , o t h e r s N_{i,0}(u)\left\{\begin{matrix} 1 , \quad u_i\le u <u_{i1} \\0 ,\quad others \qquad \quad\end{matrix}\right. Ni,0​(u){1,ui​≤u<ui1​0,others​ N i , p ( u ) u − u i u i p −…...

python安装

python安装 1.下载2.安装3.验证安装成功 1.下载 &#xff08;1&#xff09;下载网址&#xff1a;https://www.python.org/downloads/windows/ 进入后稍等一会&#xff0c;比较慢 &#xff08;2&#xff09;选择版本 2.安装 &#xff08;1&#xff09;双击或者以管理员身份运…...

游戏引擎学习第65天

回顾我们在模拟区域更改方面的进展 目前我们正在进行游戏的架构调整&#xff0c;目标是建立一个引擎架构。我们正在实施的一个关键变化是引入模拟区域的概念&#xff0c;这样我们可以创建非常大的游戏世界&#xff0c;而这些世界的跨度不必受限于单个浮点变量。 通过这种方式…...

代码随想录算法训练营第十六天-二叉树-513.找树左下角的值

左下角不是以为的左下角&#xff0c;而最后一层最左侧的节点也是就是说一个右叶子节点&#xff0c;也可能是最左下角&#xff0c;当然是在其左侧再无其它同级节点看视频讲解使用的递归与回溯方法&#xff0c;自己是完全想不到的&#xff0c;对这道题解法完全是脑袋空空 #inclu…...

力扣第122题:买卖股票的最佳时机 II

力扣第122题&#xff1a;买卖股票的最佳时机 II - C语言解法 题目描述 给定一个数组 prices&#xff0c;其中 prices[i] 是一支股票第 i 天的价格。你可以多次买入和卖出股票&#xff0c;求能够获得的最大利润。 注意&#xff1a; 你不能同时参与多笔交易&#xff08;即必须…...

【Spring MVC】第一站:Spring MVC介绍配置基本原理

目录 1.引入 2. Java web的发展史 Model I 和Model II 3. MVC模式 4. Spring MVC配置 5. SpringMVC原理 5.1 SpringMVC中心控制器 6. Maven配置 1.引入 $$ Spring与Spring MVC的区别 SSM 包含三部分&#xff1a; Spring MVCSpringMybatis SSM就是升级版的Servlet。 Servlet…...

密钥登录服务器

1. 生成 SSH 密钥对 如果您还没有生成密钥对&#xff0c;可以使用以下命令生成&#xff1a; ssh-keygen 在 root 用户的家目录中生成了一个 .ssh 的隐藏目录&#xff0c;内含两个密钥文件&#xff1a;id_rsa 为私钥&#xff0c;id_rsa.pub 为公钥。 在提示时&#xff0c;您可…...

Java中StopWatch的使用详解

stopWatch 是org.springframework.util 包下的一个工具类&#xff0c;使用它可直观的输出代码执行耗时&#xff0c;以及执行时间百分比。 在未使用这个工具类之前&#xff0c;如果我们需要统计某段代码的耗时&#xff0c;我们会这样写: public static void main(String[] args…...

安全运营 -- splunk restapi 最小权限

0x00 背景 最小化权限原则&#xff0c;为每个功能&#xff0c;每个账户分配最小的权限。 0x01 实践 只需要7个 capability: Youll need to add certain capabilities to that user or that userss role(s).[capability::rest_apps_management] * Lets a user edit settings …...

12. 日常算法

1. 主持人调度&#xff08;一&#xff09; 题目来源 class Solution { public:bool hostschedule(vector<vector<int>>& schedule) {// write code heresort(schedule.begin(), schedule.end());int start -1, end 0;for (auto & nums : schedule){end…...

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…...

CSS(二):美化网页元素

目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性&#xff1a; font-family&#xff1a;设置字体font-size&#xff1a;设置字体大小font-weight&#xff1a;设置字体的粗细&#xff08;如 normal, bold, lighter 等&#xff09;color&#xff1a;…...

如何不让场景UI受后处理影响

1&#xff09;如何不让场景UI受后处理影响 2&#xff09;Sprite打入SpriteAtlasv2依赖丢失 3&#xff09;如何为Render Texture模式的videoPlayer生成封面 4&#xff09;如何排查Shader变体的SRP Batcher兼容性 这是第415篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热…...

【教程】通过Docker运行AnythingLLM

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 官方教程&#xff1a;Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件&#xff1a; sudo mkdir /app su…...

2024/12/29 黄冈师范学院计算机学院网络工程《路由期末复习作业一》

一、选择题 1.某公司为其一些远程小站点预留了网段 172.29.100.0/26&#xff0c;每一个站点有10个IP设备接到网络&#xff0c;下面那个VLSM掩码能够为该需求提供最小数量的主机数目 &#xff08; &#xff09; A./27 B./28 C./29 D./30 -首先审题我们需要搞清楚站点与网…...

LeetCode-整数反转(007)

一.题目描述 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 二.示例 …...

碰一碰发视频矩阵系统源码搭建,支持OEM

一、引言 随着短视频的火爆发展&#xff0c;碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备&#xff08;如 NFC 标签&#xff09;快速触发视频的发布&#xff0c;在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…...

Linux网络编程3——多线程编程(改良版)

一.多线程 1.什么是线程 要了解线程&#xff0c;首先需要知道进程。一个进程指的是一个正在执行的应用程序。线程对应的英文名称为“thread”&#xff0c;它的功能是执行应用程序中的某个具体任务&#xff0c;比如一段程序、一个函数等。 线程和进程之间的关系&#xff0c;类…...

LeetCode每日三题(六)数组

一、最大子数组和 自己答案&#xff1a; class Solution {public int maxSubArray(int[] nums) {int begin0;int end0;if(numsnull){//如果数组非空return 0;}else if(nums.length1){//如果数组只有一个元素return nums[0];}//初值选为数组的第一个值int resultnums[0];int i…...

安装了python,环境变量也设置了,但是输入python不报错也没反应是为什么?window的锅!

目录 问题 结论总结 衍生问题 1 第1步&#xff1a;小白python安装&#xff0c;不要埋头一直点下一步&#xff01;&#xff01;&#xff01; 2 第2步&#xff1a;可以选择删了之前的&#xff0c;重新安装python 3 第3步&#xff1a;如果你不想或不能删了重装python&#…...

Vue.js组件开发-使用KeepAlive缓存特定组件

在Vue中&#xff0c;<keep-alive> 组件是一个非常有用的工具&#xff0c;可以用来缓存那些不希望每次切换时都重新渲染的组件。要缓存特定组件&#xff0c;可以使用 <keep-alive> 的 include 和 exclude 属性&#xff0c;这两个属性都接受字符串、正则表达式或数组…...

配置hive支持中文注释

hive元数据metastore默认的字符集是latin1&#xff0c;所以中文注释会乱码。但是不能将metastore库的字符集更改为utf-8&#xff0c;只能对特定表、特定列修改为utf-8。配置hive支持中文注释&#xff0c;主要在两个方面&#xff1a; 1、在Hive元数据存储的Mysql数据库中&#…...

Windows配置IE浏览器不自动跳转到Edge

一&#xff1a;使用 IE 浏览器自身设置&#xff08;部分情况有效&#xff09; 打开 IE 浏览器设置&#xff1a;启动 IE 浏览器&#xff0c;点击右上角的 “工具”&#xff08;齿轮形状&#xff09;图标&#xff0c;选择 “Internet 选项”。设置启动选项&#xff1a;在 “Inte…...

BGP特性实验

实验拓扑 实验需求及解法 本实验模拟大规模BGP网络部署&#xff0c;使用4字节AS号&#xff0c;传递IPv6路由。 预配说明&#xff1a; sysname R1 ospfv3 1router-id 1.1.1.1 # firewall zone Localpriority 15 # interface Serial1/0/0link-protocol pppipv6 enable ipv6 ad…...

【多模态】从零学习多模态——2024学习笔记总结

从零学习多模态——2024学习笔记总结 前言1. preliminary2. Transformer和NLP基础3. 多模态模型原理和架构学习4. 动手实验多模态模型第一步尝试Swift框架使用数据验证 5. 总结 前言 2024快结束啦&#xff0c;半年抽空学了学多模态还挺好玩的&#xff0c;学习和踩坑记录记一下&…...

Meta AI 提出大型概念模型(LCMs):语义超越基于令牌的语言建模

在自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;的领域&#xff0c;大型语言模型&#xff08;Large Language Models, LLMs&#xff09;已经取得了令人瞩目的成就&#xff0c;它们使得文本生成、摘要和问答等应用成为现实。但是&#xff0c;这些模型依…...

【优先算法】滑动窗口 --(结合例题讲解解题思路)(C++)

目录 ​编辑 1.什么是滑动窗口&#xff1f; 2. 滑动窗口例题 2.1 例题1&#xff1a;长度最小的子数组 2.1.1 解题思路 2.1.2 方法一&#xff1a;暴力枚举出所有的子数组的和 2.1.3 方法二&#xff1a;使用 “同向双指针” 也就是滑动窗口来进行优化 2.2 例题2&#xff1a;无重…...

Linux下PostgreSQL-12.0安装部署详细步骤

一、安装环境 postgresql-12.0 CentOS-7.6 注意&#xff1a;确认linux系统可以正常连接网络&#xff0c;因为在后面需要添加依赖包。 二、pg数据库安装包下载 下载地址&#xff1a;PostgreSQL: File Browser 选择要安装的版本进行下载&#xff1a; 三、安装依赖包 在要安…...

Delphi历史版本对照及主要版本特性

Delphi编程的关键特性包括&#xff1a; 可视化开发&#xff1a;Delphi以其独特的开发方法而闻名&#xff0c;它允许开发者通过直观的表单设计器来创建用户界面。这种快速应用程序开发&#xff08;RAD&#xff09;的方法大大简化并加速了图形用户界面&#xff08;GUI&#xff09…...