Redis 各数据类型使用场景详解
1. 字符串(String)
场景 1:计数器(如文章阅读量)
-
问题:
-
高并发下对同一数值进行增减操作时,需保证原子性,避免竞态条件导致数据不一致。
-
频繁读写可能成为性能瓶颈。
-
-
解决方案:
-
INCR
/DECR
命令:Redis 的原子操作确保增减操作的线程安全,无需额外锁机制。 -
内存存储:数据直接存储在内存中,读写速度极快(微秒级响应)。
-
场景 2:分布式锁
-
问题:
-
多节点服务竞争同一资源时,需确保同一时间只有一个客户端持有锁。
-
锁需支持自动释放(如超时),避免死锁。
-
-
解决方案:
-
SETNX
+EXPIR
SET lock:order_123 "client1" NX EX 30 # 设置锁,30秒后自动过期
-
通过原子性命令确保锁的唯一性,过期时间防止客户端崩溃导致锁无法释放。
-
2. 列表(List)
场景 1:消息队列(生产者-消费者模型)
-
问题:
-
多生产者/消费者场景下,需保证消息的顺序性和可靠性。
-
消费者轮询队列会浪费资源(如空轮询)。
-
-
解决方案:
-
LPUSH
+BRPOP
:-
生产者使用
LPUSH
将消息推入队列头部。 -
消费者使用
BRPOP
阻塞式地从队列尾部获取消息,避免空轮询。
-
-
示例:
LPUSH task_queue "task_data" # 生产者推送任务 BRPOP task_queue 30 # 消费者阻塞30秒等待任务
-
场景 2:最新动态列表(如用户最近10条动态)
-
问题:
-
动态需按时间倒序展示,且需限制列表长度(如只保留最新100条)。
-
频繁插入可能导致内存占用过高。
-
-
解决方案:
-
LPUSH
+LTRIM
:LPUSH user:1:feeds "new_feed" # 插入新动态 LTRIM user:1:feeds 0 99 # 保留最新的100条
-
通过
LTRIM
自动裁剪旧数据,控制内存使用。
-
3. 哈希(Hash)
场景 1:存储用户信息(对象缓存)
-
问题:
-
对象字段较多时,若用多个
String
存储,会产生大量键,增加内存和管理成本。 -
部分更新需频繁序列化/反序列化整个对象。
-
-
解决方案:
-
HMSET
/HGETALL
:HMSET user:1001 name "Alice" age 30 email "alice@example.com" HGETALL user:1001 # 获取所有字段
-
哈希表将对象字段存储为单键下的多个字段,减少键数量,支持按字段读写。
-
场景 2:商品库存管理
-
问题:
-
高并发下单时,需保证库存扣减的原子性。
-
扣减后需实时更新库存值。
-
-
解决方案:
-
HINCRBY
命令:HINCRBY product:1001 stock -1 # 原子性扣减库存
-
哈希表结合
HINCRBY
实现原子性库存操作,避免超卖。
-
4. 集合(Set)
场景 1:用户标签系统
-
问题:
-
用户标签需唯一且无序,便于快速查询共同标签或去重。
-
多标签集合操作(如交集、并集)需高效执行。
-
-
解决方案:
-
SADD
+SINTER
:SADD user:1:tags "tech" "music" # 添加标签 SINTER user:1:tags user:2:tags # 获取共同标签
-
集合的
SINTER
直接计算交集,复杂度为 O(N*M),但内存中操作极快。
-
场景 2:唯一访问用户统计(去重)
-
问题:
-
同一用户多次访问同一资源时需去重统计。
-
直接记录用户ID可能导致重复存储。
-
-
解决方案:
-
SADD
+SCARD
:SADD article:1001:views "user:2023" # 用户访问时添加 SCARD article:1001:views # 获取唯一用户数
-
集合自动去重,
SCARD
直接返回唯一用户总数。
-
5. 有序集合(Sorted Set)
场景 1:游戏积分排行榜
-
问题:
-
玩家积分需实时排序,支持按名次快速查询。
-
积分更新频繁,需保证排序的高效性。
-
-
解决方案:
-
ZADD
+ZREVRANGE
:ZADD leaderboard 1000 "player1" # 添加/更新玩家积分 ZREVRANGE leaderboard 0 9 WITHSCORES # 获取前十名
-
有序集合内部通过跳表(Skip List)实现,插入和查询时间复杂度为 O(log N)。
-
场景 2:延迟队列(按时间戳调度任务)
-
问题:
-
任务需在指定时间执行,需按时间顺序处理。
-
轮询未到期的任务会浪费资源。
-
-
解决方案:
-
ZADD
+ZRANGEBYSCORE
:ZADD delay_queue 1630000000 "task_data" # 添加任务,分数为执行时间戳 ZRANGEBYSCORE delay_queue 0 <current_timestamp> # 获取所有到期任务
-
消费者定期查询分数小于当前时间戳的任务并处理。
-
6. 扩展数据类型
场景 1:用户签到统计(Bitmap)
-
问题:
-
每日签到状态只需记录是否签到(0/1),使用字符串浪费内存。
-
统计连续签到天数需高效计算。
-
-
解决方案:
-
SETBIT
+BITCOUNT
:SETBIT user:1001:sign:2023:10 5 1 # 10月第6天签到(偏移量从0开始) BITCOUNT user:1001:sign:2023:10 # 统计10月签到次数
-
位图每个位表示一天,每月31天仅需4字节,内存占用极低。
-
场景 2:独立访客统计(HyperLogLog)
-
问题:
-
海量用户访问记录需统计唯一用户数,精确统计内存占用过高。
-
允许一定误差(如0.81%)。
-
-
解决方案:
-
PFADD
+PFCOUNT
:PFADD uv:2023:10:01 "user1" "user2" # 记录UV PFCOUNT uv:2023:10:01 # 估算UV数
-
HyperLogLog 固定使用12KB内存,可统计上亿唯一值。
-
场景 3:附近商家查询(Geospatial)
-
问题:
-
需根据经纬度快速检索附近一定范围内的商家。
-
直接计算距离性能差(需遍历所有点)。
-
-
解决方案:
-
GEOADD
+GEORADIUS
:GEOADD shops 116.405285 39.904989 "shop1" # 添加商家坐标 GEORADIUS shops 116.40 39.90 10 km # 查询10公里内的商家
-
底层使用有序集合存储坐标(经度+纬度编码为分数),支持快速范围查询。
-
场景 4:订单事件日志(Stream)
-
问题:
-
订单状态变更需记录完整事件流,供后续审计或重放。
-
多消费者需独立消费同一消息流(如支付服务和库存服务)。
-
-
解决方案:
-
XADD
+ 消费者组(Consumer Group):XADD order:1001:events * status "paid" amount 200 # 添加事件 XGROUP CREATE order:1001:events group1 0 # 创建消费者组 XREADGROUP GROUP group1 consumer1 STREAMS order:1001:events > # 消费消息
-
Stream 支持多消费者组、消息确认和回溯,类似 Kafka 的日志机制。
-
总结
数据结构 | 核心问题 | Redis的解决方案 |
---|---|---|
String | 并发计数、分布式锁 | 原子操作(INCR )、SETNX + 过期时间 |
List | 消息顺序性、动态列表长度控制 | 阻塞弹出(BRPOP )、LPUSH + LTRIM |
Hash | 对象字段管理、部分更新 | 字段级读写(HSET /HGET ) |
Set | 去重、集合运算 | 唯一性存储、SINTER /SUNION |
Sorted Set | 按权重排序、范围查询 | 跳表排序、ZRANGEBYSCORE |
Bitmap | 二值状态统计(如签到) | 位操作(SETBIT /BITCOUNT ) |
HyperLogLog | 海量数据去重统计(允许误差) | 固定内存估算基数(PFADD /PFCOUNT ) |
Geospatial | 地理位置检索 | 有序集合编码坐标(GEORADIUS ) |
Stream | 消息多消费者组、事件溯源 | 消费者组、消息ID序列(XREADGROUP ) |
关键原则:
-
选择最匹配业务需求的数据结构,避免用
String
存储复杂对象。 -
优先利用 Redis 原子操作,减少客户端复杂逻辑。
-
关注内存效率(如小对象用
Hash
,二值数据用Bitmap
)。
相关文章:
Redis 各数据类型使用场景详解
1. 字符串(String) 场景 1:计数器(如文章阅读量) 问题: 高并发下对同一数值进行增减操作时,需保证原子性,避免竞态条件导致数据不一致。 频繁读写可能成为性能瓶颈。 解决方案&a…...
spark写数据库用连接池找不到driver类
最近遇到一个很离谱的bug,在写spark代码把数据写到mysql的时候考虑到连接的开销,所以用了HikariCP连接池,但是无语的是程序执行死活加载不到mysql的Driver类,但是解压了jar看到mysql-conn包就在lib下面,版本也是5.x的没…...
上传文件到对象存储是选择前端还是后端
对于云上对象存储的上传方式选择(前端直传或后端代理上传),需综合考虑安全性、性能、成本、业务需求等因素。 1. 推荐前端直传的场景 适用条件: 大文件上传(如视频、大型数据集)高并发场景(如…...
NanoMQ ds笔记250306
NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq NanoMQ官方文档 https://nanomq.io/docs/zh/latest/ NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理(Message Broker),由中国的开源物联网公司 EMQ 开…...
sqlmap:从基础用法到漏洞利用实战
1. sqlmap基础认知 sqlmap是一款开源的渗透测试工具,能自动检测和利用SQL注入漏洞,支持MySQL、Oracle、PostgreSQL等多种数据库管理系统。其设计旨在简化SQL注入检测流程,助力安全人员在复杂网络环境中快速定位与评估漏洞风险。它通过发送精…...
DFS学习笔记
题目描述 X 国王有一个地宫宝库。是 nm 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值…...
C++ STL string容器全解析
一、引言 在 C 编程的广阔领域中,字符串处理是一项极为基础且频繁的操作。从简单的文本解析,到复杂的文件读取与处理,字符串几乎无处不在。而 C 中的 string 容器,就像是一把瑞士军刀,为我们处理字符串提供了强大而便…...
React基础之项目创建
项目创建 create-react-app 项目名(小写) 运行 pnpm run start 在React中,使用的语法格式是jsx,也就是js与html相结合的形式 import logo from ./logo.svg; import ./App.css; function App() { return ( <div className"App"> <head…...
迷你世界脚本道具接口:Item
道具接口:Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID,如球类等 3 getDropItemNum(...) …...
Unity摄像机跟随物体
功能描述 实现摄像机跟随物体,并使物体始终保持在画面中心位置。 实现步骤 创建脚本:在Unity中创建一个新的C#脚本,命名为CameraFollow。 代码如下: using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…...
计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
vue实现日历签到效果
在工作任务进行时,有一个签到日历的功能需求要实现,经过文档查询和样式优化实现了需求,在此记录一下。 技术背景:vue2vant(样式控件) less 一个公共样式文件 html实现部分: <div class"calenderB…...
(十 八)趣学设计模式 之 观察者模式!
目录 一、 啥是观察者模式?二、 为什么要用观察者模式?三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
笔记:在Git中.gitmodules文件的功能和作用和如何使用
一、目的:简单介绍下在Git中.gitmodules文件的功能和作用已经 .gitmodules 文件是 Git 子模块(submodule)功能的一部分,用于管理和配置子模块。子模块允许一个 Git 仓库包含另一个 Git 仓库作为其子目录,这对于管理依赖…...
Swift 常量
Swift 常量 引言 Swift 是一种由苹果公司开发的编程语言,主要用于 iOS、macOS、watchOS 和 tvOS 等平台的应用开发。在 Swift 中,常量是一种不可变的变量,它用于存储固定不变的值。了解和使用常量是 Swift 编程的基础,本文将详细介绍 Swift 常量的概念、类型、声明以及使…...
Ubuntu20.04双系统安装及软件安装(七):Anaconda3
Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…...
Google AI概览升级,AI模式全新登场!
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务, 智能体自动生成完成任务所需步骤, 执行相应动作(例如选择并调用工具), 直到任务完成。 2. 先定义工具:Tools 可以是一个函数或三方 API也…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
安卓基础组件Looper - 02 native层面的剖析
文章目录 native使用使用总结创建Looper构造函数创建(不推荐)使用举例源代码 Looper::prepare 获取Looper可忽略初始化Looper主动休眠 pollAll主动唤醒 wake 发送消息 sendMessage轮询消息 native使用 Android Native Looper 机制 - 掘金 (juejin.cn) /system/core/libutils/…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
QTday4
1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…...
服务器时间同步
方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服务器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多个 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…...
蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...
DeepSeek大模型 —— 全维度技术解析
DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…...
嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
Ubuntu 24.04 配置ODBC连接ORACLE 11G数据库
1. 安装必要工具和驱动 1.1 安装unixODBC和依赖库 # apt update # apt install unixodbc unixodbc-dev libaio1 执行失败,报错 libaio1包找不到,先跳过,安装其他两个。 # apt install unixodbc unixodbc-dev 安装成功 1.2 下载Oracle…...
upload-labs靶场 1-21通关
目录 1.Pass-01 前端绕过 分析 解题 2.Pass-02 服务器端检测--修改IMME 分析 解题 3.Pass-03 黑名单绕过 分析 解题 4.Pass-04 .htaccess绕过 分析 解题 5.Pass-05 . .绕过和.user.ini绕过 分析 解题 6.Pass-06 大小写绕过 分析 解题 7.Pass-07 空格绕过 分…...
Docker新手入门(持续更新中)
一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…...
c语言笔记 指针篇(上)
1.指针 在计算的存储器中有很多的存储单元,我们的操作系统把这些存储单元以字节为单位进行编号,也就是每个存储单元(字节),都有编码。这些编码在我们内存中就称为地址。一个字节有八位,位是存储信息的最小单…...
要查看 SQLite 数据库中的所有表,可以通过查询 SQLite 的系统表 sqlite_master
要查看 SQLite 数据库中的所有表,可以查询 SQLite 的系统表 sqlite_master。 每个 SQLite 数据库都包含一个名为 sqlite_master 的系统表。该表定义了数据库的模式,存储了数据库中所有表、索引、视图和触发器等对象的信息。 通过查询 sqlite_master&am…...
C#释放内存空间的方法
目录 前言释放 C# 对象内存的六种方法1、手动释放内存空间2、使用 Using 语句3、使用 垃圾回收器4、GC.Collect() 方法5、GC.WaitForPendingFinalizers() 方法6、WeakReference 类 注意 前言 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供…...
mapbox基础,使用点类型geojson加载symbol符号图层,用于标注文字
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️symbol符号图层样式二、🍀使用点类型…...
Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
本文详细讲解了数组的定义、数组的访问方法、数组的遍历、静态数组和动态数组、以及数组中的自动类型转换、引用类型指向数组的地址、以及从JVM理解数组、空指针异常、数组反转、随机排名的案例。 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索…...
网络安全wireshark题目
一、填空题: 网络安全的目标是在计算机网络的信息传输、存储与处理的整个过程中,提高 物理逻辑上 的防护、监控、反应恢复和 对抗 的能力。SSL协议是在网络传输过程中,提供通信双方网络信息 保密性 和 可靠性 。TCP/IP网络安全管理…...
TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图,与 jre,应用程序之前的关系 安装使用 tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11 cmd 中默认 gbk 编码,解决控制…...
Seurat - Guided Clustering Tutorial官方文档学习及复现
由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。 参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
C语言笔记(通讯录)
目录 1.通讯录的架构 2.通讯录的功能 3.实现静态通讯录的功能步骤 3.1.创建通讯录数组 3.2.显示功能菜单 3.3.初始化通讯录 3.4.添加联系人的信息 3.5.显示联系人的信息 3.6.查找某个人的信息 3.7.删除某一个联系人信息 3.8.修改某一联系人的信息 3.9.按名字对联系…...
【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...
Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...
Linux(Centos 7.6)命令详解:vi
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...
Ubuntu 20.04下配置VSCode以支持Eigen库开发
这里写目录标题 1. 安装Eigen库2. 配置VSCode的C开发环境3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json(可选)6. 运行程序总结 在VSCode中配置Eigen库(用于线性代数、矩阵和向量运算的C库)的步骤如下ÿ…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Android14 OTA差分包升级报kPayloadTimestampError (51)
由于VF 架构, 所以镜像的打包时间可能存在偏差, 如 boot.img 和 客制化的一些镜像打包 可能会在 vendor 侧进行打包。 而 与system 侧进行merge 时,时间戳比较乱,为了解决这个问题,让时间戳进行统一。 使用adb方式验证…...