天天看點

利用redis緩存熱門資料,分頁的一種思路

一般分頁做緩存都是直接查找出來,按頁放到緩存裡,但是這種緩存方式有很多缺點。

如緩存不能及時更新,一旦資料有變化,所有的之前的分頁緩存都失效了。

比如像微網誌這樣的場景,微網誌下面現在有一個頂次數的排序。這個用傳統的分頁方式很難應對。

最近想到了另一種思路。

資料以id為key緩存到redis裡;

把資料id和排序打分存到redis的skip list,即zset裡;

當查找資料時,先從redis裡的skip list取出對應的分頁資料,得到id清單。

用multi get從redis上一次性把id清單裡的所有資料都取出來。如果有缺少某些id的資料,再從資料庫裡查找,再一塊傳回給使用者,并把查出來的資料按id緩存到redis裡。

在最後一步,可以有一些小技巧:

比如在缺少一些id資料的情況下,先直接傳回給使用者,然後前端再用ajax請求缺少的id的資料,再動态重新整理。

還有一些可能用lua腳本合并操作的優化,不過考慮到lua腳本比較慢,可能要仔細測試。

如果是利用lua腳本的話,可以在一個請求裡完成下面的操作:

查找某頁的所有文章,傳回已緩存的文章的id及内容,還有不在緩存裡的文章的id清單。

lua是支援lru模式的,即像memcached一樣工作。但是貌似沒有見到有人這樣用,很是奇怪。

可能是用redis早就準備好把redis做存儲了,也不擔心記憶體的容量問題。

繼續閱讀