做web,经常会用到key-value的缓存,虽然快,但缓存的维护是个问题,就拿sgementfault举例来说,如果我来做,首页的问题分页就涉及到
1.问题总数缓存
2.每页问题清单缓存
现在管理员删除了一个问题,那么为满足实时性,肯定需要更新缓存
1.问题总数缓存-1
2.每页问题清单缓存如何更新?
当然可以查数据库算出来,是否有这个必要?
这只是个例子,为了说明问题,为了更新一个缓存而造成了另外的数据库查询开销。在实际过程中,我经常用查询条件的组合作为key,这使得我在更新缓存时无从下手(虽然我自己手工维护了一个缓存key的清单,但难免会有遗漏,终归不是好办法)。但如果把缓存的key都定义死,则缓存的使用不是那么灵活。
天蓬老师2017-04-21 10:58:32
建議如此處理:
1. 問題總數快取
$memcached->increment('sum', $sum);
參考:http://www.php.net/manual/zh/memcache...
2.每頁問題清單快取如何更新?
沒有細想,如果是我的話可能會用一個end_id作為結束戳,然後有新的問題過來就向前遞增,每100+匯總一次刷新,主要還是看量,脫離了量的情況下不好判斷(開始小的情況下就直接刷db三分鐘一次也沒問題)
PHP中文网2017-04-21 10:58:32
1. 問題總數快取的用@jawa 提供的 memcache incr/decr 就挺好的
2. 每頁問題清單,這個,可以不維護清單而只快取問題內容,清單本身從資料庫查就好。也的確是如@jawa 所說,看量。細節上可以有很多解決方案,有非常粗粒度的方法,比如前面說的列表本身直接從數據庫查;也有非常細的方法,比如新浪微博的內容轉發、評論次數都是二次獲取,解耦了內容的變化(較少)和計數的變化(頻繁)
天蓬老师2017-04-21 10:58:32
使用快取主要目的是為了減輕資料庫的壓力,過於頻繁的更新快取是不太合理的。
一、放棄即時性,當資料到達某個定義的閥值時更新快取。
二、使用搜尋引擎如sphinx的即時增量索引。