深入理解 Redis 设计与集群管理

redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和实时分析等场景。随着业务需求的增长,如何有效地管理和扩展 Redis 实例成为了开发者关注的重点。本文将围绕 Redis 的核心设计思想、常见问题及其解决方案展开讨论,并深入介绍 Redis 集群模式的工作原理与应用场景。通过阅读本文,您不仅能理解为什么 Redis 被设计为单线程模型以及这种设计带来的优势,还能了解到 Bigkey 对 Redis 性能的影响及应对策略。此外,我们还会探讨 Redis 提供的不同集群模式,包括主从复制、哨兵模式以及 Redis Cluster,帮助您根据实际需要选择合适的部署方案。

1.Redis 为什么设计成单线程的?

Redis 设计成单线程的主要原因是为了简化实现并提高性能。具体来说,单线程的设计有以下几个优点:

  1. 避免上下文切换和竞争条件:多线程环境下,线程之间的切换和同步机制会带来额外的开销。单线程模型避免了这些问题,使得 Redis 的执行更加高效。

  2. 降低复杂性:单线程模型使得 Redis 的内部实现更加简单,减少了潜在的 bug 和复杂性,便于维护和开发。

  3. 高效的 I/O 多路复用:Redis 使用了 I/O 多路复用技术(如 epoll、kqueue 等),可以在单线程中处理大量的并发连接,充分利用 CPU 资源。

  4. 原子性操作:由于 Redis 是单线程的,所有的操作都是原子性的,不需要额外的锁机制来保证数据的一致性。

  5. 性能瓶颈通常在内存和网络:对于 Redis 来说,性能瓶颈通常在于内存访问速度和网络 I/O,而不是 CPU 的计算能力。因此,单线程模型已经能够很好地满足 Redis 的性能需求。

当然,Redis 6.0 引入了多线程来处理网络 I/O,以进一步提高性能,但核心的数据操作仍然是单线程的。这种设计在保证简单性和高性能的同时,也能够满足大多数应用场景的需求。

2.什么是 bigkey?会存在什么影响?

Bigkey 是指在 Redis 中存储的某个 key 对应的 value 特别大,通常是指以下几种情况:

  • 一个字符串类型的 value 非常大(例如几百 MB 甚至更大)。
  • 一个列表、集合、哈希或有序集合中的元素数量非常多(例如几十万甚至上百万个元素)。

Bigkey 的影响

Bigkey 会对 Redis 的性能和稳定性产生显著的负面影响,主要包括以下几个方面:

  1. 内存占用过高

    • Bigkey 会占用大量的内存,可能导致 Redis 实例的内存使用率过高,甚至触发内存淘汰策略(如 LRU)或 OOM(Out Of Memory)错误。
  2. 阻塞操作

    • 对 Bigkey 的操作(如删除、遍历、序列化等)可能会非常耗时,导致 Redis 单线程阻塞,影响其他请求的响应时间。
    • 例如,删除一个包含百万个元素的列表或集合时,可能会导致 Redis 长时间无法处理其他请求。
  3. 网络带宽压力

    • 在分布式 Redis 环境中,Bigkey 的传输会占用大量网络带宽,导致网络延迟增加,影响集群的整体性能。
  4. 数据迁移问题

    • 在 Redis 集群中进行数据迁移时,Bigkey 会导致迁移时间过长,甚至引发迁移失败或集群不稳定。
  5. 持久化性能下降

    • 在生成 RDB 快照或 AOF 重写时,Bigkey 会导致持久化过程变慢,增加主线程的阻塞时间。

如何发现 Bigkey

  1. 使用 Redis 自带的 redis-cli --bigkeys 命令扫描 Bigkey。
  2. 使用 MEMORY USAGE 命令查看某个 key 的内存占用。
  3. 通过监控工具(如 Redis Monitor、Prometheus 等)分析内存使用情况。

如何解决 Bigkey 问题

  1. 拆分 Bigkey

    • 将 Bigkey 拆分为多个小的 key。例如,将一个大的哈希表拆分为多个小的哈希表,或者将一个大的列表拆分为多个小的列表。
  2. 使用合适的数据结构

    • 根据业务场景选择合适的数据结构。例如,如果需要存储大量数据,可以考虑使用分页或分段的方式。
  3. 定期清理

    • 定期清理不再使用的 Bigkey,避免内存浪费。
  4. 优化业务逻辑

    • 避免在业务逻辑中生成 Bigkey,例如限制单个 key 的数据量或使用分布式存储方案。
  5. 使用异步删除

    • 在 Redis 4.0 及以上版本中,可以使用 UNLINK 命令异步删除 Bigkey,避免阻塞主线程。

通过以上方法,可以有效减少 Bigkey 对 Redis 性能的影响,提升系统的稳定性和响应速度。

3.熟悉Redis哪些集群模式

Redis提供了几种不同的方式来部署集群模式,以满足不同的高可用性和扩展性需求:

  1. 主从复制(Master-Slave Replication):这是最基本的Redis集群模式。在这种模式下,数据可以被复制多个副本,其中一个节点作为主节点(Master),其他节点作为从节点(Slave)。主节点负责处理所有的写操作,而读操作可以分配给任意一个从节点。如果主节点发生故障,可以通过手动或自动的方式将从节点提升为主节点。

  2. 哨兵模式(Sentinel):哨兵模式是在主从复制的基础上增加了自动故障转移功能。它监控着所有的节点,并在检测到主节点不可用时自动进行故障转移,选择一个从节点升级为主节点,从而保证了服务的高可用性。

  3. Redis Cluster:这是一种官方推荐的分布式解决方案,用于在多个节点之间自动分片存储数据。Redis Cluster支持在多个节点之间自动分割数据集,并且在部分节点失败时提供一定程度的可用性(具体来说,在大多数master节点可访问并且持久化数据不丢失的情况下)。每个节点都保存数据的一个子集,并且相互之间通过 gossip 协议交换信息,维护集群状态。

这些是Redis中主要的集群模式,每种模式都有其适用场景和特点。对于需要简单配置和基本故障恢复的情况,可以选择主从复制结合哨兵模式;而对于需要大规模数据分布和更高水平的可用性的应用,则更适合使用Redis Cluster。

4.是否使用过Redis Cluster 集群,集群的原理是什么?

是的,Redis Cluster 是 Redis 的分布式解决方案,它允许数据自动分片到多个 Redis 节点上,并且在部分节点失败时提供一定的容错能力。以下是 Redis Cluster 的基本原理:

基本原理

  1. 数据分片(Sharding)

    • Redis Cluster 使用一种称为哈希槽(hash slots)的概念来实现数据分片,默认情况下共有 16384 个槽位。每个键通过一个固定的哈希函数映射到这 16384 个槽中的一个。
    • 集群中的每个节点负责处理一部分哈希槽,当需要扩展或收缩集群规模时,只需移动相应的哈希槽即可。
  2. 主从复制

    • 在 Redis Cluster 中,为了保证高可用性,通常会对每个主节点配置一个或多个从节点。一旦某个主节点发生故障,其对应的从节点可以被提升为主节点继续服务,以此来达到故障转移的目的。
  3. 故障检测与自动故障转移

    • Redis Cluster 实现了去中心化的故障检测机制。每个节点都会定期向其他所有节点发送 PING 消息,并期望得到 PONG 回复。如果某个节点未能及时回复 PING 消息,则会被标记为疑似下线(PFAIL)。当多个节点都认为某个节点处于疑似下线状态时,该节点将被标记为实际下线(FAIL),并触发故障转移流程。
    • 故障转移由从节点发起,其中一个从节点会被选举为新的主节点接管原主节点的工作负载。
  4. 客户端重定向

    • 当客户端请求到达非负责特定哈希槽的节点时,该节点会返回 MOVED 错误信息给客户端,指示正确的节点地址。现代的 Redis 客户端库通常能够自动解析这些重定向信息,并直接连接到正确的节点进行操作。
  5. 一致性保障

    • Redis Cluster 并不完全保证强一致性。虽然写操作总是先在主节点执行,但由于异步复制的存在,在极端情况下可能会导致部分已确认的写操作丢失(例如,主节点崩溃前未完成的数据同步)。

通过上述机制,Redis Cluster 提供了一个既支持水平扩展又具备一定容错能力的分布式系统。然而,需要注意的是,尽管 Redis Cluster 提供了较高的可用性和扩展性,但在设计应用时仍需考虑如何妥善处理网络分区等复杂情况带来的影响。

5.Redis Cluster 集群方案什么情况下会导致整个集群不可用?

Redis Cluster 的设计目标是提供高可用性和分区容忍性,但在某些特定情况下,可能会导致整个集群不可用或部分功能受限。以下是可能导致 Redis Cluster 集群整体或部分不可用的情况:

1. 主节点故障且无可用从节点进行故障转移

  • 如果一个主节点发生故障,并且该主节点没有配置从节点或者其从节点也同时出现问题,则负责该哈希槽范围的数据将无法访问,直到管理员手动干预恢复服务。如果这种情况发生在多个主节点上,可能严重影响集群的可用性。

2. 大量节点同时离线

  • Redis Cluster 要求大多数节点在线才能正常工作(即达到 quorum)。如果超过一半以上的节点突然离线(例如由于网络问题、硬件故障等),则整个集群将无法进行正常的读写操作,因为无法形成有效的决策群体来进行数据同步和故障转移。

3. 网络分区导致集群分裂

  • 当网络分区发生时,可能会导致集群被分割成两个或更多的小组。如果其中一个小组包含不到半数的主节点,则这个小组将不能继续处理写请求。更严重的是,如果这两个小组都试图进行独立的操作,可能会引起数据不一致的问题。
  • 在极端情况下,如果网络分区使得没有任何一个小组能够获得大多数节点的支持,那么整个集群可能变得不可用。

4. 配置不当

  • 错误的配置也可能导致集群不稳定或不可用。例如,错误地设置了 cluster-node-timeout 参数可能导致频繁的节点下线和上线,影响集群稳定性;或者在设置复制链路时未充分考虑带宽限制等因素,导致复制延迟过大甚至失败。

5. 数据丢失与一致性问题

  • 尽管 Redis Cluster 提供了一定程度的一致性和持久化支持,但如果遇到严重的硬件故障或其他异常情况,仍有可能出现数据丢失的情况。此外,由于 Redis 使用异步复制,所以在主节点崩溃而尚未完全同步给从节点的情况下,可能会导致少量数据丢失。

为了最小化这些风险,建议定期备份数据、合理配置参数、监控集群健康状况并及时响应警告信息。同时,对于关键业务场景,应考虑采用额外的高可用方案或灾备策略。

6.Redis 集群架构模式有哪几种?

Redis 支持几种不同的集群架构模式,每种模式都有其特定的应用场景和特点。以下是 Redis 常见的集群架构模式:

1. 主从复制(Master-Slave Replication)

  • 描述:这是最基本的 Redis 集群模式,一个主节点(Master)可以拥有多个从节点(Slave)。主节点处理所有的写请求,并将数据异步地复制到从节点上。从节点主要用于读取操作,从而实现读写分离。
  • 优点:提供了一种简单的方法来扩展读性能,同时增加了数据冗余作为备份。
  • 缺点:如果主节点发生故障,需要手动或通过外部工具进行故障转移。

2. Redis Sentinel

  • 描述:Redis Sentinel 是一种监控和故障转移解决方案,用于管理主从复制的 Redis 实例。它能够自动检测主节点故障并触发故障转移过程,将其中一个从节点升级为主节点。
  • 优点:提供了高可用性支持,能够在主节点失效时自动切换到备用主节点。
  • 缺点:虽然提高了系统的可用性,但不直接解决数据分片问题,仍然受限于单个实例的内存容量。

3. Redis Cluster

  • 描述:Redis Cluster 是 Redis 的分布式解决方案,支持数据自动分片到多个 Redis 节点上,并且在部分节点失败时提供一定的容错能力。每个节点都保存一部分数据,并且每个节点都知道整个集群中其他所有节点的角色和状态。
  • 优点:支持水平扩展,具有较好的容错能力和负载均衡;适合大规模数据集和高并发访问。
  • 缺点:配置和维护相对复杂;不完全支持事务;对于跨分区的操作效率较低。

总结

  • 主从复制适合简单的读写分离场景,提高读取性能的同时增加了一定程度的数据冗余。
  • Redis Sentinel在此基础上增加了自动化故障转移功能,增强了系统的高可用性。
  • Redis Cluster则是为了解决更大规模的数据存储需求而设计的,支持数据分片和更强大的容错能力,适用于需要高度可扩展性和高可用性的应用环境。

根据具体的需求和应用场景选择合适的 Redis 集群架构模式是非常重要的。例如,如果只是需要简单的读写分离和高可用性,那么主从复制加上 Redis Sentinel 可能就足够了;而对于需要处理海量数据和高并发请求的情况,则更适合采用 Redis Cluster。

7.说说 Redis 哈希槽的概念?

Redis Cluster 使用哈希槽(hash slots)作为其数据分片的基础机制,以实现分布式存储和负载均衡。以下是关于 Redis 哈希槽的一些关键概念:

哈希槽概述

  • 定义:在 Redis Cluster 中,整个键空间被分割成固定数量的哈希槽,默认情况下共有 16384(即 0 到 16383)个槽位。每个键通过一个固定的哈希函数映射到这 16384 个槽中的一个。

  • 分配规则:集群中的每个节点负责处理一部分哈希槽。例如,在一个由三个节点组成的集群中,可能第一个节点负责前5000个槽,第二个节点负责接下来的5000个槽,第三个节点则负责剩余的所有槽。

工作原理

  1. 键映射

    • 当客户端尝试访问某个键时,首先计算该键的CRC16校验值,并对16384取模得到对应的哈希槽编号。然后根据集群配置信息确定哪个节点负责处理这个哈希槽。
  2. 数据分布与均衡

    • 数据均匀分布在各个节点上,通过调整不同节点所管理的哈希槽数量可以实现负载均衡。当需要扩展或收缩集群规模时,只需移动相应的哈希槽即可,而不需要重新分配所有数据。
  3. 容错性与可扩展性

    • 每个哈希槽都有一个主节点和零个或多个从节点。如果主节点发生故障,则其从节点可以被提升为主节点继续服务,以此来达到故障转移的目的。同时,由于数据是基于哈希槽进行分布的,因此很容易向集群添加新的节点,并将部分哈希槽迁移到新节点上,从而实现水平扩展。

实际应用注意事项

  • 重定向处理:如果客户端请求到达非负责特定哈希槽的节点,该节点会返回 MOVED 错误信息给客户端,指示正确的节点地址。现代的 Redis 客户端库通常能够自动解析这些重定向信息,并直接连接到正确的节点进行操作。

  • 一致性保障:尽管 Redis Cluster 提供了较好的数据分布和容错能力,但并不完全保证强一致性。写操作总是先在主节点执行,但由于异步复制的存在,在极端情况下可能会导致部分已确认的写操作丢失(例如,主节点崩溃前未完成的数据同步)。

通过使用哈希槽的概念,Redis Cluster 能够有效地支持大规模数据集的分布式存储,同时保持良好的性能和可靠性。

8.Redis 常见性能问题和解决方案有哪些?

Redis 是一种高性能的内存数据库,但在实际应用中,如果不正确地配置或使用它,可能会遇到性能瓶颈。以下是一些常见的 Redis 性能问题及其解决方案:

常见性能问题

  1. 内存使用过高

    • 原因:数据量过大、未设置合适的过期策略、未启用LRU(Least Recently Used)淘汰策略等。
    • 解决方案
      • 优化数据结构的选择和存储方式。
      • 合理设置 maxmemorymaxmemory-policy 参数,以控制内存使用并根据需要选择适当的淘汰策略。
      • 定期检查和清理不再使用的键。
  2. 持久化操作影响性能

    • 原因:RDB快照生成或者AOF重写过程中会占用大量I/O资源,可能导致短暂的服务不可用或响应变慢。
    • 解决方案
      • 调整 RDB 快照频率,避免过于频繁的快照生成。
      • 使用 AOF 持久化时,考虑关闭 fsync 操作或将 fsync 设置为每秒一次,减少对性能的影响。
      • 对于高可用性要求较高的场景,可以考虑使用主从复制来减轻持久化对主节点的压力。
  3. 网络延迟

    • 原因:客户端与服务器之间的往返时间(RTT)较长,尤其是在跨数据中心部署的情况下。
    • 解决方案
      • 使用 Pipeline 批量处理命令以减少网络往返次数。
      • 在地理上分散的应用程序架构中,考虑在靠近用户的地方部署 Redis 实例或使用缓存代理。
  4. 阻塞命令

    • 原因:某些 Redis 命令如 KEYS, SORT, SMEMBERS 等,在处理大数据集时可能会导致长时间阻塞主线程。
    • 解决方案
      • 尽量避免使用可能造成阻塞的命令;改用 SCAN 系列命令代替 KEYS 进行迭代查询。
      • 如果必须执行这类命令,确保它们不会在高峰期运行,并尽量限制结果集大小。
  5. 客户端连接数过多

    • 原因:当客户端数量激增时,可能导致 Redis 的文件描述符耗尽,进而影响服务稳定性。
    • 解决方案
      • 增加系统级别的最大文件描述符限制。
      • 在 Redis 配置中调整 maxclients 参数以适应更高的并发需求。
      • 实施连接池技术,复用现有的连接而不是每次都创建新连接。
  6. 集群管理复杂度

    • 原因:随着集群规模的增长,管理和维护变得更加复杂。
    • 解决方案
      • 利用自动化工具如 Redis Sentinel 或 Redis Cluster 来简化故障检测和恢复流程。
      • 实施监控系统,实时跟踪集群健康状况及性能指标。

通过识别这些问题并采取相应的措施,可以显著提高 Redis 的性能和可靠性。同时,持续关注 Redis 的最新发展和最佳实践也是保持高效运营的关键。

9.假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某 个固定的已知的前缀开头的,如果将它们全部找出来?

在 Redis 中查找具有特定前缀的所有键,传统上可能会想到使用 KEYS 命令。然而,对于包含 1 亿个 key 的 Redis 实例来说,直接使用 KEYS 命令是非常不推荐的,因为它会遍历所有键空间,并且是阻塞操作,这将严重影响 Redis 的性能。

针对你的场景(需要找到以某个固定已知前缀开头的大约 10 万个 key),更合适的方法是使用 SCAN 命令配合模式匹配来逐步迭代键空间。SCAN 提供了一种非阻塞的方式来遍历 Redis 数据库中的键,允许你指定一个模式进行过滤(例如前缀匹配)。以下是具体步骤:

使用 SCAN 命令

  1. 初始化扫描:从 cursor 0 开始调用 SCAN 命令。
  2. 模式匹配:利用 MATCH 参数指定要匹配的模式,比如 "prefix:*" 来匹配所有以 "prefix:" 开头的键。
  3. 循环遍历:根据 SCAN 返回的新 cursor 值继续下一次扫描,直到 cursor 返回为 0 表示遍历结束。
  4. 处理结果:每次 SCAN 调用返回一批键名,你可以在此过程中处理这些键名(如打印出来、存储等)。
SCAN 0 MATCH prefix:* COUNT 100

这里 COUNT 参数可以用来控制每次返回的元素数量,默认值可能较小,适当增加这个值可以减少 SCAN 的调用次数,但同时也会增加单次调用的开销。调整 COUNT 的大小可以根据实际情况优化性能。

注意事项

  • 非精确匹配:由于 SCAN 不保证返回的结果完全准确(特别是在数据变化频繁的情况下),所以在某些高并发写入场景下,可能会遗漏或重复获取一些键。
  • 效率考虑:尽管 SCANKEYS 更加高效和安全,但对于非常大的数据集,仍然需要考虑其执行时间和对服务器的影响。如果可能的话,尽量选择在系统负载较低的时候执行此类操作。
  • 客户端实现:大多数 Redis 客户端库都提供了对 SCAN 命令的支持,通常封装得更为友好,便于开发者使用。

通过这种方法,你可以有效地找出所有符合特定前缀条件的键,而不会对 Redis 服务器造成显著的压力。

10.如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

当你需要为大量 key 设置同一时间过期时,有几个关键点需要注意,以确保操作既高效又不会对 Redis 服务器造成过大压力或导致其他问题。以下是几个主要的注意事项:

注意事项

  1. 避免集中过期引发的流量峰值

    • 如果大量 key 在同一时刻设置为过期,可能会导致这些 key 在设定的过期时间同时被删除,这可能瞬间产生大量的 I/O 操作,从而影响 Redis 的性能。为了避免这种情况,可以考虑使用随机化的过期时间,即在目标过期时间前后添加一个小范围内的随机值(抖动),这样可以让过期操作分散进行。
  2. 批量处理

    • 使用 EXPIRE 或者 PEXPIRE 命令为每个 key 单独设置过期时间效率较低,尤其是在需要处理大量 key 的情况下。推荐使用 EXPIRE 的批量版本命令如 EXPIREMULTI(注意:Redis 原生并不直接支持 EXPIREMULTI,但可以通过脚本实现类似功能)或者通过 Lua 脚本来批量处理。
    • 另一种方法是利用 Redis 的管道(Pipeline)机制,将多个 EXPIRE 请求打包发送到服务器,减少网络往返次数,提高效率。
  3. 内存管理

    • 当大量 key 同时过期时,Redis 需要回收这些内存空间,如果一次性释放太多内存,可能会影响 Redis 的性能。适当分散过期时间有助于平滑这一过程。
  4. 持久化的影响

    • 如果启用了 RDB 或 AOF 持久化,大量 key 的创建和销毁可能会影响持久化进程,特别是当 Redis 正在执行快照生成或日志重写时。因此,在计划大规模的 key 创建和设置过期时间之前,应该考虑到这一点,并根据实际情况调整持久化策略。
  5. 监控与预警

    • 在执行此类操作前,建议先对 Redis 实例进行健康检查,并确保有足够的资源来处理即将发生的负载增加。此外,设置适当的监控和预警机制,以便及时发现并解决可能出现的问题。
  6. 事务与原子性

    • 如果你需要确保所有 key 的过期设置作为一个原子操作完成,则应考虑使用 MULTI/EXEC 或 Lua 脚本来保证整个操作序列的原子性。

综上所述,为大量 key 设置相同过期时间时,重点在于如何有效地管理和分布这些操作,以减少对 Redis 性能的影响。通过引入一定的随机性、利用批量处理技术以及合理规划持久化策略,可以在很大程度上缓解这些问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tailwindcss学习03

01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…

Java 笔记(自用)

Java是一种面向对象(opp)的、解释性的跨平台语言。所谓的跨平台是Java的一个编译好的.class文件可以在多个系统下运行。解释性则是编译后的代码需要解释器来执行&#xff0c;与之相对应的c/c是编译性语言&#xff0c;编译后的代码可以直接被机器执行。 jdkjrejava的开发工具 …

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

win32汇编环境,对话框中使用菜单示例三

;运行效果 ;win32汇编环境,对话框中使用菜单示例三 ;鼠标点击右键时&#xff0c;弹出菜单的功能 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

云计算及其他计算

云计算知识思维导图&#xff1a;https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院&#xff08;NIST&#xff09;的定义&#xff0c;并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准&#xff0c;以及对应的服务类型&#…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…

OkHttp使用和源码分析学习(二)

流程及源码分析 OkHttpClient使用过程主要涉及到OkHttpClient、Request、Response、Call、Interceptor&#xff0c;具体参考OkHttp使用。OkHttp在设计时采用门面模式&#xff0c;将整个系统复杂性隐藏&#xff0c;子系统通过OkHttpClient客户端对外提供。 流程 创建 OkHttp…

架构师论文《论湖仓一体架构及其应用》

软考论文-系统架构设计师 摘要 作为某省级商业银行数据中台建设项目技术负责人&#xff0c;我在2020年主导完成了从传统数据仓库向湖仓一体架构的转型。针对日益增长的支付流水、用户行为埋点及信贷审核影像文件等多模态数据处理需求&#xff0c;原有系统存在存储成本激增、实…

政安晨的AI大模型训练实践 九 - 熟悉LLaMA Factory的详细参数含义-基本概念理解一下

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 小伙伴铁子们&#xff0c;上手先熟悉起来训练工具的每一个参数&#xff0c;很重要。 参照我…

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;这篇文章一共5721个字&#xff0c;是我截至目前写的最长的一篇文章&a…

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…