閱讀650 返回首頁    go 阿裏雲 go 技術社區[雲棲]


利用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做存儲了,也不擔心內存的容量問題。

最後更新:2017-04-03 12:56:20

  上一篇:go Apache HttpClient ????????????time out????????????????????????????????????-??????-????????????-?????????
  下一篇:go Subqueries are not allowed in this context. Only scalar expressions are allowed.