一般分頁做緩存都是直接查找出來,按頁放到緩存裡,但是這種緩存方式有很多缺點。
如緩存不能及時更新,一旦資料有變化,所有的之前的分頁緩存都失效了。
比如像微網誌這樣的場景,微網誌下面現在有一個頂次數的排序。這個用傳統的分頁方式很難應對。
最近想到了另一種思路。
資料以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做存儲了,也不擔心記憶體的容量問題。