使用Redis的List實(shí)現(xiàn)緩存分頁(yè)信息
一、Redis List 分頁(yè)的核心價(jià)值
Redis List 是基于雙向鏈表實(shí)現(xiàn)的有序集合(按插入順序排序),借助 lrange 命令可快速實(shí)現(xiàn)分頁(yè)查詢,相比傳統(tǒng)數(shù)據(jù)庫(kù)(如 MySQL)的 limit offset 分頁(yè),Redis List 分頁(yè)在熱點(diǎn)數(shù)據(jù)、小范圍分頁(yè)場(chǎng)景下性能更穩(wěn)定,且純內(nèi)存操作響應(yīng)耗時(shí)極低,常被用于緩存“最新文章列表、評(píng)論列表、消息列表”等按時(shí)間排序的分頁(yè)場(chǎng)景。
二、核心 API 與分頁(yè)實(shí)現(xiàn)邏輯
1. 核心分頁(yè)命令:LRANGE(只讀,不修改原數(shù)據(jù))
(1)命令格式
LRANGE key start stop
key:List 類型的鍵名;start:起始索引(從 0 開始,負(fù)數(shù)表示倒數(shù),如-1代表最后一個(gè)元素);stop:結(jié)束索引(包含該索引,-1可表示查詢所有元素)。
(2)核心特性
LRANGE 是只讀操作,僅返回指定范圍的元素,不會(huì)移除 List 中的元素(區(qū)別于 LPOP/RPOP 等刪除類命令)。
2. 分頁(yè)實(shí)現(xiàn)公式(通用)
假設(shè)分頁(yè)參數(shù)為:
pageNum:當(dāng)前頁(yè)碼(從 1 開始);pageSize:每頁(yè)展示條數(shù);
則分頁(yè)的索引計(jì)算規(guī)則:
start = (pageNum - 1) * pageSize stop = pageNum * pageSize - 1
3. 完整實(shí)戰(zhàn)示例
(1)初始化測(cè)試數(shù)據(jù)
向 article:list(文章 ID 列表)插入 10 條數(shù)據(jù)(按發(fā)布時(shí)間從新到舊排序):
# 從右側(cè)插入(保證新數(shù)據(jù)在列表頭部/尾部,根據(jù)業(yè)務(wù)調(diào)整) RPUSH article:list 101 102 103 104 105 106 107 108 109 110
(2)分頁(yè)查詢操作
第 1 頁(yè)(每頁(yè) 5 條):
LRANGE article:list 0 4 # 返回 [101, 102, 103, 104, 105]

第 2 頁(yè)(每頁(yè) 5 條):
LRANGE article:list 5 9 # 返回 [106, 107, 108, 109, 110]

查詢所有數(shù)據(jù)(兜底場(chǎng)景):
LRANGE article:list 0 -1 # 返回全部 10 條數(shù)據(jù)

三、List 分頁(yè)相關(guān)輔助 API
| 命令 | 作用 | 示例 |
|---|---|---|
RPUSH/LPUSH | 向 List 尾部/頭部插入數(shù)據(jù)(初始化分頁(yè)數(shù)據(jù)) | RPUSH article:list 111 112 |
LLEN | 獲取 List 總長(zhǎng)度(計(jì)算總頁(yè)數(shù)) | LLEN article:list → 返回 10 |
LPOP/RPOP | 移除并返回頭部/尾部元素(清理過期數(shù)據(jù)) | LPOP article:list → 返回 101 |
LTRIM | 修剪 List,僅保留指定范圍元素(分頁(yè)后清理) | LTRIM article:list 0 99 |
實(shí)戰(zhàn):結(jié)合 LLEN 計(jì)算總頁(yè)數(shù)
# 1. 獲取總條數(shù) LLEN article:list → 10 # 2. 計(jì)算總頁(yè)數(shù)(每頁(yè) 5 條) 總頁(yè)數(shù) = CEIL(總條數(shù) / pageSize) → CEIL(10/5) = 2
四、Redis List 分頁(yè)的優(yōu)勢(shì)與局限
1. 優(yōu)勢(shì)
- 性能穩(wěn)定:純內(nèi)存操作,小范圍分頁(yè)(前幾頁(yè))耗時(shí)微秒級(jí),遠(yuǎn)快于 MySQL 大 offset 分頁(yè);
- 實(shí)現(xiàn)簡(jiǎn)單:僅需
LRANGE命令,無需復(fù)雜語(yǔ)法,開發(fā)成本低; - 有序性保障:List 按插入順序排序,天然適配“最新優(yōu)先”類分頁(yè)場(chǎng)景(如消息、評(píng)論)。
2. 局限
- 索引訪問性能:List 底層是雙向鏈表,
LRANGE按索引訪問為 O(n) 復(fù)雜度,分頁(yè) offset 過大(如查詢第 1000 頁(yè))時(shí)性能下降; - 排序能力弱:僅支持插入順序(某端插入時(shí)候的順序,取決于用法),無法按自定義字段(如時(shí)間、熱度)排序;
- 數(shù)據(jù)量限制:不適用于超大規(guī)模 List(百萬(wàn)級(jí)以上),易導(dǎo)致內(nèi)存占用過高。
五、最佳實(shí)踐
1. 適用場(chǎng)景
- 熱點(diǎn)分頁(yè):僅需查詢前 N 頁(yè)(如前 10 頁(yè))的場(chǎng)景(如首頁(yè)文章列表);
- 有序列表:數(shù)據(jù)按插入順序展示,無需自定義排序(如用戶消息流)。
2. 避坑點(diǎn)
- 不要用
LRANGE做超大 offset 分頁(yè):offset 過大時(shí),建議改用 Sorted Set(ZSET)+ 游標(biāo)分頁(yè); - 區(qū)分“查詢”與“刪除”:
LRANGE僅查詢,如需“取數(shù)據(jù)并刪除”,可結(jié)合LRANGE + LTRIM; - 控制 List 長(zhǎng)度:通過
LTRIM定期清理過期數(shù)據(jù),避免 List 無限膨脹(如僅保留最近 1000 條)。
3. 替代方案(補(bǔ)充)
若需按自定義字段排序 / 超大分頁(yè),建議使用 Redis Sorted Set(ZSET),通過 ZRANGE 實(shí)現(xiàn)分頁(yè),兼顧排序與高性能。
六、小結(jié)
Redis List + LRANGE 是實(shí)現(xiàn)“簡(jiǎn)單有序分頁(yè)”的最優(yōu)解,核心優(yōu)勢(shì)是實(shí)現(xiàn)簡(jiǎn)單、性能穩(wěn)定,適合熱點(diǎn)小范圍分頁(yè)場(chǎng)景;使用時(shí)需注意控制 List 長(zhǎng)度、避免超大 offset 分頁(yè),若需更復(fù)雜的排序/分頁(yè)需求,可切換至 ZSET 實(shí)現(xiàn)。
以上就是使用Redis的List實(shí)現(xiàn)緩存分頁(yè)信息的詳細(xì)內(nèi)容,更多關(guān)于Redis List緩存分頁(yè)信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Redis中key的命名規(guī)范和值的命名規(guī)范
這篇文章主要介紹了詳解Redis中key的命名規(guī)范和值的命名規(guī)范,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Redis數(shù)據(jù)庫(kù)存儲(chǔ)鍵值對(duì)的底層原理分析
Redis是一種內(nèi)存數(shù)據(jù)庫(kù),使用哈希表存儲(chǔ)鍵值對(duì),它通過哈希函數(shù)計(jì)算鍵的存儲(chǔ)地址,并通過地址找到數(shù)據(jù),當(dāng)出現(xiàn)哈希沖突時(shí),Redis使用鏈地址法解決,為優(yōu)化性能,Redis采用漸進(jìn)式哈希表遷移技術(shù),逐步將數(shù)據(jù)從舊哈希表遷移到新哈希表,減少對(duì)業(yè)務(wù)的影響2026-03-03

