

差集:
差集有两个方向,业务含义完全不同:
- A − B:在 A 但不在 B 的元素。比如「云端有、本地无 → 要下载」
- B − A:在 B 但不在 A 的元素。比如「本地有、云端无 → 要上传」
云相册多端同步:
4.1 根本洞察:云端和设备,就是两个集合
云相册里每个文件都有一个全局唯一 ID(一般是 SHA-256 哈希值,或服务器分配的 UUID)。
- 云端清单 C:云端认为存在的所有文件 ID
- 每台设备各自的清单 D:该设备本地存储的所有文件 ID
同步的本质 = 让 C 和 D 在「文件存在性」这个维度上达成一致。
而「达成一致」需要回答三个问题:
| 问题 | 集合语言 | 业务动作 |
| 哪些文件两边都有? | 差集 C ∩ D | 啥也不做 |
| 哪些云端有、本地无? | 差集 C − D | 本地下载 |
哪些本地有、云端无? 差集 D − C 本地上传
4.2、场景落地1
场景1:云相册有 a、b、c、d,手机刚把 d 上传了,Pad 和电脑都还缺 d。
初始状态:
| 角色 | 文件清单 | 状态 |
| 云端 C | {a, b, c} | 等着收 d |
| 手机 P | {a, b, c, d} | 本地有 d,要上传 |
| Pad Pd | {a, b, c} | 缺 d |
电脑 PC {a, b, c} 缺 d 第 1 步:手机上传 d
手机端跑一次扫描:P − C = {d}。手机上送 d 到云端。云端接收,C 变成 {a, b, c, d}。
第 2 步:Pad 打开 App,开始同步
Pad 拉取云端清单 C = {a, b, c, d},对照本地 Pd = {a, b, c},跑扫描:
- a == a → 交集
- b == b → 交集
- c == c → 交集
- C 还有 d,但 Pd 已经走完 → 把 d 加入「待下载」队列
- 结果:交集 {a, b, c},待下载 {d}
Pad 下载 d,本地变成 {a, b, c, d}。
第 3 步:电脑打开 App,同步
完全相同的流程,电脑也变成 {a, b, c, d}。
第 4 步:全员一致
现在 C = P = Pd = PC = {a, b, c, d}。再跑一次扫描,交集是全集、两个差集都为空------什么都不做。
4.3、场景落地2
场景2:女生来查男朋友的手机,发现男朋友手机上有一张初恋照片,女生很生气,男生为了哄女朋友,当着女生的面删掉了图片,哄好了,但是男生舍不得,事后又下载回来了,女生也是一位计算机大佬,被哄好后,突然想到云端可能还有备份,又去突击检查男朋友手机,结果发现男朋友又把初恋照片下载回来了,女生当即彻底删除掉男生初恋照片。
📌
| 设备 \ 云端 | 无 | active | tombstone |
| 无 | 0. 真的没了 | 1. 设备要下载 | 2. 假装不存在(不下载) |
有 3. 设备要上传 4. 已同步 5. 设备要删除 1. 幕 1:发现初恋照片
- 手机 P = {a, b, c, d, ex_photo}
- 云端 C = {a, b, c, d, ex_photo}
- ex_photo 状态:(有, active) ------ 状态 4,已同步
- 系统层面:无事发生,这是稳态
2. 幕 2:男生当面删除
| 步 | 操作 | 手机本地 ex_photo | 云端 ex_photo |
| 1 | 主相册长按 → 删除 | 移到本地"最近删除" | 不动 |
| 2 | 本地"最近删除"→ 删除 | 彻底没了 | 还是 active |
3 锁屏哄女朋友 ------ ------ 此刻状态:
- 手机端:ex_photo 在主相册和"最近删除"里都没了 → 本地真的没了
- 云端:ex_photo 仍然是 active(从来没收到过删除事件)
- 二元组状态:(无, active) ------ 状态 1
男生表演得很彻底,但他只清理了云端数据在他这一台设备上的投影。云端那份真身,他一手指头都没碰。
3. 幕 3:男生舍不得,偷偷下回来
场景 A:什么都不做,等同步
只要以下任一事件发生,照片就会自己回来:
- 手机重启 / 相册 App 重启
- 网络从断到通
- 后台定时同步任务触发
- 任何一次「下拉刷新相册」
因为:
- 设备 P = {a, b, c, d}(ex_photo 已被本地彻底删)
- 云端 C = {a, b, c, d, ex_photo}
- 跑一次
C − P→ {ex_photo}- 手机 App 看到云端多了一个文件 → 自动下载到主相册
场景 B:男生主动"下回来"
主动的可能操作:
- 登录云相册网页版 / 另一台登录过的设备
- 看到 ex_photo 还在(因为他从来没告诉云端要删)
- 主动下载 / 触发同步
4. 幕 4:女生突击检查
发现男朋友初恋照片又躺在男朋友手机里。
5. 幕 5:女生彻底删除
- 在云端软删 ex_photo → 云端 active 变 tombstone
- 立即在云端回收站硬删 ex_photo → 云端文件字节被抹
- 在所有设备 相册删 ex_photo(不只是手机------Pad/电脑也得删)
- 跨设备同步:确保每台设备都把删除事件上送到云端,且云端的状态是"无 + 无"
- 清缓存、清共享相册
4.4、场景落地3
场景3:明明吃完晚饭在路边散步,看到夕阳很美,用手机拍了一张照片,回家后用修图软件给照片加了滤镜,保存的时候选择了覆盖原图。
第 1 步:拍照
- 手机:
{a, b, c, d, sunset}- 云端:
{a, b, c, d}- 差集(手机独有)=
{sunset}→ 上传第 2 步:上传完成
- 手机:
{a, b, c, d, sunset}- 云端:
{a, b, c, d, sunset}- 交集 = 全部 → 啥也不用做
第 3 步:加滤镜,覆盖原图
- 文件名还是
sunset- 但内容变了(多了一层滤镜的像素数据)
📌两边都有、但内容不同的 → 上传新内容(或冲突让你选)