redis基础6——缓存穿透、缓存击穿、缓存雪崩

2023-10-27

文章目录

一、缓存穿透(双库为空)

1.1 基础概念

redis做缓存来用可用大大提高工作效率,先去访问redis内存里的数据,若没有再去访问数据库里的。

  • 概念: 当缓存和数据库中都没有客户端请求的的数据时,客户端还源源不断地发起请求,那么每次请求都会到数据库,从而压垮数据库服务器。

在这里插入图片描述

1.2 解决办法

1.2.1 业务层校验

用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。

  • 使用情景:
    • 请求参数为主键自增id,那么对于请求小于0的id参数,明显不符合,可以直接返回错误请求。

1.2.2 设置key过期时间

对于不存在数据设置短过期时间。

  • 使用场景:
    • 当请求的key不存在时,返回的空结果设置过期时间,让redis暂时缓存一段时间,过期时间长短要根据实际业务来定。这种方法具有很大的局限性。

1.2.3 布隆过滤器

布隆过滤器(BloomFilter)是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的,可以判断一个元素是否在一个集合中。利用极小的内存,可以判断大量的数据“一定不存在或者可能存在”。

  • 使用场景:
    • 当客户端请求到来时,会把所有可能查询的参数哈希到一个足够大的布隆过滤器中存储,并在控制层进行校验,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

在这里插入图片描述

1.2.3.1 原理

布隆过滤器使用到哈希函数原理,我们可以先来了解一下哈希函数。

1.2.3.1.1 哈希函数使用

哈希函数的概念: 将任意大小的输入数据转换成特定大小的输出数据的函数,转换后的数据称为哈希值或哈希编码,也叫散列值。

  • 图示效果:

在这里插入图片描述

  • 散列函数基本特性:

    • 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数
    • 散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为“散列碰撞(collision)”。

    当用hash表存储大数据量时,空间效率还是很低。因为当只有一个 hash 函数时,还很容易发生哈希碰撞。

1.2.3.1.2 布隆过滤器数据结构

BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的。

1.2.3.1.2.1 映射函数执行过程

1、在初始状态时,位数组上的位都是0,如图所示。

在这里插入图片描述
2、当接收到客户端请求时,其变量就会被加入集合,通过多个映射函数将这个变量映射成位图中的多个点,并把这些位变为 1。比如下图中有两个变量都通过3个映射函数,那么会有6个映射函数处理位上的值,这6个函数中可能存在多个函数对同一个位产生变化,如图所示。
在这里插入图片描述

从映射函数执行过程中,我们可以得出结论:
查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合中有没有它了。

  • 如果这些点有任何一个 0,则被查询变量一定不在;
  • 如果都是 1,则被查询变量很可能存在。
1.2.3.1.2.2 布隆过滤器的误判率

概念: 指多个输入变量经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入变量产生的,根源在于同一个bit 位被多次映射且置 1。
这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个 bit 并不是独占的,可能有多个元素共享了某一位。如果直接删除这一位会影响其他的元素。(比如上图中的第 6、11位)

1.2.3.2 特性

  1. 当一个元素判断结果为存在时,该元素不一定存在;当判断结果为不存在时,则该元素一定不存在。
  2. 布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

1.2.3.3 操作元素流程

  • 添加元素
  1. 将要添加的元素给设定的哈希函数。
  2. 设定的多个哈希函数会把元素映射到多个位上,从而得到对应于位数组上的bit的位置。
  3. 将这bit位置设为 1。
  • 查询元素
  1. 将要查询的元素给设定的哈希函数。
  2. 设定的多个哈希函数会把元素映射到多个位上,从而得到对应于位数组上的bit的位置。
  3. 判断bit位的值;
    • 如果k个位置有一个为 0,则肯定不在集合中。
    • 如果k个位置全部为 1,则可能在集合中。

1.2.3.4 优缺点(缺点导致布谷鸟过滤器出现)

  • 优点
  1. 占用内存小。布隆过滤器存储空间和插入/查询时间都是常数 O ( K ) O(K) O(K)
  2. 影响服务器性能小。布隆过滤器运用了散列函数,其相互之间没有关系,方便由硬件并行实现。
  3. 一定场景下具备保密性。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
  4. 布隆过滤器可以表示全集,链表、树、散列表等数据结构都不能。
  • 缺点
  1. 存在误算率。存入元素数量越多,误算率多高。但是如果元素数量太少,可以使用散列列表不需要使用位图。
  2. 不能随意删除布隆过滤器中的元素。

1.2.3.5 安装启动

1.2.3.5.1 二进制安装启动
1.2.3.5.1.1 参数启动

1、下载安装包

wget https://github.com/RedisLabsModules/rebloom/archive/v2.2.6.tar.gz

2、解压编译

[root@localhost git-2.38.1]# tar -zxvf v2.2.6.tar.gz
[root@localhost git-2.38.1]# cd RedisBloom-2.2.6/
[root@localhost RedisBloom-2.2.6]# make

3、编译完成后,当前目录会生成一个redisbloom.so文件,服务端启动时需要指定该文件。

在这里插入图片描述
4、服务端启动成功后,就可以开始玩布隆过滤器基本指令了。

在这里插入图片描述

1.2.3.5.1.2 配置文件启动

可以在redis.conf配置文件里指定redisbloom.so文件位置,这样每次启动时不需要再指定参数启动,省事。

1、配置文件指定文件位置
在这里插入图片描述
2、服务直接启动就可以使用布隆过滤器了。
在这里插入图片描述

1.2.3.5.2 docker 安装

docker方式安装没有测试,大家可以尝试下。

docker pull redislabs/rebloom:latest # 拉取镜像
docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest #运行容器
docker exec -it redis-redisbloom bash
redis-cli    

1.2.3.6 布隆命令

1.2.3.6.1 添加元素到布隆
  • 单个元素
127.0.0.1:6381> bf.add baidu 888
(integer) 1

在这里插入图片描述

  • 多个元素
127.0.0.1:6381> bf.madd wuhan 111 222 333 
1) (integer) 1
2) (integer) 1
3) (integer) 1

在这里插入图片描述

1.2.3.6.2 判断元素是否存在布隆
  • 单个元素
127.0.0.1:6381> bf.add key1 111
(integer) 1
127.0.0.1:6381> bf.exists key1 111
(integer) 1
127.0.0.1:6381> bf.exists key1 999
(integer) 0

在这里插入图片描述

  • 多个元素
127.0.0.1:6381> bf.madd wuhan 111 222 333 
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:6381> bf.mexists wuhan 111 222 999
1) (integer) 1
2) (integer) 1
3) (integer) 0

在这里插入图片描述

1.2.3.6.3 查看布隆过滤器信息

命令:bf.info [key名称]

  • Capacity:预设容量;
  • Size:实际占用情况,但如何计算待进一步确认;
  • Number of filters:过滤器层数;
  • Number of items inserted:已经实际插入的元素数量;
  • Expansion rate:子过滤器扩容系数(默认 2);

在这里插入图片描述

1.2.3.6.3 布隆命令其他参数

BF.RESERVE {key} {error_rate} {capacity} [EXPANSION {expansion}] [NONSCALING]

  • key:布隆的名字;
  • error_rate:期望的错误率,默认 0.1,值越低,需要的空间越大;
  • capacity:初始容量,默认 100,当实际元素的数量超过这个初始化容量时,误判率上升。
  • EXPANSION:可选参数,当添加到布隆过滤器中的数据达到初始容量后,布隆过滤器会自动创建一个子过滤器,子过滤器的大小是上一个过滤器大小乘以 expansion;expansion 的默认值是 2,也就是说布隆过滤器扩容默认是 2 倍扩容;
  • NONSCALING:可选参数,设置此项后,当添加到布隆过滤器中的数据达到初始容量后,不会扩容过滤器,并且会抛出异常((error) ERR non scaling filter is full) 说明:BloomFilter 的扩容是通过增加 BloomFilter 的层数来完成的。每增加一层,在查询的时候就可能会遍历多层 BloomFilter 来完成,每一层的容量都是上一层的两倍(默认)。

如果直接bf.add插入元素,则默认给的“error_rate”参数 是 0.01,“capacity”参数是 100。
Redis 还提供了自定义参数的布隆过滤器,bf.reserve 过滤器名 error_rate initial_size

二、缓存击穿(定点爆破)

2.1 基础概念

概念: 指redis中一个热点key在过期时,有大量的并发请求过来,从而会全部到达数据库,压垮数据库。

  • 例子:微博爆出一条大瓜,海量吃瓜群众同时去查看这条新闻,刚开始能正常看,可突然微博redis集群中的这条数过期了,大量的请求就会直接访问数据库,从而会导致数据库宕机。

执行流程:

  1. 客户端请求redis缓存里的热点key。
  2. 热点key失效,client直接访问数据库获取数据。
  3. 数据库将该热点key数据返回给各个客户端。
  4. 数据库再将该热点key重新缓存到redis里。

在这里插入图片描述

2.2 解决方案

2.2.1 热key永不过期

简单粗暴的不设置过期时间,但需要根据特定场景尝试。

2.2.2 定时更新热key

比如可以将某个 key 的缓存时间设置为 25 小时,用一个异步线程定时更新和设置过期时间。

2.2.3 采用互斥锁

互斥锁流程:

  1. 当client_1去请求内存数据时,发现热key过期没有命中,这时原子性执行setnx 命令,如果返回1则获取锁并对key设置过期时间。
  2. client_1获取到锁后,其他clients进入睡眠,睡眠一段时间继续来获取锁。
  3. client_1发起第二个线程来监控第一个去数据库获取数据的线程执行状态,若在key的过期时间内没有获取到则延长加锁时间。
  4. 当client_1第一个线程成功取得数据后,会将数据写到redis缓存中,同时释放锁让其他客户端直接访问redis黎的缓存数据。
  5. 如果client_1获得锁后突然宕机,锁就不能被释放了,client_2也就没办法获取到锁,就造成了死锁现象。这时,就等锁过期后,client_2就会来获取锁并重复前面动作。
  • 死锁怎么处理?
    • 设置锁的自动超时时间,等Key过了超时时间就会自动删除。即使服务宕机没有调用del释放锁,那么锁本身也有超时时间,可以自动删除锁,其余客户端就可以获取锁了。
  • 锁过期未拿到数据怎么处理?
    • 延长锁的过期时间。另起一个线程监控获取锁的线程的查询状态,快到锁过期时间时还没查询结束则延长锁的过期时间,避免多次查询多次锁过期造成计算资源的浪费.

三、缓存雪崩(没有一片雪花是无辜的!)

3.1 基础概念

概念: 在某个时刻 Redis 集群中的热点 key 同时失效,或者Redis宕机,从而会导致大量请求直接到数据库,压垮数据库。可以说,缓存雪崩是缓存击穿的升级版。
执行流程:

  1. 客户端请求大量热key,key1、key2、key3、key4…
  2. 大量热key在redis缓存里同时失效,客户端直接访问数据库。
  3. 数据库将这些key返回给各个客户端。
  4. 数据库再将这些数据重新缓存到redis里。

在这里插入图片描述

3.2 解决方案

3.2.1 设置有效期均匀分布(一视同仁)

  • 设置有效期时增加随机值,分散key的过期时间,防止大量key在同一时间过期。
  • 统一规划有效期,使得过期时间均匀分布。
  • 设置热key永不过期。

3.2.2 缓存限流(层层关卡)

也可以同缓存击穿一样,增加互斥锁,控制数据库请求数量,重新建立缓存。

3.2.3 搭建集群(安全加固)

采用redis主从复制哨兵模式集群来实现高可用。

3.2.4 数据预热(未卜先知)

对于即将来临的大量请求,我们可以提前走一遍系统,将数据提前缓存在Redis中,并设置不同的过期时间。
流程步骤:

  1. 提前把可能出现的部分热点key放到redis中。不可把所有数据都写进redis,数据量太大,耗时不说,还存不下。
  2. 需要根据当天的具体访问情况,实时统计出访问频率较高的热数据。
  3. 将访问频率较高的热数据写入redis中,多个服务并行读取数据去写,并行的分布式的缓存预热。
  4. 将灌入了热数据的redis对外提供服务,这样就不至于冷启动导致数据库宕机。

3.2.5 缓存降级(弃驹保帅)

概念: 缓存降级是指当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,即使是有损部分其他服务,仍然需要保证主服务可用。可以先停止其他次要服务的运行,从而提升主服务的稳定性。

作用: 目的是保证核心服务可用,即使是有损的。
使用情景: 比如双十一的时候淘宝购物车无法修改地址只能使用默认地址,这个服务就是被降级了,阿里保证了订单可以正常提交和付款,但修改地址的服务可以在服务器压力降低,并发量相对减少的时候再恢复。
注意点: 降级可以根据实时的监控数据进行自动降级也可以配置开关人工降级。是否需要降级,哪些服务需要降级,在什么情况下再降级,取决于大家对于系统功能的取舍。

3.2.6 高压熔断(实时监控)

  • 这种模式的产生灵感来自于电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。
  • 那在系统中,如果某个目标服务调用慢或者有大量超时,此时熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。等目标服务情况好转则恢复调用。
  • 监控资源指标:
    • cpu负载、内存、
    • mysql监控长事务(这里与sql查询超时是紧密结合的,需要重点监控)
    • sql超时
    • 线程数等

3.2.7 及时隔离(画地为牢)

这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。

  • 可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。
  • 例如将这种服务拆开单独部署。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis基础6——缓存穿透、缓存击穿、缓存雪崩 的相关文章

  • Spring Data Redis 覆盖默认序列化器

    我正在尝试创建一个RedisTemplatebean 将具有更新的值序列化器来序列化对象JSONredis 中的格式 Configuration class RedisConfig Bean name redisTemplate Prima
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 删除 Python 中某些操作的 root 权限

    在我的 Python 脚本中 我执行了一些需要 root 权限的操作 我还创建并写入文件 我不想由 root 独占所有 而是由运行我的脚本的用户独占所有 通常 我使用以下命令运行脚本sudo 有办法做到上述吗 您可以使用以下方式在 uid
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015

随机推荐

  • 能拟合任何函数的神经网络只是个分段线性函数

    原文 https mp weixin qq com s XA1zS9bvgAfRkmTh e 78g 阅读本文 你可以理解 能逼近 拟合 任何函数只是个分段线性函数 让你深刻理解神经网络能力的边界 消除你对神经网络的神秘感 需要你具备的知识
  • PMOS管经典开关电路-PMOS开关典型电路工作原理及分析-KIA MOS管

    PMOS管经典开关电路 下图是两种PMOS管经典开关电路应用 其中第一种NMOS管为高电平导通 低电平截断 Drain端接后面电路的接地端 第二种为PMOS管典型开关电路 为高电平断开 低电平导通 Drain端接后面电路的VCC端 首先要进
  • 在本地配置nginx配置负载均衡

    首先建一个工程 确保在idea上能跑通 2 把这个项目打成war包 在tomcat下跑 1 为了不影响idea项目的正常运行 我在复制一个tomact 命名为tomcat 1 这个时候是要给tomcat 1配置环境变量的 有两种配置方案 一
  • 机械寿命预测(基于NASA C-MAPSS数据的剩余使用寿命RUL预测,Python代码,CNN_LSTM模型,有详细中文注释)

    1 效果视频 机械寿命预测 NASA涡轮风扇发动机剩余使用寿命RUL预测 Python代码 CNN LSTM模型 有详细中文注释 哔哩哔哩 bilibili 环境库版本 2 数据来源 https www nasa gov intellige
  • 基于Anycloud平台移植zxing-cpp(glassechidna )

    基于Anycloud平台移植zxing cpp 0 环境准备 系统环境Ubuntu 16 04 7 zxing cpp下载 本次使用的是 glassechidna 的代码 git clone https github com glassec
  • STM32F103C8T6+ST7735TFT LCD彩屏驱动程序

    使用环境 蓝色粗体字为特别注意内容 1 软件环境 Keil MDK 5 15 2 硬件环境 STM32F103C8T6最小系统 ST7735 1 44寸TFT LCD 某宝看到一块1 44寸的LCD 性价比蛮高 图片如下 主要参数如下 点阵
  • 使用git管理keil工程

    1 gitignore规则 使用git管理工程时 工程目录下有许多文件是不需要跟踪管理的 因此 我们一般会在工程目录下创建 gitignore文件 在其中编写忽略规则即可 gitignore忽略规则如下表所示 格式 说明 示例 注释 本行为
  • 安全工具箱必备技术之静态分析安全测试(SAST)

    有几种技术可以识别软件和系统的漏洞 聪明的组织把它们放在他们的 安全工具箱 中 并使用各种测试工具的组合 包括 静态分析安全测试 SAST 动态分析安全测试 DAST 源成分分析 SCA 漏洞扫描器 渗透测试 通过自动化工具提高安全性的动机
  • 第一周-1.1栈

    栈 描述 实现一个栈 完成以下功能 入栈 出栈 询问栈中位置Y是谁 一开始栈为空 栈中的位置从1开始 即栈底位置为1 输入 第一行一个整数n 表示操作个数 接下来n行 每行第一个数字表示操作 见描述 若为数字1 则接下来有一串字符串X 表示
  • js闭包作用(避免使用全局变量)

    js闭包作用 避免使用全局变量 一 总结 1 优点 可以把局部变量驻留在内存中 可以避免使用全局变量 2 缺点 也有占用更多内存的缺点 用完要及时让垃圾回收器回收 fn null 应及时解除引用 否则会占用更多存 3 闭包两种访问方式会有不
  • 虚拟服务器整合器,虚拟服务器整合关键技术研究

    摘要 虚拟服务器整合技术是将集群中多个物理服务器上运行的应用程序通过虚拟机封装后再整合到少数物理服务器上运行的技术 在企业级数据中心规模不断扩大的今天 虚拟服务器整合技术能够大大减少集群中使用的服务器的数量 从而帮助企业大幅降低硬件和运营成
  • 照成“未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”的三种可能性

    可能性 3 种 1 数据越界或是定义的指针未释放 2 空的指针的可能性最大 使用指针前最好能显式的赋值 应该是指针的问题 3 内存访问错误 检查指针 是否为空 是否越界等
  • VuforiaSDK

    由于课程原因学习了Unity平台下VuforiaSDK的AR应用开发 制作过程中也遇到了不少问题 作为记录发在这里 希望对大家有帮助 目录 一 准备工作 二 创建一个单张图预定义目标识别的应用 三 用户自定义目标识别应用实现 四 模型动画
  • Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)

    一 使用插件pdfh5预览pdf 参考文档 pdfh5 npm 项目相关依赖版本信息 预览效果如下图所示 1 上下滚动和缩放查看 2 左上角固定显示当前页码和总页数 3 右下角一键回到顶部按钮 4 在每页pdf上添加图片水印 安装插件 ya
  • 2023年最火副业;Python爬虫兼职,一周赚7800元,一天只要两小时

    现在学习Python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学Python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • Linux虚拟机CentOS永久修改分辨率的方法

    Linux虚拟机CentOS永久修改分辨率的方法 写在前面 1修改command的分辨率 2修改GUI的分辨率 写在前面 CentOS等Linux系统分为两大部分 底层的command模式 就是命令行模式 和GUI 图形化界面 两者各有其独
  • 快手极速版脚本代码(仅供参考)

    home sleep 1500 while click 快手极速版 sleep 5000 等待5s var num 200 想要循环几次 自己输入 nextVideo 1 num 下一个视频 function nextVideo i num
  • 百度离线SDK的调用(Linux+win)

    这两天弄了一下百度离线SDK的识别调用 分享一下心得 1 百度离线SDK的识别 获取条件 企业账号 使用认证后的企业帐号创建项目申请免费激活码 一台设备一个激活码 如果是一台电脑有双系统的话 亲测 同一个激活码并不好使 会报错 提示你激活码
  • 数据结构与算法总结

    文章目录 线性数据结构 1 数组 2 链表 2 1 链表简介 2 2 链表分类 2 2 1 单链表 2 2 2 循环链表 2 2 3 双向链表 2 2 4 双向循环链表 2 3 应用场景 2 4 数组 vs 链表 3 栈 3 1 栈简介 3
  • redis基础6——缓存穿透、缓存击穿、缓存雪崩

    文章目录 一 缓存穿透 双库为空 1 1 基础概念 1 2 解决办法 1 2 1 业务层校验 1 2 2 设置key过期时间 1 2 3 布隆过滤器 1 2 3 1 原理 1 2 3 1 1 哈希函数使用 1 2 3 1 2 布隆过滤器数据