【科普】【差集&交集概念落地云相册】流食般投喂

差集:

差集有两个方向,业务含义完全不同:

  • 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
  • 但内容变了(多了一层滤镜的像素数据)

📌两边都有、但内容不同的 → 上传新内容(或冲突让你选)

相关推荐
silvamux_几秒前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
bkspiderx36 分钟前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言41 分钟前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN1 小时前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php
蒸蒸yyyyzwd1 小时前
kafka、redis、mysql不熟悉问题总结
笔记·八股
hgy89691 小时前
深度学习(小白笔记)——迁徙
人工智能·笔记·深度学习
摇滚侠1 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
1001101_QIA1 小时前
.exe does not seem to be a Qt executable.
开发语言·qt
小蒋观天下1 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习