redis 的 dump 命令不支持 list 类型,执行会报错;导出大 list 应分批使用 lrange,恢复需用 rpush/lpush 批量写入,而非 restore。

Redis 大 List 导出时 DUMP 命令直接失败?
不是数据太大,是 DUMP 对 List 类型不支持——它只支持字符串(string)、哈希(hash)、集合(set)、有序集合(zset)和流(stream),但明确**不支持 list**。你执行 DUMP mylist 会得到 (error) ERR DUMP can only be used on string, hash, set, zset, stream, or module types。
所以别试了,这条路走不通。想导出 List,得换思路:用 LINDEX + LRANGE 拉数据,或直接用 RDB 快照(但它是全量,不精准)。
如何安全拉取超长 List 的全部元素?
LRANGE key 0 -1 看起来最直接,但对百万级长度的 List,一次返回所有元素极易触发客户端内存溢出、网络超时或 Redis 自身的输出缓冲区限制(client-output-buffer-limit)。实际要分批读,且必须控制单次数量。
- 用
LRANGE key start end分页,每次最多取 1000–5000 个元素(取决于单条数据大小,越小越稳) - 起始位置从 0 开始,每次递增步长(比如 5000),直到
LRANGE返回空数组 - 注意:List 长度可能在遍历中被并发修改,
LLEN只是快照值;更稳妥的做法是持续调用LRANGE直到结果为空 - Python 示例(用 redis-py):
start = 0<br>batch_size = 5000<br>all_items = []<br>while True:<br> batch = r.lrange("mylist", start, start + batch_size - 1)<br> if not batch:<br> break<br> all_items.extend(batch)<br> start += batch_size
RESTORE 能否用来恢复大 List?
不能直接用 RESTORE 恢复 List 数据,因为 RESTORE 要求输入是 DUMP 生成的二进制序列化值,而 List 不支持 DUMP,自然也就没有合法的 dump 值可 restore。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
如果你已有其他方式导出的 List 元素(比如 JSON 数组或逐行文本),恢复只能靠 RPUSH 或 LPUSH 批量写入:
- 用
RPUSH key value1 value2 ... valueN一次推多个,比单条RPUSH快得多 - 单次
RPUSH最多支持 1024 个参数(Redis 7.0+ 默认上限),超出需拆包 - 生产环境务必关闭
MONITOR,禁用慢日志采样(slowlog-log-slower-than 0),避免干扰 - 如果原 List 是“左端入、右端出”的队列模式,恢复时用
LPUSH+REVERSE(或先存临时 key 再BRPOPLPUSH)才能保序
真正适合大 List 的备份方案是什么?
绕开 DUMP/RESTORE,用 Redis 原生命令组合 + 外部存储才是正解。核心逻辑是:读取 → 序列化 → 存文件 → 恢复时反向操作。
- 导出:用
LRANGE分批读,每批转成 JSON 行(JSONL)或 CSV,写入磁盘,文件名带上时间戳和LLEN计数 - 导入:按文件顺序读行,聚合为批量
RPUSH请求,用管道(pipeline)提交,减少 RTT - 关键细节:导出前用
WATCH+MULTI/EXEC锁不住 List(List 无原子锁机制),如需强一致性,得停写或用CLIENT PAUSE(Redis 6.2+)暂停客户端写入几秒 - 不要依赖
SAVE或BGSAVE单独备份某个 List——RDB 是全库快照,恢复成本高,且无法增量
大 List 的“备份”本质是应用层的数据导出任务,Redis 本身没提供轻量级的单 key 导出能力,这点容易误判。动手前先确认:你真需要的是“某个 List 的副本”,还是“整个 Redis 实例某时刻的状态”——前者走命令拉取,后者才该用 RDB/AOF。










