首頁  >  問答  >  主體

redis - 如何维护 key-value 缓存

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

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

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

高洛峰高洛峰2762 天前804

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-04-21 10:58:32

    建議如此處理:

    1. 問題總數快取

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

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

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

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-21 10:58:32

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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-21 10:58:32

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

    回覆
    0
  • 取消回覆