redis - 如何维护 key-value 缓存
高洛峰
高洛峰 2017-04-21 10:56:32
0
3
768

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(3)
Peter_Zhu

建議如此處理:

1. 問題總數快取

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

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

2.每頁問題清單快取如何更新?

沒有細想,如果是我的話可能會用一個end_id作為結束戳,然後有新的問題過來就向前遞增,每100+匯總一次刷新,主要還是看量,脫離了量的情況下不好判斷(開始小的情況下就直接刷db三分鐘一次也沒問題)

洪涛

1. 問題總數快取的用@jawa 提供的 memcache incr/decr 就挺好的
2. 每頁問題清單,這個,可以不維護清單而只快取問題內容,清單本身從資料庫查就好。也的確是如@jawa 所說,看量。細節上可以有很多解決方案,有非常粗粒度的方法,比如前面說的列表本身直接從數據庫查;也有非常細的方法,比如新浪微博的內容轉發、評論次數都是二次獲取,解耦了內容的變化(較少)和計數的變化(頻繁)

Peter_Zhu

使用快取主要目的是為了減輕資料庫的壓力,過於頻繁的更新快取是不太合理的。
一、放棄即時性,當資料到達某個定義的閥值時更新快取。
二、使用搜尋引擎如sphinx的即時增量索引。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!