如何维护 key-value 缓存

陈繁
  • 18

做web,经常会用到key-value的缓存,虽然快,但缓存的维护是个问题,就拿sgementfault举例来说,如果我来做,首页的问题分页就涉及到
1.问题总数缓存
2.每页问题清单缓存

现在管理员删除了一个问题,那么为满足实时性,肯定需要更新缓存
1.问题总数缓存-1
2.每页问题清单缓存如何更新?
当然可以查数据库算出来,是否有这个必要?

这只是个例子,为了说明问题,为了更新一个缓存而造成了另外的数据库查询开销。在实际过程中,我经常用查询条件的组合作为key,这使得我在更新缓存时无从下手(虽然我自己手工维护了一个缓存key的清单,但难免会有遗漏,终归不是好办法)。但如果把缓存的key都定义死,则缓存的使用不是那么灵活。

回复
阅读 6.4k
3 个回答

建议如此处理:

1. 问题总数缓存

$memcached->increment('sum', $sum);

参考:http://www.php.net/manual/zh/memcache...

2.每页问题清单缓存如何更新?

没有细想,如果是我的话可能会用一个end_id作为结束戳,然后有新的问题过来就向前递增,每100+汇总一次刷新,主要还是看量,脱离了量的情况下不好判断(开始小的情况下就直接刷db三分钟一次也没问题)

1. 问题总数缓存的用@jawa 提供的 memcache incr/decr 就挺好的
2. 每页问题清单,这个,可以不维护列表而只缓存问题内容,列表本身从数据库查就好。也的确是如@jawa 所说,看量。细节上可以有很多解决方案,有非常粗粒度的方法,比如前面说的列表本身直接从数据库查;也有非常细的方法,比如新浪微博的内容转发、评论次数都是二次获取,解耦了内容的变化(较少)和计数的变化(频繁)

使用缓存主要目的是为了减轻数据库的压力,过于频繁的更新缓存是不太合理的。
一、放弃实时性,当数据到达某个定义的阀值时更新缓存。
二、使用搜索引擎如sphinx的实时增量索引。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏