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

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。

原文链接:
《一文彻底读懂一致性Hash 算法》

通过阅读本文你可以获得如下内容:

背景

​ 我们的场景就是大数据量的图片(或者缓存请求)能够在多个服务器之间进行负载均衡,实现在某个服务器发生故障时最小的影响系统,尽量的减少图片无法查看的请求。

​ 那么我们为什么要提到一致性 Hash 算法呢,简单的Hash 算法不能满足我们的需求吗?下面跟我一起来学习下一致性 Hash 算法是如何解决我们的问题的。

为什么要用一致性 Hash 算法?

​ 为什么要用一致性 Hash 算法,那肯定是因为它有优点,优点就是可以尽可能小的改变已存在的服务请求与处理请求服务器之间的映射关系,从而提高系统的可伸缩性和容错性

  1. 负载均衡: 一致性哈希算法能够在节点的增加或减少时最小化数据迁移的数量。在传统的哈希算法中,当节点发生变化时,几乎所有的数据都需要重新分配,导致大量的数据迁移。而一致性哈希只需要迁移一小部分数据,使得负载更加均衡。

  2. 容错性: 当系统中的节点发生故障或需要扩展时,一致性哈希算法能够最小化数据的丢失或迁移。新节点加入或旧节点离开时,只有部分数据需要重新映射,而不是整个数据集。

  3. 可伸缩性: 一致性哈希算法支持动态地添加或删除节点,而不需要重新计算大部分数据的映射关系。这使得系统更容易扩展,同时减少了系统维护的复杂性。

  4. 简化路由表: 在一致性哈希中,每个节点仅负责一小部分数据,因此路由表的大小相对较小。这降低了路由表的存储和维护成本。

  5. 分布式存储: 一致性哈希常被用于分布式存储系统,如分布式缓存、分布式文件系统等。它能够有效地处理大规模数据集的分片和分布,提高系统的性能和可扩展性。

总的来说,一致性哈希算法通过减小数据迁移的范围,提高了分布式系统的可伸缩性、容错性和负载均衡性,使得系统更具弹性和效率。

普通 Hash 算法有什么缺点?

​ 通过一个例子来看一下简单 Hash 算法有什么缺点。

​ 假设我们有三台缓存服务器A、B、C用于缓存图片,现在需要对请求过来的图片均匀的缓存在这三台服务器上,以便它们均摊缓存图片的请求。

​ 假设有三万张图片需要缓存,也就是每台服务器平均缓存一万张左右。如果我们以没有任何规律的方式把三万张图片平均的缓存在三台服务器上,也能满足我们的需求,但是如果这样做的话,会有什么问题呢?想想看?

问题就是:

​ 当我们访问某一张图片时,最差的情况是需要遍历三台服务器,从三万个缓存中找到我们所需要的缓存,这样的话其实也就失去了缓存的意义,并没有改善用户的体验。那么我们可以怎么做呢,原始的做法就是对图片名称进行 Hash 运算(假设图片名称是唯一的),将 Hash 后的结果与服务器数量进行取模操作,通过取模后的结果来决定缓存该存在哪个服务器上,那么我们可以使用如下公式来决定图片应该存在哪台服务器上?

其中 N 为服务器的数量。

hash(图片名称)%N

​ 因为图片的名称是不重复的,所以当我们对一个图片名称做相同的 Hash 计算时,得到的结果应该是不变的。

如果我们有三台服务器,使用哈希后的结果就是对3进行取余,那么余数一定是0、1、2三个中的一个,没错,正好对应我们的服务器A、B、C,所以如果求余的结果是0,那么我们就可以把图片缓存在服务器A上,相反,如果取余的结果是1,那就是缓存在服务器B上。

那么当我们访问任意一个图片时,只需要对图片名称进行上述的操作即可知道图片缓存在哪个服务器上。如果图片在对应的服务器上不存在,则证明对应的图片没缓存,也就不需要再去其它的服务器上查询了,通过这样的方法,就可以平均的把三万张图片分散的放在三台服务器上,而且当下次访问某张图片时,直接就能判断出当前图片所在的服务器,这样就能满足我们的需求了。

​ 当使用了上面的哈希算法之后还会有什么问题呢,试想一下,如果三台缓存服务器已经不能满足我们的缓存需求,那么我们是不是要增加一台,那么缓存服务器的数量就由3台变成4台了,此时如果仍然采用上述方法对同一张图片进行缓存,那么这张图片所在的服务器编号必定与原来三台服务器时产生的结果不一致,这种情况带来的后果就是当缓存服务器数量发生变动时,所有缓存的位置都要发生改变

​ 换句话说,当服务器数量发生改变时,所有缓存在一定时间内是失效的,当请求无法从缓存中读取到数据时,则会向后端服务器发送请求,同理,假设三台服务器其中有一台服务器发生了故障,无法进行缓存,那么我们就需要将故障机器移除,此时响应的缓存服务器数量也是发生了变化,以前缓存的图片也就失去了意义,此时大量图片缓存失效,造成缓存雪崩,此时缓存无法在分担压力,后端服务器将承受压力,整个系统也就有可能被压垮,所以我们要想办法不让这种情况发生,但是由于上述哈希算法本身的缘故,使用取模算法进行缓存时,这种情况是不可避免的,为了解决这些问题,一致性 Hash 算法也就应运而生了。

所以我们来回顾下使用简单 Hash 算法会产生的问题:

  • 当缓存服务器数量发生变化时,引起缓存大量失效,缓存雪崩,可能会使后端服务器压力变大而崩溃。
  • 当缓存服务器数量发生变化时,几乎所有的缓存位置都会发生变化,那我们怎样才能减少受影响的缓存呢?

​ 其实,这两个问题都可以使用一致性 Hash 算法解决,现在我们继续深入了解一下一致性 Hash 算法。

什么是一致性 Hash 算法?

​ 一致性哈希算法是1997年在论文《Consistent hashing and random trees》中被提出的,在分布式系统中应用非常广泛。一致性Hash 是一种 Hash 算法,简单的说就是在移除或者添加一个服务器时,此算法能够尽可能小的改变已存在的服务请求与处理请求服务器之间的映射关系,尽可能满足单调性的要求。

​ 在普通分布式集群中,服务请求与处理请求服务器之间可以一一对应,也就是说固定服务请求与处理服务器之间的映射关系,某个请求由固定的服务器去处理。这种方式无法对整个系统进行负载均衡,可能会造成某些服务器过于繁忙一直无法处理新来的请求,而另一些服务器则过于空闲,整体系统的资源利用率低,并且当分布式集群中的某个服务器宕机,会直接导致某些服务请求无法处理

​ 进一步的改进可以利用 Hash 算法对服务请求进行处理服务器之间的关系进行映射,以达到动态分配的目的。通过 Hash 算法对服务请求进行转换,转换后的结果对服务器节点值进行取模计算,取模后的值就是服务请求对应的请求处理服务器。这种方法可以应对节点失效的情况,当某个分布式集群节点宕机,服务请求可以通过 Hash 算法重新分配到其他可用的服务器上。避免了无法处理请求的情况出现。

​ 但这种方法的缺陷也很明显,如果服务器中保存有服务请求对应的数据,那么如果重新计算请求的 Hash 值,会造成大量的请求被重定位到不同的服务器而造成请求所需要的数据无效,这种情况在分布式系统中是难以接受的。一个设计良好的分布式系统应该具有良好的单调性,即服务器的添加与移除不会造成大量的哈希重定位,而一致性哈希恰好可以解决这个问题

​ 一致性哈希算法将整个哈希值空间映射一个虚拟的圆环,整个哈希空间的取值范围为 0~2 32 ^{32} 32-1 ,整个空间按顺时针方向。0~2 32 ^{32} 32-1,在零点方向重合。接下来使用如下算法对请求进行映射,将服务请求使用 Hash 算法算出对应的 Hash值,然后根据 Hash 值的位置沿圆环顺时针查找,遇到的第一个服务器就是所对应的处理请求服务器。当增加一台新的服务器,受影响的数据仅仅是新添加的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向遇到的第一台服务器)之间的数据,其它都不会受到影响。综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性可扩展性

​ 首先,一致性哈希算法是采用取模的方法,只是,刚才的取模算法是对服务器数量进行取模,那么我们只要不对服务器数量进行取模,而对一个常量进行取模不就可以了吗,所以一致性哈希算法是对2 32 ^{32} 32进行取模,我们把0-2 32 ^{32} 32次方想象成一个圆,就像钟表一样的圆,钟表的圆可以想象是圆上有60个点,而我们的这个圆是由2 32 ^{32} 32个点组成的圆,示意图如下:

圆的正上方的点代表0,0点右侧第一个点代表1,左侧第一个点代表2 32 ^{32} 32-1,我们把0-2 32 ^{32} 32-1之间的圆环称之为 Hash 环。

下面,跟我一起看下一致性 Hash 算法是怎么在这个圆上来体现的。

首先我们还是有三台服务器,分别是服务器A,服务器B,服务器C,那么在我们的生产环境中,我们对这三台服务器的 IP 地址进行 Hash,用 Hash 后的结果对2 32 ^{32} 32进行取模运算,得到的结果就是服务器的位置。

Hash(服务器IP地址)%2 32 ^{32} 32

通过这个公式计算的结果肯定是0-2 32 ^{32} 32-1之间的一个数,我们就用这个数代表服务器A。

然后我们用同样的方法,计算出服务器B,和服务器C的位置,表示如下。

假设三台服务器经过计算之后的位置如上图所示(理想情况下是这个样子,但是现实往往很无情)。

好了,到这里,我们已经把服务器与Hash环绑定到了一起,下面就是把数据绑定到 Hash环上,那么我们下面就用同样的方法把需要缓存的对象放到Hash环上。

还是按照刚才的例子,对三万张图片进行缓存,此时我们还是使用如下公式。

Hash(图片名称)%2 32 ^{32} 32

第一张图片映射的结果如下图所示(假设)。

那么图片1保存在哪台服务器上去呢,上面的图片会被缓存到服务器A上,为什么会这样呢?因为从图片1的位置开始,沿顺时针方向遇到的第一个服务器就是服务器A,所以上图会被缓存到服务器A上,如下图所示:

所以一致性 Hash 算法就是通过这种方法来判断对象该存储在哪台服务器上的,也就是将缓存服务器与缓存对象绑定到 Hash 环上之后,从被缓存的对象开始,顺时针方向遇到的第一台服务器就是缓存对象要存储的服务器,由于缓存对象对服务器 Hash 后的值是固定的,所以在服务器不变的情况下,一张图片必定会缓存在固定的服务器上,所以当下次访问该图片时,只要再次使用同样的哈希算法计算,即可获取出该图片在哪台服务器上,然后直接去对应的服务器上获取即可。

刚才的示例是一张图片,下面演示一下多张图片的位置。

图片1,图片4会缓存在服务器A上,图片2缓存在服务器B上,图片3缓存在服务器C上。

​ 经过上面的描述,我想同学们应该能够知道一致性 Hash 的原理了,所以同学们考虑一下,一致性 Hash 可以解决上面的两个问题吗?首先还是第一个问题,当服务器数量发生变动时,缓存会同一时间大量失效造成缓存雪崩,从而有可能引发系统的崩溃,那么使用一致性Hash 算法能够避免这个问题吗,下面我们来看一下。

假设服务器B出现故障,现在我们需要把服务器B移除掉,那么我们从 Hash 环上移除服务器B之后如下所示:

​ 在服务器B没有故障未被移除时,图片2应该是缓存在服务器B上,可是当服务器B有了故障被移除后,图片2按照顺时针方向遇到的第一个服务器就变成了服务器C,所以此时图片2就被缓存在服务器C中,也就是说,如果服务器B出现故障,图片2的缓存位置会发生变化。

​ 此时,图片3仍然会被缓存中服务器C中,图片1与图片4缓存在服务器A中,这与服务器B移除前后并不会有影响,这也就是 Hash 算法的优点,如果使用之前的 Hash 算法,服务器数量发生变化时,所有的缓存对象都会发生变化,而使用一致性哈希算法之后,服务器的数量如果发生变化,并不是所有的缓存都会失效,而只有部分缓存才会失效,所以这种情况下不至于所有的缓存失效,都在同一时间集中到后端服务器上。

思考一下:通过上面的学习,可以知道了一致性 Hash 算法带来的优点了,那么有什么缺点呢或者说有什么需要注意的点呢?这块你可以想到吗?

一致性 Hash 算法有什么缺点?

在这里也是给同学们举例说明。

在介绍一致性哈希时,我们是非常理想化的假设3台服务器均匀的分布在 Hash 环上,如下图所示:

但是往往现实不会如此,在实际的使用过程中,服务器有可能会被映射为如下图所示的情况:

聪明的你肯定想到如果发生了这种情况,那么缓存的对象可能会集中的缓存在一台服务器上,这也就是 Hash 环的倾斜,如下图所示:

​ 此时,如图所示,图片1,图片3,图片4,图片5都会缓存到服务器A上,图片2缓存中服务器B上,服务器C上没有图片,也就是说,服务器资源并没有理想化平均的被使用。最坏的情况下,如果此时服务器A发生故障,那缓存失效的对象也就达到了最大值,极端情况下也有可能造成后端服务器的崩溃。此时这种情况称之为 Hash 环的倾斜,那么怎么防止 Hash 环的倾斜呢,一致性hash算法使用虚拟节点来解决了这个问题,下面我们来看看。

如何最小化一致性 Hash算法带来的影响?

​ 还是按照我们说的,假设我们只有三台服务器,当我们把服务器映射到 Hash 环上的时候,很有可能发生 Hash 环偏斜的情况,当 Hash环偏斜以后,缓存往往会极度不平衡的分布在各个服务器上,聪明的你肯定想到了,要想均衡的将缓存分布在三台服务器上,那么只要这三台服务器尽可能多的均匀的分布在H ash 环不就行了吗,但是真实的服务器资源只有3台,我们怎么凭空让它多起来呢,没错,就是凭空让服务器的节点多起来,既然没有多余的真正的物理服务器节点,我们只能将现有的物理节点虚拟出来,这些由实际节点虚拟复制出来的节点被称为“虚拟节点”,加入虚拟节点之后的 Hash 环如下图所示:

虚拟节点是实际节点在 Hash 环上的复制品,一个实际节点可以复制多个虚拟节点

​ 从上图可以看出,ABC三台服务器分别虚拟出来一个虚拟节点,当然,如果你需要的话也可以虚拟出更多的节点,此时为了画图演示,我们各只虚拟出一个节点。

增加了虚拟节点的概念后,缓存的分布就均匀了很多,上图中,图片1,图片3缓存在服务器A,图片2,图片4缓存在服务器B,图片5缓存在服务器C,如果你还不放心的话,可以虚拟出更多的虚拟节点,以便减少 Hash环倾斜带来的影响,虚拟节点越多,Hash环的节点越多,缓存被均匀分布的可能就越大。

​ 所以,此时缓存对象已经均衡的分布在 Hash环上,如果在发生服务器故障,那么受影响的缓存对象就是发生故障的服务器逆时针方向到遇到的第一台服务器之间的数据,受影响的缓存对象大大减少。

总结

读到这了,不知道同学们收获了多少,如果没有记住,没关系,下面我来给大家总结一下开头的几个问题。

  • 为什么要用一致性 Hash 算法

    能够在服务器发生故障时最小化因为故障造成的影响,并且可以提升系统的可伸缩性。

  • 普通 Hash 算法有什么缺点

    其中一台服务器故障,或者新增服务器时,大量缓存同时失效造成缓存雪崩。

  • 什么是一致性 Hash 算法

    一致性 Hash 算法就是可以尽可能小的影响已经存在的请求与服务器的映射关系。

  • 一致性 Hash 算法有什么缺点

    Hash 环偏移。

  • 如何最小化一致性 Hash 算法带来的影响?

    使用虚拟节点。

好了,一致性哈希算法的原理就总结了这里,如果错误,欢迎赐教。如果感觉对你有帮助,欢迎点赞、评论、转发。

参考链接

  • 百度百科
  • 维基百科
  • 参考博客1
  • 参考博客2
  • 参考链接3

相关文章:

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接: 《一文彻底读懂一致性Hash 算法》 通过阅读本…...

Javaweb之Vue组件库Element的详细解析

4 Vue组件库Element 4.1 Element介绍 不知道同学们还否记得我们之前讲解的前端开发模式MVVM,我们之前学习的vue是侧重于VM开发的,主要用于数据绑定到视图的,那么接下来我们学习的ElementUI就是一款侧重于V开发的前端框架,主要用…...

IBM X3650M4安装ESXI6.5卡在/lsl_mr3.v00

环境:IBM X3650M4服务器双盘配置raid1,通过rufus制作启动U盘,安装VMware Vsphere 5.5系统 问题:卡在/lsi_mr3.v00界面无法往下运行(两台配置一样的机器遇到同样的问题) 解决方案: 直接在U盘根…...

【Python3】【力扣题】338. 比特位计数

【力扣题】题目描述: 题解:从0到n的整数,逐一统计二进制中1的个数,记录在一个新列表中。 【Python3】代码: 1、解题思路:Python函数。 知识点:bin(...):转为二进制字符串&#xff…...

Lubuntu 23.10用户可使用LXQt 1.4桌面

导读在众多 Lubuntu 用户的要求下,Lubuntu 开发人员决定将 LXQt 1.4 桌面环境向后移植到最新的 Lubuntu 23.10 (Mantic Minotaur) 版本。 是的,您没看错,您现在可以使用官方的 Lubuntu Backports PPA(个人软…...

语音识别入门——常用软件及python运用

工具以及使用到的库 ffmpegsoxaudacitypydubscipylibrosapyAudioAnalysisplotly 本文分为两个部分: P1:如何使用ffmpeg和sox处理音频文件 P2:如何编程处理音频文件并执行基本处理 P1 处理语音数据——命令行方式 格式转换 ffmpeg -i video…...

maven 将Jar包安装到本地仓库

window系统: 注意事项:在windows中,使用mvn指令将jar安装到本地仓库时,一定要将相关资源使用“"”包裹上,不然会报下面的错: mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…...

Django ORM查询之聚合函数、聚合查询(aggregate)、分组查询(annotate)

django 版本 3.2 python 3.6.8 一、聚合函数 常见的五个聚合函数: Avg (Average) : 平均值Max (Maximum) : 最大值Min (Minimum) : 最小值Sum (Summary) : 求和Count : 个数 导入语句: from django.db.models import Avg, Max, Min, Sum, Count, Q, …...

构建个性化预约服务:预约上门服务系统源码解读与实战

随着社会的发展,预约上门服务系统在满足用户需求、提升服务效率方面发挥着越来越重要的作用。在本文中,我们将深入研究预约上门服务系统的源码,通过实际的技术代码示例,揭示系统内部的关键机制,以及如何在实际项目中应…...

『RabbitMQ』入门指南(安装,配置,应用)

前言 RabbitMQ 是在 AMQP(Advanced Message Queuing Protocol) 协议标准基础上完整的,可复用的企业消息系统。它遵循 Mozilla Public License 开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,建立在 Erlang …...

2311skia,01渲染架构

一,渲染层级 从渲染流程上分,Skia可分为如下三个层级: 1,指令层:SkPicture,SkDeferredCanvas->SkCanvas 这一层决定要绘图的操作,绘图操作的预变换矩阵,当前裁剪区域,在哪些层上绘图,层的生成与合并. 2,解析层:SkBitmapDevice->SkDraw->SkScan,SkDraw1Glyph::Proc 这…...

天线的负载

在电磁学和通信工程领域,天线的负载(Load)通常指连接到天线的部分或元件,该部分在电学上对天线的输入产生影响。天线的负载可以是被连接到天线的阻抗元件、电感、电容、电阻或其他电性元件。 具体而言,天线的负载是指…...

Java学习路径:入门学习、深入学习、核心技术,操作案例和实际代码示例

学习路径:入门学习、深入学习、核心技术, 每个主题都包括很多的操作案例和实际代码示例。 a. 入门学习: 1. 基础语法: 变量和数据类型: // 定义和初始化变量 int age 25;// 不同数据类型的声明 double price 19.99…...

Python武器库开发-前端篇之CSS元素(三十二)

前端篇之CSS元素(三十二) CSS 元素是一个网页中的 HTML 元素,包括标签、类和 ID。它们可以通过 CSS 选择器选中并设置样式属性,以使网页呈现具有吸引力和良好的可读性。常见的 HTML 元素包括 div、p、h1、h2、span 等,它们可以使用 CSS 设置…...

作为Java初学者,如何快速学好Java?

作为Java初学者,如何快速学好Java? 开始的一些话 对于初学者来说,编程的学习曲线可能相对陡峭。这是正常现象,不要感到沮丧。逐步学习,循序渐进。 编程是一门实践性的技能,多写代码是提高的唯一途径。尽量…...

LuatOS-SOC接口文档(air780E)--pwm - PWM模块

pwm.open(channel, period, pulse, pnum, precision) 开启指定的PWM通道 参数 传入值类型 解释 int PWM通道 int 频率, 1-1000000hz int 占空比 0-分频精度 int 输出周期 0为持续输出, 1为单次输出, 其他为指定脉冲数输出 int 分频精度, 100/256/1000, 默认为100,…...

基于51单片机的人体追踪可控的电风扇系统

**单片机设计介绍, 基于51单片机超声波测距汽车避障系统 文章目录 一 概要概述硬件组成工作原理优势应用场景总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于51单片机的人体追踪可控的电风扇系统介绍 概述 该系统是基于51…...

使用数据集对SegFormer模型进行微调以改进自动驾驶车辆的车道检测-附源码下载

SegFormer:细分严重影响了高级驾驶辅助系统的开发。它在自动驾驶汽车技术的快速发展中发挥了关键作用。它由多个复杂的组件组成。对于任何在道路上行驶的车辆来说,车道检测至关重要。车道是道路上的标记,有助于区分道路上的可行驶区域和不可行驶区域。当前一代有多种车道检测…...

【微服务专题】SpringBoot自动配置简单源码解析

目录 前言阅读对象阅读导航前置知识什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】0.5 小结 笔记正文一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注…...

分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?

hbasehive分布式存储数据恢复环境: 16台某品牌R730XD服务器节点,每台物理服务器节点上有数台虚拟机,虚拟机上配置的分布式,上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检: 数据库文件被误删除…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...