我们使用 Yii 框架和 Memcached 进行缓存。
我们有以下问题:
- 我们进行数据库查询 q
- 如果 q 已经被缓存,我们从 memcache 中获取数据
- 否则yii查询Mysql
- 设置缓存值
- 我们从 memcache 中取回结果
如果我们在设置 memcache 键之前(在步骤 4 之前)再次请求相同的查询 q,那么因为没有设置 memcache 键,我们再次查询 db。
我们想将此行为更改为:
- 我们进行数据库查询 q
- 如果 q 的键存在于内存缓存中并且值不为空,则返回值
- 否则,如果设置了 key 并且 value 为 null 设置 memcache key => null
- 设置缓存值
- 我们从 memcache 中取回结果
这是发生了什么以及我们想要什么的伪代码:
get(q):
if q not in memcache:
value = query_db(q)
memcache[q] = value
return memcache[q]
else:
return memcache[q]
getNew(q):
if q not in memcache:
memcache[q] = null
value = query_db(q)
memcache[q] = value
return memcache[q]
elif q in memcache and memcache[q] != null:
return memcache[q]
else:
while True:
if memcached[q] != null:
return memcached[q]
else:
sleep(3)
换句话说,我们希望在结果为 null 之前设置 memcache 键,并且相同查询的其他请求检查该值是否为 null 并等到该值不为 null (这意味着查询已经在处理)。
你知道yii frameworkd的哪一部分应该修改吗?