1. Redis 简介与核心特性

Redis(Remote Dictionary Server)是一款开源的内存数据存储系统,支持多种数据结构,兼具高性能、持久化、分布式等特性,广泛用于缓存、数据库、消息中间件等场景。其核心特性包括:

  • 高性能:基于内存操作,单线程模型避免上下文切换开销,QPS 可达 10 万 +(取决于数据大小和命令复杂度);
  • 多数据结构支持:不仅支持基础的键值对,还提供 String、Hash、List 等丰富数据类型;
  • 持久化:通过 RDB 和 AOF 机制将内存数据持久化到磁盘,防止数据丢失;
  • 高可用:支持主从复制、哨兵(Sentinel)实现故障自动转移;
  • 分布式:Redis Cluster 提供分片存储,突破单机内存限制;
  • 功能丰富:支持事务、发布订阅、Lua 脚本、地理空间等高级特性。

2. 核心数据类型及应用场景详解

Redis 提供8 种核心数据类型,每种类型针对特定场景优化,以下为详细说明:

2.1 String(字符串)

数据结构特点
  • 二进制安全:可存储文本、图片、序列化对象等任意二进制数据;
  • 最大容量:单个 String 值最大 512MB;
  • 底层实现:小字符串(<39 字节)用 SDS(简单动态字符串),大字符串用 embstr/raw 编码。
常用命令
命令功能描述示例
SET key value [EX seconds]设置键值对,可选过期时间SET user:1001 '{"name":"Alice","age":25}' EX 3600(缓存 1 小时)
GET key获取键值GET user:1001 → 返回用户信息 JSON
INCR key整数自增 1(原子操作)INCR article:read:10086(文章阅读量 + 1)
DECR key整数自减 1(原子操作)DECR stock:iphone15(库存 - 1)
APPEND key value追加字符串到值末尾APPEND log:user:1001 " login success"
应用场景
  • 缓存热点数据:存储用户信息、商品详情等高频访问数据,减轻数据库压力。
    示例:电商场景中,缓存商品详情页数据:SET product:10001 '{"id":10001,"name":"无线耳机","price":999}' EX 1800(缓存 30 分钟),用户访问时直接从 Redis 获取,无需查询 MySQL。

  • 计数器:利用INCR/DECR的原子性,实现文章阅读量、视频播放量、接口请求次数统计。
    示例:短视频平台统计视频播放量:用户每次观看视频时,执行INCR video:play:9527,后台定期将计数器值同步到数据库。

  • 分布式锁:基于SET key value NX EX命令(NX:不存在才设置,EX:过期时间)实现分布式锁,防止并发操作冲突。
    示例:秒杀场景中,通过SET lock:seckill:1001 "1" NX EX 10抢占锁,获取锁后执行库存扣减,执行完毕释放锁(DEL lock:seckill:1001)。

2.2 Hash(哈希)

数据结构特点
  • 键值对集合:一个 Hash 键包含多个field-value键值对,类似 JSON 对象;
  • 空间高效:适合存储对象,可单独操作字段(无需整体更新);
  • 底层实现:小 Hash(field 数量少且值小)用压缩列表,大 Hash 用哈希表。
常用命令
命令功能描述示例
HSET key field value设置 Hash 字段值HSET user:1001 name "Alice" age 25 email "alice@example.com"
HGET key field获取 Hash 字段值HGET user:1001 name → "Alice"
HMGET key field1 field2批量获取 Hash 字段值HMGET user:1001 name age → ["Alice", "25"]
HGETALL key获取 Hash 所有字段和值HGETALL user:1001 → ["name","Alice","age","25",...]
HINCRBY key field num字段值整数自增 num(原子操作)HINCRBY user:1001 score 10(用户积分 + 10)
应用场景
  • 对象存储:存储用户、商品等结构化数据,支持字段级更新,比 String 更灵活。
    示例:社交平台存储用户资料:HSET user:1001 name "Bob" avatar "avatar.jpg" vip_level 3,更新头像时仅需HSET user:1001 avatar "new_avatar.jpg",无需修改整个对象。

  • 购物车:以用户 ID 为 Hash 键,商品 ID 为 field,数量为 value,实现购物车增删改查。
    示例:用户 1001 的购物车:HSET cart:1001 2001 2 2002 1(商品 2001 数量 2,商品 2002 数量 1),修改数量时HSET cart:1001 2001 3,清空购物车时DEL cart:1001

2.3 List(列表)

数据结构特点
  • 有序字符串列表:元素按插入顺序排列,支持两端插入 / 删除;
  • 双向链表特性:可充当栈(LIFO)或队列(FIFO);
  • 底层实现:小 List(元素少且小)用压缩列表,大 List 用双向链表。
常用命令
命令功能描述示例
LPUSH key value1 [value2]从列表左侧插入元素LPUSH msg:queue "msg1" "msg2"(左侧插入两条消息)
RPUSH key value1 [value2]从列表右侧插入元素RPUSH article:latest 1001 1002(右侧追加文章 ID)
LPOP key从列表左侧弹出元素(返回并删除)LPOP msg:queue → "msg2"(栈模式:后进先出)
RPOP key从列表右侧弹出元素(返回并删除)RPOP msg:queue → "msg1"(队列模式:先进先出)
LRANGE key start stop获取列表指定范围元素(0 为头,-1 为尾)LRANGE article:latest 0 9 → 获取最新 10 篇文章 ID
应用场景
  • 消息队列:基于LPUSH+RPOP实现简单的 FIFO 消息队列,生产者左侧插入消息,消费者右侧弹出消息。
    示例:订单系统异步通知:订单创建后,LPUSH order:notify "order123",通知服务循环执行RPOP order:notify获取订单 ID 并发送短信。

  • 最新数据展示:基于LPUSH+LRANGE实现 “最新 N 条数据” 功能,如最新文章、最近评论。
    示例:博客平台展示最新 5 篇文章:发布文章时LPUSH article:latest 3001(文章 ID),前端调用LRANGE article:latest 0 4获取前 5 篇文章 ID,再查询详情。

2.4 Set(集合)

数据结构特点
  • 无序字符串集合:元素唯一(自动去重),不保证顺序;
  • 支持集合运算:交集、并集、差集,时间复杂度 O (N);
  • 底层实现:小 Set 用整数集合(元素为整数且少),大 Set 用哈希表。
常用命令
命令功能描述示例
SADD key member1 member2向集合添加元素(自动去重)SADD user:tags:1001 "tech" "music" "sports"(用户 1001 的标签)
SMEMBERS key获取集合所有元素SMEMBERS user:tags:1001 → ["tech","music","sports"]
SISMEMBER key member判断元素是否在集合中SISMEMBER user:tags:1001 "music" → 1(存在)
SINTER key1 key2计算两个集合的交集SINTER user:friends:1001 user:friends:1002(共同好友)
SUNION key1 key2计算两个集合的并集SUNION user:tags:1001 user:tags:1002(合并标签)
SREM key member从集合删除元素SREM user:tags:1001 "sports"(移除标签)
应用场景
  • 标签系统:存储用户兴趣标签、文章分类等,支持标签添加、删除、查询。
    示例:内容平台用户标签管理:用户 1001 添加 “科技”“音乐” 标签后,可通过SMEMBERS user:tags:1001获取所有标签,推荐内容时根据标签匹配。

  • 共同好友 / 兴趣:通过SINTER计算交集,实现社交平台 “共同好友” 功能。
    示例:用户 A(ID1001)和用户 B(ID1002)的好友列表分别为user:friends:1001user:friends:1002,执行SINTER user:friends:1001 user:friends:1002即可获取两人的共同好友 ID。

  • 去重统计:利用集合元素唯一性,统计 UV(独立访客)、去重 ID 列表等。
    示例:统计某活动参与用户 ID(去重):SADD activity:100:users 5001 5002 5001(自动去重后仅保留 5001、5002),SCARD activity:100:users → 2(参与人数)。

2.5 Sorted Set(ZSet,有序集合)

数据结构特点
  • 有序唯一元素:每个元素关联一个score(浮点数),按score升序排列,元素不可重复;
  • 高效排序与查询:支持按score范围、排名范围查询,底层基于 “跳跃表” 实现,时间复杂度 O (logN);
  • 支持score动态更新:修改元素score后自动调整排序位置。
常用命令
命令功能描述示例
ZADD key score member添加元素及 scoreZADD game:rank 95 "userA" 88 "userB" 92 "userC"(游戏排行榜)
ZRANGE key start stop [WITHSCORES]按 score 升序获取排名范围内元素(0 为第一名)ZRANGE game:rank 0 2 WITHSCORES → ["userB",88,"userC",92,"userA",95]
ZREVRANGE key start stop [WITHSCORES]按 score 降序获取排名范围内元素ZREVRANGE game:rank 0 2 WITHSCORES → ["userA",95,"userC",92,"userB",88](前三名)
ZSCORE key member获取元素 scoreZSCORE game:rank "userA" → 95
ZINCRBY key increment member元素 score 自增 increment(原子操作)ZINCRBY game:rank 5 "userB"(userB 分数 + 5 → 93)
ZRANK key member获取元素升序排名(0 为第一名)ZRANK game:rank "userB" → 0(score 88 时排名第一)
应用场景
  • 排行榜系统:实时展示用户积分、商品销量、视频播放量等排名。
    示例:直播平台礼物榜:观众送礼物时,ZINCRBY gift:rank:room100 50 "user888"(用户 888 积分 + 50),前端调用ZREVRANGE gift:rank:room100 0 9 WITHSCORES展示 “房间贡献榜 TOP10”。

  • 带权重的消息队列:按score(权重)优先级消费消息,高权重消息优先处理。
    示例:订单处理系统:普通订单ZADD order:queue 1 "order1001",VIP 订单ZADD order:queue 10 "order1002",消费者通过ZREVRANGE order:queue 0 0优先获取 VIP 订单处理。

  • 范围统计:按score范围筛选元素,如 “积分> 1000 的用户”“考试分数 80-90 分的学生”。
    示例:教育平台统计成绩:ZRANGEBYSCORE exam:math 80 90 → 获取数学成绩 80-90 分的学生 ID。

3. 高级数据类型

3.1 Bitmap(位图)

数据结构特点
  • 位级操作:将字符串视为 “位数组”,每个位(bit)表示一个二值状态(0/1);
  • 空间高效:1 字节 = 8 位,存储 100 万个状态仅需约 125KB;
  • 支持位运算:与(AND)、或(OR)、异或(XOR)、非(NOT)及位计数。
常用命令
命令功能描述示例
SETBIT key offset value设置指定偏移量的位值(0/1)SETBIT sign:user:1001 5 1(用户 1001 第 5 天签到,偏移量从 0 开始)
GETBIT key offset获取指定偏移量的位值GETBIT sign:user:1001 5 → 1(第 5 天已签到)
BITCOUNT key [start end]统计位值为 1 的数量(可指定字节范围)BITCOUNT sign:user:1001 → 15(本月累计签到 15 天)
BITOP op destkey key1 [key2]对多个 Bitmap 执行位运算,结果存到 destkeyBITOP AND sign:both:1001_1002 sign:user:1001 sign:user:1002(两人共同签到的天数)
应用场景
  • 签到统计:记录用户每日签到状态,统计每月签到天数、连续签到天数。
    示例:用户 1001 的 2025 年 8 月签到:SETBIT sign:user:1001:202508 0 1(8 月 1 日签到,偏移量 0)、SETBIT ... 2 1(8 月 3 日签到),BITCOUNT sign:user:1001:202508 → 2(当月签到 2 天)。

  • 用户在线状态:用位偏移量表示用户 ID,位值 1 表示在线,0 表示离线,高效统计在线人数。
    示例:平台在线用户:用户 5001 在线 → SETBIT online:20250814 5001 1BITCOUNT online:20250814 → 1000(当前在线人数)。

3.2 HyperLogLog(基数统计)

数据结构特点
  • 基数估算:用于统计 “集合中不重复元素的个数”(基数),而非存储元素本身;
  • 空间极致优化:无论基数多大,单个 HyperLogLog 键仅占用约 12KB 内存;
  • 概率性算法:存在 0.81% 的误差(可接受范围内),适合海量数据基数统计。
常用命令
命令功能描述示例
PFADD key element1 [element2]添加元素到 HyperLogLogPFADD uv:20250814 1001 1002 1001 1003(网站当日 UV 统计)
PFCOUNT key估算基数(不重复元素个数)PFCOUNT uv:20250814 → 3(去重后 1001、1002、1003)
PFMERGE destkey key1 [key2]合并多个 HyperLogLog 到 destkeyPFMERGE uv:202508 uv:20250801 uv:20250802 ...(合并 8 月每日 UV,统计月 UV)
应用场景
  • UV 统计:统计网站 / 页面的独立访客数,无需存储用户 ID,节省内存。
    示例:电商首页 UV:用户访问时PFADD uv:home:20250814 <user_id>,当日结束后PFCOUNT uv:home:20250814 → 50000(首页当日 UV)。

  • 搜索关键词去重:统计用户搜索过的不重复关键词数量,优化搜索推荐。
    示例PFADD search:keywords "phone" "book" "phone" "shoes"PFCOUNT search:keywords → 3(不重复关键词数)。

3.3 Geospatial(地理空间)

数据结构特点
  • 地理位置存储:存储经纬度坐标(经度范围 - 180~180,纬度范围 - 85.05112878~85.05112878),支持距离计算、范围查询;
  • 底层基于 ZSet 实现:将经纬度编码为score(Geohash 算法),通过 ZSet 命令间接操作。
常用命令
命令功能描述示例
GEOADD key longitude latitude member添加地理位置GEOADD shops 116.403 39.914 "storeA" 116.410 39.905 "storeB"(北京商店坐标)
GEODIST key member1 member2 [unit]计算两个位置的距离(unit:m/km/mi/ft)GEODIST shops storeA storeB km → 1.2(storeA 与 storeB 相距 1.2 公里)
GEORADIUS key longitude latitude radius unit [WITHDIST]搜索指定坐标半径内的位置GEORADIUS shops 116.4 39.9 5 km WITHDIST → 获取天安门 5 公里内的商店及距离
应用场景
  • 附近的人 / 地点:基于用户当前坐标,搜索周边一定范围内的人或商家。
    示例:外卖平台 “附近商家”:用户坐标(116.4, 39.9),GEORADIUS shops 116.4 39.9 3 km WITHDIST → 返回 3 公里内的商家及距离,按距离排序展示。

  • 地理位置围栏:监控设备是否进入 / 离开指定区域(如物流包裹是否到达配送范围)。
    示例:物流场景中,GEORADIUS warehouse:1 120.0 30.0 10 km → 检查 10 公里内是否有包裹(通过包裹 ID 关联的坐标),触发配送通知。

3.4 Stream(消息流)

数据结构特点
  • 持久化消息队列:支持消息持久化、消费确认、消费组(Consumer Group),解决 List 作为队列时的消息丢失、重复消费问题;
  • 消息 ID 自增:每条消息有唯一 ID(格式timestamp-sequence,如1723600000000-0),保证有序性;
  • 消费组机制:支持多消费者协同消费,每个消费者处理不同消息,避免重复消费。
常用命令
命令功能描述示例
XADD key * field value [field value]添加消息(* 表示自动生成 ID)XADD orderStream * type "pay" orderId "123" amount 99(订单支付消息)
XREAD COUNT count STREAMS key startId读取消息(startId=0-0 表示从头读)XREAD COUNT 1 STREAMS orderStream 0-0 → 读取 1 条消息
XGROUP CREATE key groupName startId创建消费组XGROUP CREATE orderStream group1 $($ 表示从最新消息开始消费)
XREADGROUP GROUP groupName consumer COUNT count STREAMS key >消费组内消费者读取消息(> 表示未消费消息)XREADGROUP GROUP group1 consumer1 COUNT 1 STREAMS orderStream > → consumer1 读取 1 条未消费消息
XACK key groupName msgId确认消息已消费XACK orderStream group1 1723600000000-0(确认消息处理完成)
应用场景
  • 可靠消息队列:替代 List 实现高可靠消息传递,支持消息重试、消费确认,适合订单处理、日志收集等场景。
    示例:电商订单系统:订单支付后XADD payStream * orderId "123" status "success",下游物流服务通过消费组XREADGROUP读取消息并处理,处理完成后XACK确认,避免消息丢失。

4. 持久化机制(RDB vs AOF)

Redis 支持两种持久化方式,可单独启用或混合使用,核心目标是防止内存数据丢失。

4.1 RDB(Redis Database)

  • 原理:在指定时间间隔内生成内存数据的快照文件(.rdb),保存到磁盘。
  • 触发方式
    • 手动触发:SAVE(阻塞 Redis,适合离线备份)、BGSAVE(fork 子进程执行,不阻塞主进程);
    • 自动触发:配置文件中save <seconds> <changes>(如save 3600 1:3600 秒内有 1 次修改则触发)。
  • 优缺点
    • 优点:文件体积小,恢复速度快(直接加载快照到内存);
    • 缺点:数据安全性低,两次快照间的修改可能丢失(如 5 分钟快照间隔,崩溃时丢失 5 分钟数据)。

4.2 AOF(Append Only File)

  • 原理:记录所有写命令(如 SET、HSET)到日志文件(.aof),重启时通过重新执行命令恢复数据。
  • 配置参数
    • appendfsync always:每条命令立即刷盘(安全性最高,性能最差);
    • appendfsync everysec:每秒刷盘一次(默认,平衡安全与性能,最多丢失 1 秒数据);
    • appendfsync no:由操作系统决定刷盘时机(性能最好,安全性最低)。
  • AOF 重写:解决 AOF 文件膨胀问题,通过BGREWRITEAOF命令生成新 AOF 文件(合并重复命令,如多次 INCR 合并为最终值)。
  • 优缺点
    • 优点:数据安全性高,丢失数据少;
    • 缺点:文件体积大,恢复速度慢(需重新执行所有命令)。

4.3 混合持久化(Redis 4.0+)

  • 原理:AOF 文件头部存储 RDB 快照,尾部存储增量 AOF 命令,结合 RDB 恢复快和 AOF 数据全的优点。
  • 配置aof-use-rdb-preamble yes(默认开启)。

4.4 持久化方案选择

场景推荐方案理由
数据安全性要求高(如金融交易)AOF(everysec)+ 混合持久化最多丢失 1 秒数据,恢复速度较纯 AOF 快
性能优先(如缓存场景)RDB(或禁用持久化)减少磁盘 IO 开销,缓存数据可从数据库重建
灾备需求RDB 定期备份 + AOF 实时记录RDB 用于全量恢复,AOF 用于增量数据补充

5. 高可用方案(主从复制与哨兵)

5.1 主从复制

  • 作用:实现数据备份与读写分离,主库(Master)负责写操作,从库(Slave)同步主库数据并提供读服务。
  • 原理
    • 全量复制:从库首次连接主库时,主库生成 RDB 快照发送给从库,从库加载快照后,主库再发送缓冲的增量命令;
    • 增量复制:后续主库将写命令记录到repl_backlog_buffer,从库通过偏移量(offset)同步增量命令。
  • 配置:从库配置slaveof <master-ip> <master-port>,主库无需额外配置。
  • 应用:读写分离(主库写、从库读),如电商商品详情查询走从库,减轻主库压力。

5.2 哨兵(Sentinel)

  • 作用:监控主从节点状态,实现自动故障转移(主库挂了后从库自动升级为主库)。
  • 核心功能
    • 监控:定期检查主从节点是否存活;
    • 通知:通过 API 向管理员或其他应用发送故障通知;
    • 自动故障转移:主库故障时,选举从库升级为主库,其他从库重新指向新主库。
  • 部署:通常部署 3 个哨兵节点(奇数,避免脑裂),配置文件指定监控的主库信息。
  • 示例:一主二从 + 三哨兵架构,主库挂了后,哨兵通过投票选举其中一个从库升级为主库,客户端通过哨兵获取新主库地址继续访问。

6. Redis Cluster(分布式集群)

6.1 核心概念

  • 分片存储:将数据按 “槽位”(共 16384 个槽)分配到多个节点,每个节点负责一部分槽位(如 3 主节点各负责 5461 个槽);
  • 主从复制:每个主节点可配置从节点,实现数据备份与故障转移;
  • 去中心化:无中心节点,客户端直接与槽位对应节点通信,节点间通过 Gossip 协议交换状态。

6.2 数据路由

  • 槽位计算:客户端根据CRC16(key) % 16384计算 key 所属槽位;
  • 重定向:若客户端连接的节点不负责目标槽位,返回MOVED错误,指引客户端连接正确节点。

6.3 应用场景

  • 海量数据存储:突破单机内存限制,如存储 100GB 数据,可通过 3 主 3 从集群(每主节点 30GB + 内存)分片存储;
  • 高并发访问:多节点分担读写压力,提升整体吞吐量。

7. 性能优化实践

7.1 键设计规范

  • 命名规范:用冒号分隔命名空间,如user:1001:infoorder:202508:list,避免键名混乱;
  • 避免大键:单个 key 存储数据不超过 10KB(如大 List、大 Hash 拆分存储),防止操作阻塞 Redis;
  • 过期键清理:对缓存数据设置合理过期时间(EX/PX),避免内存溢出。

7.2 内存淘汰策略

当内存达到maxmemory限制时,Redis 通过以下策略淘汰键(配置maxmemory-policy

策略名称说明(优先级从高到低)
volatile-lru从设置过期时间的键中,淘汰最近最少使用的键
allkeys-lru从所有键中,淘汰最近最少使用的键
volatile-ttl从设置过期时间的键中,淘汰剩余时间最短的键
noeviction不淘汰键,写操作返回错误(默认,不推荐生产环境)

推荐配置:缓存场景用allkeys-lru(优先淘汰冷数据),业务数据用volatile-lru(仅淘汰过期缓存)。

7.3 命令与网络优化

  • 批量操作:用MSET/MGET(String)、HMSET/HMGET(Hash)替代循环单条命令,减少网络往返;
  • Pipeline:客户端将多个命令打包发送,Redis 批量执行后返回结果,适合大量小命令场景(如批量更新库存);
  • 避免阻塞命令:禁用KEYS *(遍历所有键,阻塞 Redis),改用SCAN(迭代遍历);避免HGETALL(大 Hash 全量获取),改用HMGET指定字段。

8. 总结

Redis 凭借丰富的数据结构高性能持久化分布式支持等特性,成为缓存、数据库、消息队列等场景的首选工具。核心知识点包括:

  • 数据类型:String(缓存、计数器)、Hash(对象存储)、List(队列)、Set(集合运算)、ZSet(排行榜)等,需结合场景选择合适类型;
  • 持久化:RDB(性能优先)与 AOF(安全优先),生产环境推荐混合持久化;
  • 高可用:主从复制(读写分离)+ 哨兵(故障转移);
  • 分布式:Redis Cluster 实现分片存储,突破单机限制。

通过合理设计键结构、优化命令、配置持久化与高可用策略,可充分发挥 Redis 性能,支撑高并发业务场景。

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

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

相关文章

日常反思总结

1.group by和order by的区别

易贝 (eBay (eBay) 关键字搜索 API 实战:从认证到商品列表获取全流程解析

在跨境电商开发领域&#xff0c;eBay 作为全球最大的在线交易平台之一&#xff0c;其开放 API 为开发者提供了丰富的商品数据获取能力。本文将聚焦 eBay 关键字搜索商品列表接口的实现&#xff0c;涵盖 OAuth2.0 认证、高级搜索参数配置、分页策略及完整代码实现&#xff0c;帮…

敏捷数据开发实践:基于 Amazon Q Developer + Remote MCP 构建本地与云端 Amazon Redshift 交互体系

敏捷数据开发实践&#xff1a;基于 Amazon Q Developer Remote MCP 构建本地与云端 Amazon Redshift 交互体系 新用户可获得高达 200 美元的服务抵扣金 亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐&#xff08;Amazon Free Tier&#xff09;。注册即可获得 100 美元的…

【SpringBoot】11 概念理解 - 深入理解 Java 和 Spring 中的容器、组件、类、对象与 Bean

文章目录引言1. 基本概念解析1.1 类&#xff08;Class&#xff09;1.2 对象&#xff08;Object&#xff09;1.3 组件&#xff08;Component&#xff09;1.4 Bean 实例&#xff08;Bean Instance&#xff09;1.5 容器&#xff08;Container&#xff09;2. 运行时 vs. 非运行时的…

【学习嵌入式day-25-线程】

exec函数族exec函数族利用进程空间执行另一份代码#include "../head.h"int main(void) {char *parg[5] {"./hello","how","are","you",NULL,};printf("execl-up\n");//execl("./hello", "./hello…

Rust 中 Box 的深度解析:作用、原理与最佳实践

Rust 中 Box 的深度解析&#xff1a;作用、原理与最佳实践 Box 是 Rust 中最基础且最重要的智能指针类型&#xff0c;它在 Rust 的内存管理和所有权系统中扮演着核心角色。以下是关于 Box 的全面解析&#xff1a; Box 的核心作用 #mermaid-svg-m6liFZlmqOHRfIZB {font-family:&…

【测试用例】

需求背景部分金融/政企等行业客户&#xff0c;企业内部安全要求较高&#xff0c;且因为某些原因未接入 sso 登录&#xff0c;会要求 MG 提供较为复杂的密码规则甚至提供强更机制&#xff1b;且每个客户的安全要求不一样目前 MG 线上密码规则&#xff1a; 8 位以上&#xff0c;包…

Klipper-probe模块

配置信息[probe] pin: !PD4 x_offset: 0 y_offset: 0 z_offset: -0.20 #the distance between nozzle and level switch speed: 10 samples: 2 #probe one point three times get an average samples_result: average sample_retract_dist: 5 samples_tolerance: 0.05 # …

Excel多级数据结构导入导出工具

Excel多级数据结构导入导出工具 这是一个功能强大的Excel导入导出工具库&#xff0c;专门用于处理复杂的多级嵌套数据结构。通过自定义注解配置&#xff0c;可以轻松实现Java对象与Excel文件之间的双向转换。 核心功能特性 1. 多级数据结构支持 嵌套对象处理: 支持任意层级的对…

基于UniApp的新大陆物联网平台温湿度检测系统开发方案

新大陆物联网平台对接要点 认证方式&#xff1a; 使用AccessToken进行API认证 Token存储在本地缓存中 数据格式&#xff1a; 温度数据单位&#xff1a;摄氏度(C) 湿度数据单位&#xff1a;百分比(%) 时间格式&#xff1a;ISO 8601或时间戳 设备状态&#xff1a; online:…

Git、JSON、MQTT

GIT简介&#xff1a;Git是什么&#xff1f;Git是目前世界上最先进的分布式版本控制系统作用&#xff1a;版本控制&#xff08;版本的备份--->版本的回溯和前进&#xff09;多人协作优势&#xff1a;SVN(集中式)劣势&#xff1a;过度依赖服务器和网络&#xff0c;容灾性差Git…

yolo目标检测技术之yolov11项目实战(三)

yolo目标检测技术之yolov11项目实战&#xff08;三&#xff09; 文章目录yolo目标检测技术之yolov11项目实战&#xff08;三&#xff09;一、 基于 YOLO11 的火焰与烟雾检测系统&#xff08;实战代码&#xff09;项目目标环境搭建创建虚拟环境安装依赖1.1 数据集准备1. 下载地址…

CF思维小训练(二)

清晰的缤纷的都可以 脏兮兮的甜的也都有转机 不想太小心 错过第一百零一场美丽 CF思维小训练&#xff08;二&#xff09; 书接上回CF思维小训练-CSDN博客 虽然代码很短&#xff0c;都是每一道题的背后都思维满满&#xff1b; 目录CF思维小训练&#xff08;二&#xff09;Arbo…

分布式锁:从理论到实战的深度指南

1. 分布式锁是啥&#xff1f;为什么它比单机锁更“硬核”&#xff1f;分布式锁&#xff0c;听起来高大上&#xff0c;其实核心问题很简单&#xff1a;在多个机器、进程或服务同时抢夺资源时&#xff0c;怎么保证不打架&#xff1f; 想象一下&#xff0c;你在双十一抢购限量款球…

基于UniApp的智能在线客服系统前端设计与实现

了解更多&#xff0c;搜索“程序员老狼”一、引言在当今数字化时代&#xff0c;客户服务已成为企业竞争力的重要组成部分。本文将详细介绍一款基于UniApp框架开发的跨平台智能客服系统前端实现方案&#xff0c;该系统不仅具备传统客服功能&#xff0c;还融入了现代即时通讯和人…

react与vue的对比,来实现标签内部类似v-for循环,v-if等功能

前言&#xff1a;在vue中我们提供了很多标签方法&#xff0c;比如用的比较多的v-for循环内容&#xff0c;v-if/v-show等判断&#xff0c;可以直接写在标签中&#xff0c;大大提高了我们的开发效率&#xff0c;那么在react中有没有类似的方法呢&#xff1f;我们这里来说一说。re…

PCB工艺-四层板制作流程(简单了解下)

一&#xff09;流程&#xff1a;四层板的内层芯板&#xff0c;是由一张双面覆铜板PP*2铜箔*2覆铜板蚀刻好线路&#xff0c;就是我们的芯板了PP全名叫半固化片&#xff0c;主体是玻璃纤维布环氧树脂&#xff0c;是绝缘介质铜箔片&#xff0c;是单独一张铜箔&#xff0c;很薄&…

无人机三维路径规划

文章目录 1、引言 2、背景知识 3、核心算法 4、挑战与优化 5、初始效果 6、需要改进地方 7、水平方向优化路线 8、垂直方向优化路线 9、与经过路线相交的网格都绘制出来 1、引言 介绍三维路径规划的定义和重要性:在无人机、机器人导航、虚拟现实等领域的应用。 概述文章目标和…

Spring-解决项目依赖异常问题

一.检查项目的Maven路径是否正确在确保新项目中的依赖在自己的电脑中已经存在的情况下&#xff1a;可以检查项目的Maven路径是否正确在拿到一个新项目时&#xff0c;要检查这个项目的Maven路径是自己电脑上设置好的Maven路径吗&#xff1f;如果不是&#xff0c;项目依赖会出问题…

系统设计——DDD领域模型驱动实践

摘要本文主要介绍了DDD&#xff08;领域驱动设计&#xff09;在系统设计中的实践应用&#xff0c;包括其在编码规范、分层架构设计等方面的具体要求和建议。重点强调了应用层的命名规范&#xff0c;如避免使用模糊的Handler、Processor等命名&#xff0c;推荐使用动词加业务动作…