我目前正在开发一个针对阅读进行优化的系统。该架构是一个 MySQL 作为权威的持久存储,以及 MySQL db 和客户端之间的 memcache 层。写入不时发生,但比读取频率低得多。
数据库在相对较弱的主机上运行,因此我有动力尽量减少对数据库的访问。目前我心目中的协议是这样的:
[DB 和 memcache 条目都与乐观锁定的版本控制序列相关联]
- 在启动时,一个专用进程将所有当前条目从 db 加载到 memcache。
- 当发生写入时,它将:
- 一个。从 memcache 加载条目版本(memcache 版本)。
- 湾。在 db 事务中,尝试更新 db if (db entry version < loaded memcache version + 1),成功后 db entry version 将更新为 (memcache version + 1)。
- C。如果 b 成功,继续使用新条目和 version = (memcache version + 1) 更新 memcache
- 同时,专用进程会定期从 db 中加载所有数据并将它们放入 memcache,以防某些写入不会传播到 memcache。可能会导致 2 出现一些竞争条件,但我估计这是可以接受的。
我当前的假设是,对于任何时候的条目,(memcache 版本)<=(db 版本),因此来自 2 的多个并发写入不会导致竞争条件。
有人能从这个设计中发现任何问题吗?谢谢!