LocMem、数据库、文件、Redis 四种缓存后端到底差在哪?多进程下能共享吗?重启后还在吗?这篇在本机把它们并排跑一遍,包括真实的 gunicorn 双 worker 场景。
后端 set(µs) get 命中(µs) get 未命中(µs) locmem 3.1 2.6 2.7 db 349.6 26.2 25.1 file 399.6 7.7 7.1 redis 99.4 90.2 89.6
只是一次调用的延迟。Redis 的价值不在单次快,而在「多进程共享、可以独立扩容、支持过期与内存上限」。
locmem set 由 pid 39940 执行;20 次读取来自 2 个 worker,读到该值 11/20 次 db set 由 pid 39956 执行;20 次读取来自 2 个 worker,读到该值 20/20 次 file set 由 pid 40059 执行;20 次读取来自 2 个 worker,读到该值 20/20 次 redis set 由 pid 40068 执行;20 次读取来自 2 个 worker,读到该值 20/20 次
这是 LocMem 最大的坑:开发时单进程一切正常,上线用 gunicorn 多 worker 后缓存表现「不稳定」。缓存失效只发生在当前 worker,别的 worker 继续返回旧值。
locmem 重启后 get = None (丢失) db 重启后 get = 40104 (保留) file 重启后 get = 40131 (保留) redis 重启后 get = 40144 (保留)
持久性只对「缓存后端本身」有意义:Django 进程重启,共享后端里的缓存仍在。
写入 500 个 key 后还在的: 300 (MAX_ENTRIES 默认 300,超过后淘汰约 1/3) 最早写入的 k0 还在吗: None 最新的 k499: 499
可以用 OPTIONS: {MAX_ENTRIES: ..., CULL_FREQUENCY: ...} 调整(本文没有测调整后的结果)。