Redis怎样利用Lua脚本批量抓取多类型数据
MGET 只支持字符串类型对 hash、list、zset 等结构返回 nil 或 WRONGTYPE 错误读 hash 用 HMGETlist 用 LRANGEzset 用 ZRANGEBYSCORE类型不兼容需用 Lua 脚本做 TYPE 判断分支调用。为什么不能直接用 MGET 抓多类型数据因为 MGET 只能取字符串类型的值遇到 hash、list、zset 这类结构它返回 nil 或报错 WRONGTYPE Operation against a key holding the wrong kind of value。你不是数据没存对是命令用错了类型。MGET 本质是批量 GET只认 string想读 hash 里的多个字段得用 HMGET读 list 某段用 LRANGE读 zset 分数区间得用 ZRANGEBYSCORE不同结构的命令不兼容没法靠一个命令统一处理用 Lua 脚本做“类型路由”的实际写法Lua 脚本在 Redis 里是原子执行的且能调用所有服务端命令适合做类型判断 分支读取。关键不是“写多酷的脚本”而是怎么让逻辑清晰、不踩类型误判的坑。先用 TYPE 查键类型再分支比如 if type hash then return redis.call(HMGET, KEYS[1], unpack(ARGV))别用 redis.call(GET, ...) 硬试——一旦键是 list脚本直接报错中断参数设计要明确KEYS[1] 是目标键名ARGV 放字段名或索引范围如 field1, field2 或 0, -1示例片段if redis.call(TYPE, KEYS[1]) hash then return redis.call(HMGET, KEYS[1], unpack(ARGV))elseif redis.call(TYPE, KEYS[1]) string then return {redis.call(GET, KEYS[1])}else return {}end批量读多个键多种类型时的性能和边界问题一次 Lua 调用里处理太多键或太深的嵌套结构比如遍历大 zset 再逐个 ZSCORE容易触发 Redis 的慢日志或超时。这不是 Lua 多慢是阻塞主线程的代价被放大了。 There’s An AI For That 全球领先的 AI 聚合器收集10,225个AI工具可用于超过2,548个任务。