同步状态应分离存储:数据库存权威元数据(如device_sync_states表),redis缓存高频状态(如sync:note:{id}:{dev});设备识别需客户端显式传x-device-id;冲突检测用自增revision而非时间戳;软删除需纳入同步流程,待设备确认后才forcedelete。

同步状态该存在数据库还是 Redis?
跨设备同步的本质是解决“多端看到的状态一致性”问题,不是单纯的数据复制。Laravel 里最常踩的坑是把同步状态(比如某条笔记是否已同步到 iPad)硬塞进主业务表,结果一写并发就锁表、一查就拖慢接口。
正确做法是分离「业务数据」和「同步元数据」:
-
users、notes等表只存核心字段,不加synced_at、device_last_seen这类字段 - 用独立表
device_sync_states(含user_id、device_id、last_synced_at、version_hash)记录每台设备的同步水位 - 高频更新/查询场景(如实时协作光标)改用 Redis:键为
sync:note:{note_id}:{device_id},值存 JSON 包含revision和ts
Redis 快但不持久;数据库可靠但有锁风险。别用 Redis 存最终一致性的「权威版本号」,也别用 MySQL 做每秒几十次的设备心跳更新。
Laravel API 怎么识别并隔离不同设备的请求?
靠 Authorization 头里的 token 不够——同一个用户在手机、平板、网页可能共用一个 Personal Access Token,后端根本分不清这次请求来自哪台设备。
必须让客户端在每次请求中显式声明设备身份:
- 客户端生成稳定设备 ID(iOS 用
advertisingIdentifier,Android 用Settings.Secure.ANDROID_ID,Web 用navigator.userAgent + screen.width拼接哈希) - API 请求头带上
X-Device-ID: <code>8a3f2c1e...,后端用中间件解析并绑定到$request->device() - 不要依赖 IP 或 User-Agent 做设备识别——NAT、CDN、浏览器自动更新都会让它失效
没这层识别,后续的冲突检测、增量同步、设备下线清理全都会错乱。
怎么判断两台设备修改了同一份数据?
Laravel 默认的 Eloquent updated_at 时间戳无法支撑冲突检测:时钟不同步、批量操作、事务延迟都会导致时间不可比。
必须引入逻辑版本控制:
- 给业务表加
revision字段(类型unsignedBigInteger),每次更新自增 1 - 客户端提交修改时,必须附带它“基于哪个 revision”做的变更(字段名建议叫
base_revision) - 服务端收到请求后,先查当前 DB 中该记录的
revision:
– 若相等,直接更新 +revision++
– 若不等,返回409 Conflict和当前最新内容,由客户端决定合并或覆盖
别用 MD5 或时间戳做版本标识——它们无法表达“顺序”,也无法避免哈希碰撞。
软删除模型如何安全同步?
用 SoftDeletes trait 的模型,deleted_at 字段在跨设备同步里是个隐形炸弹:一台设备删了某条笔记,另一台设备可能还在编辑它,而 whereNull('deleted_at') 查询会直接漏掉这条“已删未同步”的数据。
解决方案是把软删除也纳入同步状态流:
- 删除操作不直接调
$note->delete(),而是走专用同步方法$note->markAsDeletedForDevice($deviceId) - 同步时,不仅拉取
deleted_at IS NULL的记录,也要查device_sync_states表里该设备尚未确认的删除事件 - 客户端收到删除指令后,本地执行软删,并回传确认;服务端等所有设备确认后,才真正执行
forceDelete()
跳过这一步,你永远不知道某条“消失”的数据,到底是被删了,还是同步丢了。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











