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

差集:

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

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

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

相关推荐
loopne5 小时前
AI网文写作实验笔记(十三):系列总结——12 篇实验、8 条核心结论,把“AI 写小说“每一步拆开验证
人工智能·经验分享·笔记·ai写作·智能写作
青少儿编程课堂6 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
l1t6 小时前
DeepSeek总结的DuckDB 如何更快地运行递归 CTE
java·开发语言·数据库·mysql·duckdb
HAPPY酷6 小时前
python的对象和方法
开发语言·python
evans在进步6 小时前
LeetCode 438 找到字符串中所有字母异位词:滑动窗口与排序解法详解
算法·leetcode·职场和发展
赵民勇6 小时前
C++无锁编程详解
c++
橙露6 小时前
移动端客户端原生开发语言
开发语言
M78佐菲6 小时前
Linux多线程:创建、回收与互斥同步
linux·笔记·学习·算法
醉颜凉6 小时前
C++ 中野指针与悬挂指针的区别:从成因到防范,彻底讲清两种危险指针
c++
Demon--hx6 小时前
设计不能被继承的类
开发语言·c++