讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis List数据过长导致内存溢出_使用Redis分片集群与内存淘汰策略

夏杰吖_7142

夏杰吖_7142

发布时间:2026-09-01 10:46:18

|

796人浏览过

|

来源于php中文网

原创

Redis单个List极少直接导致OOM,主因是大量小List堆积或误用作长期存储;应优先通过MEMORY USAGE查内存、LTRIM截断、调优ziplist参数及合理设置淘汰策略来优化。

redis list数据过长导致内存溢出_使用redis分片集群与内存淘汰策略

Redis List过长直接导致OOM?先确认是不是真List撑爆的

Redis内存溢出(OOM)很少由单个List直接引发,更常见的是大量小List堆积、或List被误用作日志/队列且从不清理。Redis本身对单个List长度无硬限制,但每个元素都存字符串对象,总内存 = 元素数量 ×(平均字符串长度 + Redis对象头开销)。若一个List存了500万条1KB消息,仅数据就超5GB,加上指针和编码开销,极易触发maxmemory淘汰或系统OOM。

  • 用DEBUG OBJECT key查List实际内存占用(注意:生产慎用,会阻塞)
  • 用MEMORY USAGE key替代(Redis 4.0+,非阻塞,推荐)
  • 结合INFO memory看used_memory_peak和mem_fragmentation_ratio,判断是缓存膨胀还是内存碎片高

别急着上分片集群——先看List是否真的需要全量保留在Redis里

很多场景下,把日志、事件流、消息队列全塞进List是设计偏差。Redis不是数据库,List也不适合做长期存储。真正该做的,是厘清访问模式:

  • 如果是FIFO队列(如任务分发),用LPUSH+RPOP或BRPOP,消费后自然出队,长度可控
  • 如果是时间窗口聚合(如最近1小时点击),用LPUSH+LTRIM主动截断,例如LPUSH logs "event" ; LTRIM logs 0 9999只留最新1万条
  • 如果是归档类数据(如用户操作历史),应写入MySQL/Elasticsearch,Redis只存最近N条摘要,用LSET或LREM配合定时清理

必须用List存大量数据?那就配对使用内存淘汰策略+合理编码

List在Redis中默认使用ziplist编码(紧凑存储),但当元素数超过list-max-ziplist-entries(默认512)或任一元素长度超过list-max-ziplist-value(默认64字节)时,会转为linkedlist(内存翻倍甚至更多)。所以调参比换集群更立竿见影:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 若元素短且固定(如用户ID、状态码),调大list-max-ziplist-value到256,保持ziplist编码
  • 若元素多但总量可控(如每List≤1万条),调大list-max-ziplist-entries到2048,避免过早转链表
  • 淘汰策略选allkeys-lru或volatile-lru,但注意:List本身不支持TTL,得靠给整个key设过期(EXPIRE),否则淘汰无效

示例配置(redis.conf):
list-max-ziplist-entries 2048
list-max-ziplist-value 256
maxmemory-policy allkeys-lru

分片集群不是银弹——List跨节点操作根本不可行

Redis Cluster按key的CRC16值哈希分片,而List所有操作(LPUSH、LLEN、LRANGE)都要求key落在同一节点。这意味着你无法把一个超长List“拆开”存在多个节点上——它天然就是单点结构。强行分片只会带来两个后果:

  • 业务层自己分片(如logs:shard:0、logs:shard:1),但LLEN、LRANGE等需客户端聚合,逻辑复杂且无法原子执行
  • 改用其他中间件(如Codis)或自研Proxy,但维护成本陡增,且仍绕不开单key内存上限

真正需要集群的,是key数量爆炸(千万级不同key),而不是单个key体积过大。一个存了200万条的List,哪怕放在单节点32GB内存实例上,也比拆成20个集群节点更稳、更快、更易监控。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4269

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3755

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6792

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

623

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

736

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6382

2024.04.07

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1140

2024.04.07

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1016

2024.04.07

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

40

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn