我们有一个梦幻足球应用程序,它使用 memcached 和经典的 memcached-object-read-with-sql-server-fallback。这工作得很好,但最近我一直在考虑所涉及的开销以及这是否是最好的方法。
举个例子——我们需要生成一个用户团队的下拉列表,所以我们遵循这个模式:
- 从 memcached 获取用户团队列表
- 如果不可用,则从 SQL 服务器获取列表并存储在 memcached 中。
- 执行 multiget 以获取团队对象。
- 回退到从 sql 加载对象存储这些。
这一切都很好 - 每条缓存的数据都相对容易缓存和失效,但这有两个主要缺点:
1) 因为我们正在对对象进行操作,所以会产生相当大的开销——单个团队在 memcached 中占用数百字节,而我们真正需要的是团队名称和 id 列表——而不是所有其他的东西团队对象。
2) 由于加载单个对象的回退,在空缓存上或项目过期时生成的 SQL 查询的数量可能很大:1 x Memcached multiget(未命中,哪个和原因)1 x SELECT ... FROM Team WHERE Id IN (...) 20 x Store in memcached 所以这是 21 个网络请求仅针对这个查询,而且 IN 查询比特定连接慢。
显然我们可以做一个简单的
SELECT Id, Name FROM Teams WHERE UserId = XYZ
并缓存该结果,但这意味着每当用户创建新团队时,都需要专门使这些数据无效。在这种情况下,它可能看起来相对简单,但我们有许多此类查询,其中许多操作在不容易失效的轴上(例如您的朋友在特定游戏)。
Sooo ..我的问题是 - 你们中的任何人有解决上述缺点的想法吗,还是我应该接受存在开销并且缓存未命中是不好的,忍受它?