Redis哈希槽机制的实现
Redis哈希槽机制的实现
Redis集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈希值对16384取模,以确定该键应该放在哪个哈希槽中。这样,每个键都有唯一的槽位标识,确保了数据的均匀分布。

Redis选择哈希槽而非一致性哈希,是因为它简化了扩容和缩容操作。与一致性哈希不同,Redis不需要为每个键维护复杂的环形结构,槽位划分让Redis只需关心槽的重新分配,而不必频繁移动数据。这种设计在保持高效性和一致性的同时,便于实现快速的节点管理。
哈希槽机制
在Redis集群中,总共设定了16384个固定的哈希槽(Hash Slot),每个槽用于存放数据的一部分。Redis集群并没有像一致性哈希那样直接将数据分布到节点上,而是先将数据映射到固定数量的槽中,再将这些槽分配给不同的节点。这种间接的映射方式既减少了数据重新分配的频率,又显著提高了集群的扩展性和管理性。

为什么选择16384个槽?
16384这个数量既保证了足够的分布精度,又不会引入过多的管理开销。槽的数量固定,可以避免动态增加槽位所带来的复杂性。使用16384作为基数的一个重要原因是,Redis在集群层面上需要快速计算数据应该属于哪个槽,基于大多数机器的运算能力,这个数能够平衡操作成本和系统性能。
哈希槽的工作流程
当向Redis集群插入一个键值对时,Redis会首先计算该键的CRC16哈希值,并对16384取模,从而确定该键属于哪个哈希槽。之后,Redis将该哈希槽映射到对应的节点上。这样做有几个优点:
- 均匀分布:16384个槽位确保了数据在不同节点间可以更均匀地分配,避免数据和负载集中在某些节点。
- 可伸缩性:当有新的节点加入或退出集群时,Redis只需重新分配一部分槽位,不必对整个数据集进行重新分片,大幅降低了数据迁移的成本。
- 高效路由:通过哈希槽机制,客户端可以在本地预先缓存槽和节点的映射关系,从而实现请求的快速路由,进一步减少了网络延迟和开销。
槽的分配与故障处理
在运行时,每个节点会被动态分配若干哈希槽,这样做使得Redis在节点发生故障时,可以将原本属于该节点的槽重新映射到其他节点,实现数据的高可用性。在集群扩容、缩容或节点故障恢复时,只需重新分配哈希槽而不需要重新计算键的位置,这显著提高了集群的弹性。
与一致性哈希的区别
哈希槽机制与一致性哈希不同,后者需要为每个键定位到具体节点,而哈希槽的引入使Redis只需在节点间重新分配16384个槽即可。Redis避免了复杂的环状映射和大量的数据迁移,同时减少了对硬件和网络的压力。这种机制非常适合大型分布式缓存系统,在保障一致性的同时,提供了更快的读写性能和更灵活的集群管理。
哈希槽的分布
在Redis集群中,哈希槽的分布是实现数据均衡、高效路由和扩展管理的关键环节。Redis在集群设计时,将数据分为固定的16384个哈希槽,并通过哈希槽到节点的映射,实现了节点间数据的灵活管理和分布式高可用。

哈希槽的计算与分布原理
Redis将集群中的键映射到哈希槽,这个过程通过哈希函数(CRC16算法)来实现。对于每个键,Redis计算其哈希值并对16384取模,将该键映射到一个特定的槽中。这样,每个键都有唯一的槽位索引,而槽位则负责存储特定范围的数据。16384个槽确保了足够的分布粒度,即使有大量数据,也可以实现较均匀的分布。
哈希槽与节点的映射关系
Redis集群中的每个节点负责若干个哈希槽,每个节点可分配一个或多个槽。槽的数量分配可以根据节点的性能或集群配置需求来调整,这样可以灵活控制负载分布。
例如,在一个三节点的Redis集群中,如果平均分配,每个节点负责约5461个槽。但在实际场景中,Redis允许不均匀分配,以适应节点间的负载差异。例如,一个节点性能较高,可以分配更多槽,来承担更多的请求处理。哈希槽到节点的映射也支持动态调整,当新节点加入时,可以将部分槽重新分配给新节点,减轻现有节点的压力,从而达到负载均衡。
槽的分配与数据迁移
Redis使用“槽平衡”策略来管理节点间的哈希槽分配,并在集群拓展或收缩时,通过将槽从一个节点迁移到另一个节点实现动态调整。例如,当有新节点加入时,Redis会将部分槽从现有节点迁移到新节点,这种迁移是按槽位粒度进行的,不会影响数据的整体分布。数据迁移的粒度仅限于哈希槽,这种细化的分布方式使得每次迁移的量相对较小,减少了迁移对集群性能的影响,避免大规模的数据重新分片。
哈希槽的管理和故障处理
Redis的哈希槽分布设计也支持集群的高可用性。当一个节点发生故障时,其负责的哈希槽可以自动切换到其他节点,通过主从复制快速恢复数据服务。Redis哨兵机制会自动检测和调整节点之间的哈希槽映射,以保证即使在部分节点不可用的情况下,集群依然能够正常工作。
数据分片
数据分片是Redis集群实现高效数据存储和分布式处理的核心机制。通过数据分片,Redis可以将数据分布到多个节点上,使得集群能在大规模数据和高并发访问场景下仍保持性能和可扩展性。
数据分片的基本原理
在Redis集群中,数据分片是通过哈希槽机制实现的。整个集群共有16384个固定的哈希槽(Hash Slots),每个槽对应一部分数据。Redis将每个键的哈希值对16384取模,以此确定其归属的哈希槽。每个哈希槽则被分配到集群中的某个节点,这种方式将数据从键到槽、再到节点的分层映射,使数据分布更加灵活,便于管理。
分片的目的和优势
- 负载均衡:通过数据分片,Redis可以将不同的哈希槽分布到多个节点上,这样每个节点只需处理其负责的槽位对应的数据请求。负载均衡是Redis分片的核心目的,分布到不同节点的数据分片避免了单点瓶颈,提升了整个集群的处理能力。
- 分布式扩展:数据分片让Redis可以根据需求进行横向扩展,集群可以通过增加节点来分担更多的数据和请求。这种可扩展性对动态负载较高的系统尤为关键,可以避免在某些高峰时段某一节点过载的问题。
- 故障隔离与高可用性:Redis通过分片实现了数据的冗余和隔离。每个分片的数据可以通过主从复制机制,在多个节点上保留副本。如果某一节点失效,其他节点可以接管其数据,保障数据的可用性和集群的连续性。
数据分片与节点映射
数据分片依赖于哈希槽到节点的映射关系。Redis允许动态分配哈希槽至不同节点,节点可以根据其计算和存储能力,承担不同数量的哈希槽。例如,一个性能较高的节点可以承担更多哈希槽,从而分配到更多的数据。
这种映射也支持动态调整。当Redis集群扩展时,新加入的节点会接管一些哈希槽,Redis会通过槽迁移(Slot Migration)将部分数据从旧节点迁移到新节点。这种分片迁移粒度很小,仅限于哈希槽级别,不涉及对整个数据的重新分布,迁移成本低,不会影响现有服务的正常运作。
数据分片与访问路由
Redis的数据分片设计使得客户端请求可以快速定位到正确的节点。客户端可以通过哈希算法提前计算出键所属的哈希槽,借助哈希槽和节点映射表将请求直接路由到目标节点。这种路由设计不仅减少了中间代理的开销,还降低了延迟,提高了请求的响应速度。
为进一步提升访问效率,Redis还允许在客户端缓存哈希槽到节点的映射关系。在映射关系没有变化的情况下,客户端直接访问分片所在的节点即可。如果哈希槽迁移或节点发生变化,客户端可以通过集群的ASK或MOVED指令重新更新路由信息,从而保持请求的高效性和一致性。
分片带来的挑战与解决方案
尽管数据分片带来了诸多好处,但也增加了一些实现复杂性:
- 一致性问题:由于数据分布在多个节点上,保持数据一致性是分片面临的主要挑战。Redis通过主从复制和哨兵机制来确保一致性。主节点处理写请求,而从节点复制主节点数据,确保数据在故障时的可恢复性。
- 分布式事务:在分片环境中,跨节点的事务操作变得复杂。Redis事务是局部事务,仅在单节点内保证一致性。对于需要跨分片操作的数据,通常建议应用层通过业务逻辑处理,以减少对Redis集群的事务依赖。
- 数据热点:在分片设计中,某些槽位或键可能会集中请求,形成数据热点。Redis通过动态分配槽位、增加复制节点等方法来平衡热数据的访问压力,避免单一节点过载。
数据迁移过程
在Redis集群中,数据迁移是当节点加入、退出或发生故障时,为保持数据平衡和高可用性而进行的过程。数据迁移机制确保Redis集群在扩展和收缩时,能够动态调整节点负载,以实现平稳的负载均衡,同时保证数据的一致性和完整性。
1.Redis数据迁移的场景
数据迁移在Redis集群的以下几种情境中进行:
- 节点扩容:当新的节点加入集群时,为了实现负载均衡,需要将部分数据迁移到新节点上。扩容后,Redis重新分配哈希槽,以减少现有节点的负载。
- 节点缩容或失效:当节点离开集群(例如进行缩容,或者节点发生故障)时,其他节点需要接管该节点的数据,以避免数据丢失和访问失败。
- 故障恢复:如果节点故障恢复上线,Redis会重新分配其需要承担的槽位,以恢复原有数据分布。
2.数据迁移的基本流程
Redis数据迁移的核心在于哈希槽的转移,具体步骤如下:
- 选择迁移的哈希槽:在迁移开始前,Redis会根据集群的负载情况、节点的容量和槽位分配策略,选择需要迁移的哈希槽。一般来说,迁移的粒度为哈希槽,避免单键迁移带来的开销,同时也降低了全量数据迁移的复杂性。
- 数据转移:迁移发起节点会使用
MIGRATE命令,将所选哈希槽内的键值对发送到目标节点。在这个过程中,Redis会锁定对应哈希槽,防止数据不一致问题。每次迁移的数据量可控,确保在迁移过程中对正常服务的影响最小。 - 数据校验:目标节点接收到数据后,会进行数据一致性校验,确保数据完整传输。Redis的
MIGRATE命令使用了超时和重试机制,防止由于网络故障或节点异常导致的数据不一致问题。 - 更新哈希槽映射表:数据迁移完成后,Redis会将哈希槽的映射关系更新到全局哈希槽表中,以确保客户端路由请求时能够找到正确的节点。如果客户端访问了正处于迁移中的槽位,Redis会返回
MOVED或ASK响应,指示客户端重定向请求到新节点。
3.Redis数据迁移的具体实现细节
- 迁移的原子性与一致性保障:数据迁移的每个操作是基于单槽的原子性,这意味着每次迁移的最小单位是哈希槽,从而减少了部分迁移数据可能被遗漏或重复的问题。此外,迁移过程中Redis会锁定目标哈希槽,并在源节点上设置临时迁移标记,避免数据同步冲突。
- 迁移期间的流量处理:在数据迁移时,源节点会继续响应请求。如果客户端请求被发送到尚未完成迁移的源节点上,Redis会通过返回
ASK指令,引导客户端重定向到新的目标节点。客户端也会更新其本地的槽位到节点映射,避免后续请求被错误路由。 - 渐进迁移策略:Redis通常使用渐进式迁移(Incremental Migration),即将迁移过程分批执行,避免大批量数据一次性迁移带来的性能开销。这种分批机制确保迁移任务可以逐步完成,降低对集群响应速度的影响。
4.数据迁移的容错机制
在迁移过程中,Redis集群内置了容错机制,以保证数据的可靠性。若在迁移期间出现网络中断或节点故障,Redis会自动重试迁移,并在重试次数达到一定阈值后,执行回滚操作,将哈希槽恢复到原始节点上。这种容错设计确保了即使在复杂的网络环境或节点状态下,迁移操作也能尽可能保证数据的一致性和完整性。
5.客户端重定向与一致性
为了确保迁移期间的请求一致性,Redis集群采用了客户端重定向机制。在槽位更新之前,如果客户端请求的槽正处于迁移过程中,Redis会返回MOVED或ASK指令,指示客户端直接访问新节点。客户端也会在后续访问中使用最新的哈希槽映射,避免频繁的错误路由。
6.数据迁移对集群性能的影响
数据迁移不可避免会对集群性能带来一定的影响。Redis通过控制单次迁移的数据量、分批处理迁移过程,降低迁移对主业务的影响。迁移过程可以根据集群配置选择限速模式,例如设置每次迁移的数据条数,以平衡数据迁移的速度和集群的服务能力。
与一致性哈希的比较
一致性哈希是一种广泛应用于分布式系统中的数据分布机制,它旨在解决传统哈希方法在扩展和缩减过程中所面临的数据不均衡和迁移成本高的问题。Redis使用的哈希槽机制虽然在许多方面与一致性哈希相似,但二者在设计理念、数据分布方式、节点管理和扩展性等方面存在显著差异。
1. 设计理念
一致性哈希:一致性哈希的核心思想是通过将节点和数据映射到一个逻辑的环形空间中来进行分布。在这个模型中,数据根据哈希值被映射到环上的某个位置,节点也是通过哈希算法确定在环上的位置。当节点增加或减少时,只需要对影响到的少量数据进行重新映射,从而降低数据迁移的成本。这种设计极大地提高了扩展性。
Redis哈希槽:与一致性哈希不同,Redis使用的是一种静态分配的哈希槽机制。Redis集群将数据划分为固定的16384个哈希槽,数据通过哈希函数映射到相应的槽中,再将槽分配给不同的节点。虽然Redis支持动态添加或移除节点,但每次修改集群结构时都可能需要迁移一定数量的哈希槽,这在某些情况下会导致一定的性能开销。
2. 数据分布方式
一致性哈希:一致性哈希在节点添加或移除时,通过对哈希环的重新映射来决定数据的归属。在节点减少时,只有原本分配给该节点的部分数据需要迁移到其他节点,而其他节点的数据不受影响。这样,数据的重新分配是局部的,最大限度减少了迁移的数据量。
Redis哈希槽:Redis的哈希槽机制虽然可以通过将哈希槽重新分配给新节点来实现动态扩展,但迁移的粒度是哈希槽而非单个键。这意味着在节点增加或减少时,可能会涉及到多个槽的数据迁移,从而导致更高的网络开销和延迟。尽管Redis通过渐进迁移来优化这一过程,但相比一致性哈希的高效性,Redis的迁移方式在某些场景下仍然显得繁重。
3. 节点管理与扩展性
一致性哈希:一致性哈希允许系统在节点负载变化时动态调整数据分布。当新节点加入时,只需在哈希环中找到其位置并移动相邻节点一部分数据;同理,节点退出时,仅需重新映射受影响的数据。由于该机制对数据迁移的影响局限于少量数据,因此具有很好的扩展性和高效性。
Redis哈希槽:在Redis中,虽然通过动态添加节点可以实现扩展,但这一过程需要对多个哈希槽进行管理与重新分配。当新节点加入时,Redis会根据当前负载情况决定需要迁移哪些哈希槽,这样的操作虽然有助于负载均衡,但整体上比一致性哈希显得更复杂,并且迁移的数据量较大。
4. 故障处理与高可用性
一致性哈希:在一致性哈希模型中,当节点发生故障时,故障节点分配的数据会被快速迁移到其他节点,而未受影响的数据仍然可以正常访问。这种特性使得一致性哈希在高可用性场景下表现优越。
Redis哈希槽:Redis集群通过主从复制和哨兵机制来提高高可用性。当节点失效时,其哈希槽可以通过主从复制快速转移到其他节点,保证服务不受影响。然而,Redis的槽迁移过程相对一致性哈希来说更加复杂,尤其是在节点动态变化时,可能会造成短暂的服务不可用。
5. 适用场景
一致性哈希:一致性哈希适合对节点频繁变动、需要高扩展性的场景,例如动态的分布式缓存系统、负载均衡等。其低迁移成本和高效的资源利用,使得在变化频繁的环境中保持数据均衡成为可能。
Redis哈希槽:Redis的哈希槽机制则更加适合对数据结构和访问模式有较高要求的场景,例如需要在多个节点上实现高效的读写操作的应用。Redis的设计使其在低延迟、高并发的访问需求下表现优越,尽管在某些动态扩展的场景下,槽迁移的成本会增加。
高可用性和容错机制
在分布式系统中,高可用性和容错机制是保障系统稳定性和可靠性的重要设计目标。对于Redis集群而言,高可用性确保了在节点故障或网络问题发生时,系统依然能够持续提供服务;而容错机制则确保系统能够有效应对和恢复异常情况。以下将深入探讨Redis在高可用性和容错机制方面的设计原理、实现方式和优势。
高可用性
高可用性(High Availability, HA)是指系统在一定时间内保持可用状态的能力,即使在部分组件发生故障的情况下,仍然能够继续提供服务。对于Redis集群,高可用性的实现主要依赖以下几个关键机制:
1. 主从复制(Master-Slave Replication)
在Redis集群中,每个主节点(Master)可以有多个从节点(Slave),从节点负责实时复制主节点的数据。这种主从关系不仅提高了数据的可靠性,还提升了读取性能:
- 数据冗余:从节点通过异步复制主节点的数据,确保在主节点发生故障时,从节点可以接管其工作,从而避免数据丢失。
- 读写分离:通过将读取请求分发到从节点,主节点专注于处理写请求,提高了系统的吞吐量。
2. 哨兵机制(Sentinel)
Redis的哨兵机制是实现高可用性的关键组件。哨兵不仅负责监控主从节点的状态,还能在主节点出现故障时自动进行故障转移(Failover):
- 状态监控:哨兵会定期检测主节点和从节点的健康状态,如果发现主节点不可用,便会启动故障转移。
- 自动故障转移:在故障转移过程中,哨兵会选择一个从节点提升为新的主节点,并更新集群的节点配置,保证系统能在故障后快速恢复服务。
- 客户端通知:故障转移完成后,哨兵会向客户端发送通知,确保客户端能及时获取到新的主节点地址。
容错机制
容错机制(Fault Tolerance)是指系统在出现部分组件故障时,能够自动恢复并继续正常工作的能力。Redis的容错机制主要通过以下手段实现:
1. 数据持久化
Redis支持两种持久化方式:RDB(快照)和AOF(追加文件)。这两种方式确保了即使在系统崩溃或重启后,数据也能得到有效恢复:
- RDB快照:通过定期将内存中的数据快照保存到磁盘,Redis能在重启时快速加载数据。虽然RDB持久化会丢失未保存的操作数据,但其恢复速度快,适合高性能场景。
- AOF追加文件:通过将每次写操作追加到日志文件中,Redis在重启时可以重放这些操作来恢复数据。AOF可以配置为每次写入后、每秒或从不同步,提供了更高的数据安全性,但恢复速度相对较慢。
2. 数据一致性保障
Redis通过主从复制和哨兵机制,确保在节点故障时能够快速恢复数据一致性。Redis的复制是异步的,但在数据写入前会将数据同步到从节点,以减少故障转移时可能的数据丢失。
- 最终一致性:Redis使用异步复制来提高性能,但最终保证所有从节点与主节点数据一致。这一设计确保了即使在故障发生时,仍然能在短时间内恢复到最新状态。
3. 跨区容错
对于大型分布式系统,单一数据中心的故障可能导致整个系统不可用。Redis的集群可以通过跨多个数据中心部署,实现区域冗余,从而提高系统的容错能力。
- 区域备份:在不同数据中心部署多个Redis实例,并使用哨兵机制监控与备份,可以在某一区域发生故障时迅速切换到其他区域的备份系统,确保业务的连续性。
高可用性与容错机制的综合优势
- 业务连续性:通过主从复制和故障转移机制,Redis确保在节点故障时,系统依然能够提供服务,从而降低了业务中断的风险。
- 数据安全性:通过持久化和异步复制,Redis在故障发生时最大程度地减少数据丢失,同时在系统重启时迅速恢复。
- 灵活性与扩展性:Redis的高可用性和容错机制支持动态扩展与负载均衡,允许系统根据流量变化进行节点的增加和删除,以适应不断变化的业务需求。
想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长
Java技术小馆官网
https://www.yuque.com/jtostring
相关文章:
Redis哈希槽机制的实现
Redis哈希槽机制的实现 Redis集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈…...
docker pull 提示timeout
通过命令行拉取对应的mysql版本提示网络超时。 开始排查,首先确认是否能浏览器访问。ok的,可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…...
(超详细) ETL工具之Kettle
Kettle简介 kettle最早是一个开源的ETL工具,后命名为Pentaho Data Integration。由JAVA开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道,可对接包括传统数据库、文件、大数据平台、接口、流…...
Android第三次面试总结(网络篇)
在计算机网络领域,网络模型是理解通信原理的基础框架。本文将详细解析 OSI 参考模型和 TCP/IP 模型的分层结构、核心功能及实际应用,并通过对比帮助读者建立完整的知识体系。 一、OSI 参考模型:七层架构的理论基石 OSI(开放系统…...
国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!
1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码,或其他文字的字节编码,可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件,安装插件方法参考:扩展管理 在编辑器中选中文本,选择扩展 -> …...
random_masking 函数测试
文章目录 1. description2. excel3. pytorch code 1. description 功能:按一定比例的随机部分样本,简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1: 用了均匀分布,并且按照一定比例,取前prob概率来…...
TDengine 中的流式计算
简介 TDengine 中的流计算,功能相当于简化版的 FLINK , 具有实时计算,计算结果可以输出到超级表中存储,同时也可用于窗口预计算,加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…...
Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s中的组件
1.namespace Namespace 用于将集群资源划分为不同的逻辑组,方便管理和隔离 kubectl get namespace 查看所有逻辑组 kubectl describe namespace <namespace-name> 查看某个逻辑组信息详情 kubectl create namespace ... 创建逻辑组 kubectl delete names…...
JVM的一些知识
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…...
【安全运营】用户与实体行为分析(UEBA)浅析
目录 用户与实体行为分析(UEBA)简介一、UEBA的核心概念1. 行为基线建立2. 异常检测3. 风险评分4. 上下文关联 二、UEBA的应用场景1. 内部威胁检测2. 外部威胁应对3. 合规性和审计支持 三、UEBA的技术实现1. 大数据技术2. 机器学习算法3. 可视化工具 四、…...
sql小记,20250319
ps:基于sqlserver 一、绩效管理系统表设计 1.表设计 Users用户表:包含id,用户名,密码。 AppraisalBases评价(职位基数)表:包含职位id,职位年终奖基数 AppraisalCoeffcients评价系数表:包含类别id, 类别&…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹
引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...
C#的简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式是一种创建型设计模式,主要将对象的创建和使用分离,使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式,以下是 C# 实现的三个案例: 简单工厂模式 简单工厂模式通过一个工厂类来创建…...
用hexo初始化博客执行hexo init时碰到的问题
用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…...
4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)
OSI七层模型:网络世界的"七重天"生存指南(附快递小哥版图解) “如果你觉得网络分层很抽象,那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白:网络通信就像送外卖 假设你要给隔壁妹子送奶…...
AI训练如何获取海量数据,论平台的重要性
引言:数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天,数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法,还是开发自动驾驶系统,都需要海量、多样化的数据支持。 然而,获…...
Axure高级功能深度解析一一高效原型设计的利器
Axure作为一款专业的原型设计工具,凭借其强大的功能和灵活的交互设计,成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能,帮助大家更好地利用这款工具,提升原型设计的效率和质量。 一、Axure高级功能概览 • 变量管…...
QT国产化系统软件开发
一、国产操作系统 1、鸿蒙HarmonyOS NEXT 核心架构 采用自研鸿蒙内核,完全脱离Linux与AOSP代码,基于分布式架构实现跨设备资源虚拟化整合,支持动态调度多终端硬件能力。通过分布式软总线技术(D-Bus)实现低时延…...
Git 使用SSH登陆
一、SSH介绍 SSH连接相比于HTTP连接会简单一点,因为SSH连接通过了私钥与公钥进行身份认证,这样就不需要像HTTP一样,每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的,通过命令即可生成一个私钥和一个…...
织梦DedeCMS修改文章【标题、短标题、关键词】长度限制
在后台虽然可以设置标题的长度,但是数据库的字段固定是60个字符,短标题是36字符,关键词30字符,所以这里教大家修改一下织梦DedeCMS修改【标题】【短标题】【关键词】长度限制 一、后台配置 1、进入dede后台管理 -> 系统 ->…...
Powershell WSL部署ubuntu22.04.5子系统
前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl...
umi自带的tailwindcss修改为手动安装
1》为什么改为手动? 主要是为了解决这个报错问题,虽然重新运行也可解决,但是总是要运行2-3次,比较麻烦 2》如何手动 1,先在devDependencies下安装这两个包 pnpm install postcss8.5.1 -D "autoprefixer"…...
Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战
一、问题背景与实现难点 在Android 13横屏设备开发中,系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧,这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现,Android 13将相关逻辑迁移至Launche…...
基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程
1. 安装k3s集群 1.1 单节点快速部署 # 使用root或sudo权限执行 curl -sfL https://get.k3s.io | sh -# 验证安装 sudo kubectl get nodes # 输出应为Ready状态 sudo systemctl status k3s1.2 配置kubectl权限(可选) mkdir -p ~/.kube sudo cp /etc/r…...
SQL Server数据库简介及应用
SQL Server以高性能、高可用性著称,支持Windows/Linux跨平台部署,满足混合云需求。其内存优化表、列存储索引加速数据处理,AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密,符合企业合规要求。与Azure无缝集成&#…...
麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0
国产自主可控服务器需要访问RocketMQ消息队列,最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题,记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…...
【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
使用码云搭建CocoaPods远程私有库
一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…...
