回覆列表
  • 1 # 未來可期_487

    普通分頁

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

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

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

    一種思路

    最近想到了另一種思路。

    資料以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做儲存了,也不擔心記憶體的容量問題。

  • 中秋節和大豐收的關聯?
  • 閱讀能提高自己的素質,應該閱讀哪些方面的書呢?