Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)

1、概述

Redis集群(Cluster)通过分片(sharding)实现了水平扩展,允许数据分布在多个节点上,从而提升性能和存储容量。

在Redis集群中,数据被分割成16384个哈希槽(hash slots),每个哈希槽可以分配给集群中的不同节点。每个节点负责一部分哈希槽,并且每个哈希槽都有一个主节点和零个或多个从节点(用于高可用性)。
客户端在发送命令时,会根据键的哈希值计算出对应的哈希槽,并直接连接到持有该槽的主节点。

2、集群配置

假设我们要构建一个包含3主3从的Redis集群,总共6个节点。每个节点都需要一个独立的redis.conf配置文件。

1、主节点1 (Node 1) 配置

 端口号
port 7000绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7000.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7000.log"日志级别
loglevel notice

2、主节点2 (Node 2) 配置

端口号
port 7001绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7001.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7001.log"日志级别
loglevel notice

3、主节点3 (Node 3) 配置

端口号
port 7002绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7002.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7002.log"日志级别
loglevel notice

4、从节点1 (Node 4) 配置

端口号
port 7003绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7003.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7003.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7000   这一行可以注释掉,因为集群会自动处理主从关系

5、从节点2 (Node 5) 配置

端口号
port 7004绑定IP地址(根据实际情况修改)
bind 0.0.0.0开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7004.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7004.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7001   这一行可以注释掉,因为集群会自动处理主从关系

6、从节点3 (Node 6) 配置

端口号
port 7005绑定IP地址(根据实际情况修改)
bind 127.0.0.1开启集群模式
cluster-enabled yes指定集群配置文件路径
cluster-config-file nodes-7005.conf设置集群节点超时时间(毫秒)
cluster-node-timeout 5000开启持久化(可选,根据需求配置)
appendonly yes设置密码(如果需要)
requirepass yourpassword如果设置了密码,还需要设置集群内部通信的密码
cluster-auth-pass yourpassword启用日志
logfile "/path/to/redis-7005.log"日志级别
loglevel notice指定主节点(启动后由集群自动分配)
slaveof 127.0.0.1 7002   这一行可以注释掉,因为集群会自动处理主从关系

3、配置详解

1、port

  • 解释:指定Redis实例监听的TCP端口号。每个节点必须使用不同的端口。
  • 固定/可变:port是固定的关键词,后面的端口号(如7000)可以根据实际情况调整。

2、bind

  • 解释:指定Redis实例绑定的IP地址。0.0.0.0表示绑定所有可用的网络接口。如果你希望Redis只监听特定的IP地址,可以替换为实际的IP地址。
  • 固定/可变:bind是固定的关键词,后面的IP地址可以根据实际情况调整。

3、cluster-enabled

  • 解释:开启Redis集群模式。这是启用分片和分布式功能的关键配置。
  • 固定/可变:cluster-enabled是固定的关键词,值必须设置为yes以启用集群模式。

4、cluster-config-file

  • 解释:指定集群配置文件的路径。这个文件用于保存集群的拓扑结构和状态信息。每个节点都应该有一个独立的配置文件,通常命名为nodes-<端口号>.conf。
    说明下:这个文件是自动生成的,且是动态更新的。每当集群的拓扑结构发生变化(例如,新的节点加入、旧的节点离开、哈希槽重新分配等),Redis 会自动更新这个文件,以确保集群的最新状态被正确记录。无需人为维护,仅在配置文件中指定名称即可。
  • 固定/可变:cluster-config-file是固定的关键词,后面的文件名可以根据实际情况调整。

5、cluster-node-timeout

  • 解释:设置集群节点之间的通信超时时间(毫秒)。如果一个节点在这个时间内一直没有响应,哨兵则认为该节点已经失效。
  • 固定/可变:cluster-node-timeout是固定的关键词,后面的超时时间(如5000,单位毫秒)可以根据实际情况调整。

6、appendonly

  • 解释:开启AOF(Append Only File)持久化模式。这可以确保Redis在重启后能够恢复数据。你可以根据需求选择是否开启持久化。
  • 固定/可变:appendonly是固定的关键词,值可以设置为yes或no。

7、requirepass

  • 解释:设置Redis实例的访问密码。如果启用了密码保护,客户端在连接时需要提供正确的密码。
  • 固定/可变:requirepass是固定的关键词,后面的密码(如yourpassword)可以根据实际情况设置。

8、cluster-auth-pass

  • 解释:设置集群内部通信的密码。如果Redis实例启用了密码保护,集群中的节点之间也需要使用相同的密码进行通信。
  • 固定/可变:cluster-auth-pass是固定的关键词,后面的密码(如yourpassword)可以根据实际情况设置。

9、logfile

  • 解释:指定Redis的日志文件路径。日志记录了Redis的操作和状态变化,有助于调试和监控。
  • 固定/可变:logfile是固定的关键词,后面的路径(如/path/to/redis-7000.log)可以根据实际情况调整。

10、loglevel

  • 解释:设置Redis的日志级别。常见的日志级别包括debug、verbose、notice、warning等。notice是一个常用的级别,记录重要的信息而不产生过多的噪音。
  • 固定/可变:loglevel是固定的关键词,后面的级别(如notice)可以根据需求调整。

11.、slaveof

  • 解释:指定从节点复制的主节点。虽然你可以在配置文件中显式指定主节点,但通常不需要这样做,因为集群会自动处理主从关系。如果你手动指定了主节点,哨兵或集群可能会覆盖这个配置。
  • 固定/可变:slaveof是固定的关键词,后面的IP地址和端口号可以根据实际情况设置。不过,建议将其注释掉,让集群自动管理主从关系。

4、启动集群

(1)、启动所有Redis实例

 redis-server /path/to/redis-7000.confredis-server /path/to/redis-7001.confredis-server /path/to/redis-7002.confredis-server /path/to/redis-7003.confredis-server /path/to/redis-7004.confredis-server /path/to/redis-7005.conf

(2)、创建并启动集群

说明下:启动所有的节点并不代表启动了集群。
启动各个Redis节点只是第一步,真正的集群化操作需要通过redis-cli --cluster create命令来完成。这个命令会分配哈希槽、建立节点间的通信关系,为每个主节点分配一个从节点,初始化集群的拓扑结构,并更新每个节点的cluster-config-file。

确保所有节点都已启动后,执行以下命令,创建集群:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

命令解释下:

  • –cluster create:创建一个新的Redis集群。
  • 127.0.0.1:7000 … 127.0.0.1:7005:列出所有参与集群的节点的IP地址和端口号。
  • –cluster-replicas 1:指定每个主节点应该有1个从节点。说明下:因为命令指定了6个服务,这里cluster-replicas配置为1,即每一个主节点有一个从节点,所以才实现3主3从的结构;如果配置为2,即每个主节点有2个从节点,那么6个服务就形成了2主4从的结构。以此类推。

(3)、验证集群状态

你可以通过以下命令查看集群的状态:

redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes

说明下:

  • cluster info:显示集群的基本信息,如集群状态、节点数量等。
  • cluster nodes:显示集群中所有节点的详细信息,包括主节点、从节点、哈希槽分配等。

5、集群总结

通过上述配置,你可以搭建一个包含3个主节点和3个从节点的Redis集群。每个节点的配置文件都非常相似,唯一的区别在于端口号和集群配置文件的名称。Redis集群会自动处理主从关系、哈希槽分配和故障转移,因此你不需要为每个从节点单独配置主节点信息。
这种架构不仅提供了水平扩展的能力,还通过主从复制和自动故障转移确保了高可用性。通过合理配置和管理,Redis集群可以满足大规模应用对高性能和可靠性的要求。

6、集群扩展哨兵机制

在Redis集群中实现哨兵机制(Sentinel)可以进一步提升系统的高可用性。哨兵机制可以为集群提供额外的监控和管理功能,尤其是在处理复杂的网络分区或节点故障时。

扩展哨兵后集群优势:

  • 增强监控能力:哨兵不仅可以监控单个主从对,还可以监控整个集群的状态,确保所有节点都正常工作。
  • 自动化故障转移:虽然Redis集群本身支持自动故障转移,但在某些复杂情况下(如网络分区),哨兵可以更灵活地处理故障转移。
  • 通知机制:哨兵可以配置为向管理员发送通知,当集群中的某个节点发生故障时,及时提醒运维人员。
  • 手动干预:哨兵允许你手动触发故障转移,或者在某些情况下阻止不必要的自动故障转移。

集群基础上扩展哨兵机制配置示例:

假设我们现在要实现3主3从3哨兵的架构。

1、搭建集群

可参考上面的示例,实现3主3从的集群结构,以及正确启动每一个节点服务和创建集群。

2、创建哨兵配置文件

为每个哨兵节点创建一个独立的sentinel.conf配置文件。示例基本同之前介绍的哨兵配置文件。

哨兵节点1 (sentinel-26379.conf)

 哨兵监听的端口号
port 26379绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26379.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26379

哨兵节点2 (sentinel-26380.conf)

 哨兵监听的端口号
port 26380绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26380.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26380

哨兵节点3 (sentinel-26381.conf)

哨兵监听的端口号
port 26381绑定IP地址(根据实际情况修改)
bind 127.0.0.1指定要监控的集群名称和任意一个主节点的地址
sentinel monitor mycluster 127.0.0.1 7000 2设置法定人数(quorum),即至少需要多少个哨兵同意才能认为主节点下线
sentinel quorum mycluster 2设置哨兵认为主节点失效的时间阈值(毫秒)
sentinel down-after-milliseconds mycluster 5000设置故障转移的超时时间(毫秒)
sentinel failover-timeout mycluster 180000如果设置了Redis密码,还需要配置密码
sentinel auth-pass mycluster yourpassword可选:设置哨兵日志级别
logfile "/path/to/sentinel-26381.log"
loglevel notice可选:指定哨兵之间的通信端口(通常不需要修改)
sentinel announce-ip 127.0.0.1
sentinel announce-port 26381
3、启动哨兵节点

启动每个哨兵节点,确保它们能够正常运行并与集群中的Redis节点通信。

redis-sentinel /path/to/sentinel-26379.conf
redis-sentinel /path/to/sentinel-26380.conf
redis-sentinel /path/to/sentinel-26381.conf
4、验证哨兵

你可以通过以下命令连接到任意一个哨兵节点,查看其监控的集群状态:

redis-cli -p 26379 sentinel masters

说明:这条命令会返回哨兵监控的所有主节点的信息,包括集群名称、主节点的地址、从节点的数量等。

你还可以查看特定主节点的从节点信息:

redis-cli -p 26379 sentinel slaves mycluster

这条命令会返回与mycluster主节点关联的所有从节点的详细信息。

7、哨兵和集群对比总结

Redis哨兵(Sentinel)机制和Redis集群(Cluster)是两种不同的高可用性和可扩展性解决方案,它们各自解决的问题不同,并且在架构设计、使用场景以及实现方式上都有显著的区别。

Redis 哨兵(Sentinel)机制

1、目标

  • 高可用性:主要目的是为单个Redis实例提供自动故障转移能力,确保即使主节点发生故障,服务也可以通过从节点继续提供。
  • 监控:哨兵不仅负责故障检测和自动故障转移,还可以监控Redis实例的健康状况,并向管理员发送通知。

2、架构

  • 哨兵节点:由一个或多个哨兵进程组成,每个哨兵都独立地监控Redis主从节点的状态。
  • 主从复制:依赖于Redis的主从复制机制,其中有一个主节点负责处理写操作,多个从节点用于读取副本和数据备份。
  • 法定人数:需要达到一定数量的哨兵同意才能进行故障转移,以避免错误决策。

3、工作流程

  • 心跳检测:哨兵定期检查Redis节点的可达性,如果主节点不可达,则会尝试发起故障转移。
  • 选举领头哨兵:当决定进行故障转移时,哨兵之间会选举出一个领头哨兵来协调整个过程。
  • 故障转移:领头哨兵选择一个新的主节点,更新所有从节点的配置,并通知客户端新的主节点地址。

4、使用场景

  • 适用于对数据一致性要求较高且希望保持单一入口点的应用场景。
  • 适合那些不需要水平扩展读性能的应用,因为所有的写入仍然集中在单个主节点上。

Redis 集群(Cluster)

1、目标

  • 水平扩展:旨在通过将数据分布在多个节点上来提升Redis的存储容量和吞吐量。
  • 高可用性:通过分片(sharding)和内置的复制机制,确保即使某些节点失效,整个集群仍能正常工作。

2、架构

  • 分片(Sharding):数据被分割成多个哈希槽(hash slot),每个槽可以分配给集群中的不同节点。
  • 多主模式:集群中每个分片都有一个主节点和零个或多个从节点,所有主节点都可以接受写操作。
  • 自动再平衡:当节点加入或离开集群时,集群能够自动调整哈希槽的分布,以保持负载均衡。

3、工作流程

  • 客户端路由:客户端必须能够根据键值计算出对应的哈希槽,并直接连接到持有该槽的主节点。
  • 故障转移:如果某个主节点失效,其对应的从节点会被自动晋升为主节点,其他节点也会相应地更新配置。
  • 数据迁移:当集群结构发生变化时,如添加新节点或移除旧节点,数据会在节点间迁移,以保证哈希槽的均匀分布。

4、使用场景

  • 适用于需要大规模水平扩展的应用,特别是那些对读写性能有较高要求的情况。
  • 适合那些可以容忍一定程度的数据不一致性的应用,因为集群中的多个主节点可能会导致短暂的数据异步。

比较与结合

  • 功能重叠:虽然两者都能提供高可用性,但哨兵更侧重于故障转移和监控,而集群则专注于数据分片和水平扩展。
  • 互斥性:理论上,哨兵和集群可以同时使用,但实际上这样做并不常见,因为集群本身已经包含了哨兵的部分功能,比如自动故障转移和复制。
  • 复杂度:哨兵相对简单,易于设置和管理;集群则更为复杂,涉及到哈希槽的管理和数据迁移等高级特性。
  • 适用性:对于小型或中型部署,哨兵可能就足够了;而对于大型应用或者对性能有极高要求的场景,集群可能是更好的选择。

总结

Redis哨兵和集群是针对不同需求设计的解决方案。哨兵适用于需要高可用性但不需要大规模扩展的应用,而集群则更适合那些既需要高可用性又需要良好扩展性的应用场景。

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

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

相关文章

QScreen在Qt5.15与Qt6.8版本下的区别

简述 QScreen主要用于提供与屏幕相关的信息。它可以获取有关显示设备的分辨率、尺寸、DPI&#xff08;每英寸点数&#xff09;等信息。本文主要是介绍Qt5.15与Qt6环境下&#xff0c;QScreen的差异&#xff0c;以及如何判断高DPI设备。 属性说明 logicalDotsPerInch&#xff1…

[HNCTF 2022 Week1]你想学密码吗?

下载附件用记事本打开 把这些代码放在pytho中 # encode utf-8 # python3 # pycryptodemo 3.12.0import Crypto.PublicKey as pk from hashlib import md5 from functools import reducea sum([len(str(i)) for i in pk.__dict__]) funcs list(pk.__dict__.keys()) b reduc…

shell8

until循环(条件为假的时候一直循环和while相反) i0 until [ ! $i -lt 10 ] doecho $i((i)) done分析 初始化变量&#xff1a; i0&#xff1a;将变量i初始化为0。 条件判断 (until 循环)&#xff1a; until [ ! $i -lt 10 ]&#xff1a;这里的逻辑有些复杂。它使用了until循环…

【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现

一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…

frp内网穿透笔记

文章目录 一、环境介绍二、配置过程2.1 下载文件2.3 服务器A的配置2.3 目标机B的配置2.4 电脑C怎么用 三、问题汇总 一、环境介绍 带公网的vps服务器A&#xff0c;需要穿透到的无公网目标电脑B&#xff0c;以及一台需要通过公网访问B的电脑C。frp 0.47.0&#xff1a;frp_0.47.…

PostgreSQL的交互式终端使用一系列命令来获取有关文本搜索配置对象的信息

在 psql&#xff08;PostgreSQL 的交互式终端&#xff09;中&#xff0c;你可以使用一系列命令来获取有关文本搜索配置对象的信息。这些命令主要围绕 \dF 系列&#xff0c;以及使用 SQL 查询 pg_ts_config 系统视图。以下是你可以使用的一些方法&#xff1a; 使用 \dF 系列命令…

写定制程序容易遇见的问题(FLASH不够时)

做了一个关于定制两条串口协议的活&#xff0c;主要是要在源代码基础上进行修改。源代码只剩了200多字节flash。本来最初我的想法很奇特&#xff0c;用结构体来模仿寄存器的写法。当我写完几行代码后&#xff0c;编译链接&#xff0c;立马就报CODE内存超了。 然后最终还是选择…

【Leetcode 热题 100 - 扩展】303. 区域和检索 - 数组不可变

问题背景 给定一个整数数组 n u m s nums nums&#xff0c;处理以下类型的多个查询&#xff1a; 计算索引 l e f t left left 和 r i g h t right right&#xff08;包含 l e f t left left 和 r i g h t right right&#xff09;之间的 n u m s nums nums 元素的 和 &a…

本地缓存和Redis缓存 存储更新时间的更新套路

//先获取redis key和local key //从reids中获取数据 – 为空 先设置redis缓存30天,value为当前时间 然后设置本地缓存,value为当前时间 从数据库里读数据 – 不为空 获取本地缓存时间 if本地缓存时间 < redis缓存时间(认为已更新)或者本地为空 从数据库读数据 else 从本地缓…

处理错误的两种方式:try...catch 与 then...catch

一、try...catch try...catch 是一种用于捕获和处理同步代码中异常的机制。其基本结构如下&#xff1a; try {// 可能会抛出异常的代码 } catch (error) {// 处理异常 }使用场景&#xff1a; 主要用于同步代码&#xff0c;尤其是在需要处理可能抛出的异常时。适用于函数调用…

【十进制整数转换为其他进制数——短除形式的贪心算法】

之前写过一篇用贪心算法计算十进制转换二进制的方法&#xff0c;详见&#xff1a;用贪心算法计算十进制数转二进制数&#xff08;整数部分&#xff09;_短除法求二进制-CSDN博客 经过一段时间的研究&#xff0c;本人又发现两个规律&#xff1a; 1、不仅仅十进制整数转二进制可…

【Harmony Next】多个图文配合解释DevEco Studio工程中,如何配置App相关内容,一次解决多个问题?

解决App配置相关问题列表 1、Harmony Next如何配置图标&#xff1f; 2、Harmony Next如何配置App名称&#xff1f; 3、Harmony Next如何配置版本号&#xff1f; 4、Harmony Next如何配置Bundle ID? 5、Harmony Next如何配置build号&#xff1f; 6、Harmony Next多语言配置在哪…

Mybatis分页插件的使用问题记录

项目中配置的分页插件依赖为 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.7</version></dependency>之前的项目代码编写分页的方式为&#xff0c;通过传入的条件…

Anthropic 工程师关于提示词工程的深入探讨

李玉光 北京聚云科技有限公司 联合创始人兼首席架构师 拥有 12 年以上的 Amazon Web Services 开发与架构经验。擅长设计和实施大规模、高弹性、自动化的云原生解决方案。云成本优化方面经验丰富&#xff0c;帮助众多企业有效降低云使用成本。并协助各类行业客户利用 Amazon We…

SpringBoot之validation参数校验并返回统一格式提示

前言 在日常的开发过程中&#xff0c;后端需要经常对参数进行校验&#xff0c;比如某参数不能为空&#xff0c;格式等&#xff0c;只有校验通过后才可以执行后续的业务逻辑&#xff0c;否则就要在接口返回错误信息给前端。 一般情况下&#xff0c;可以使用if…else…来校验参数…

【技术干货】移动SDK安全风险及应对策略

移动SDK&#xff08;软件开发工具包&#xff09;已经成为应用开发中不可或缺的一部分。通过SDK&#xff0c;开发者能够快速集成分析、广告调度、音视频处理、社交功能和用户身份验证等常见功能&#xff0c;而无需从零开始构建。这不仅能节省时间和资源&#xff0c;还能提高开发…

MATLAB中cvx工具箱的使用

CVX 是 MATLAB 中一个用于解决凸优化问题的建模工具箱。它使得定义、求解和分析凸优化问题变得简单。CVX 允许用户用类似数学表达的方式编写凸优化问题&#xff0c;而不需要过多关注底层的优化算法。CVX 的核心功能是将一个简单的数学问题转化为 MATLAB 可以理解并求解的标准形…

易语言OCR银行卡文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…

QT多媒体开发(一):概述

Qt Multimedia 模块为多媒体编程提供支持。多媒体编程实现的功能主要包括播放音频和视频文件&#xff0c;通过麦克风录制音频&#xff0c;通过摄像头拍照和录像等。 QT6 中多媒体模块相比QT5变化较大&#xff0c;所以用QT6编译 QT5写的多媒体 程序基本无法通过。 Qt 5 多媒体模…