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

Redis怎样实现Redis 7.0 Functions的平滑迁移_从EVAL到Function

胖涛同学_2152

胖涛同学_2152

发布时间:2026-05-21 12:55:00

|

872人浏览过

|

来源于php中文网

原创

Redis 7.0 Functions 替换 EVAL 失败主因是版本不达标、模块未加载或跨库/跨节点未同步;需确认≥7.0.0、MODULE LIST含redis_function、按库加载并预热调用。

redis怎样实现redis 7.0 functions的平滑迁移_从eval到function

Redis 7.0 Functions 替换 EVAL 时,脚本加载失败报 ERR Unknown command 'FUNCTION'

说明:这个错误不是脚本写错了,而是 Redis 实例压根不支持 Functions 功能——它只在 7.0+ 启用,且默认开启,但你连的可能是旧版本服务,或者用了未启用模块的 Docker 镜像(比如某些 alpine 版本没编译 redis_function 模块)。

实操建议:

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

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

下载
  • 先确认版本:redis-cli INFO server | grep redis_version,必须 ≥ 7.0.0
  • 检查模块是否加载:redis-cli MODULE LIST | grep function,应看到 name:redis_function
  • Docker 用户注意:redis:7-alpine 有些小版本缺失 Functions 支持,换用 redis:7.2 或 redis:7.2-bookworm 更稳
  • 云数据库(如阿里云、腾讯云)需确认控制台是否已升级到 7.0+ 并开启「函数功能」开关,部分厂商默认关闭

把老 EVAL 脚本改写成 FUNCTION LOAD 时,Lua 环境差异导致运行异常

说明:Functions 不再共享全局 Lua 状态,redis.call() 行为一致,但 redis.pcall() 错误结构变了;更重要的是,Functions 默认禁用 redis.log() 和 math.random(),且不能用 KEYS/ARGV 全局表——参数全靠显式传入。

实操建议:

  • 别直接复制 EVAL "return redis.call('GET', KEYS[1])" 1 foo 过去;改用:FUNCTION LOAD lua "redis.register_function('get_key', function(keys, args) return redis.call('GET', keys[1]) end)"
  • keys 和 args 是 table,不是数组索引从 1 开始的“伪数组”,但 Lua 里仍用 keys[1] 取第一个 key——这点和 EVAL 一样,容易误以为要改下标
  • 若原脚本依赖 math.random(),得换成 math.randomseed(redis.sha1hex(ARGV[1] or '')) 再调用,否则报 attempt to call a nil value
  • 调试时加 redis.log(redis.LOG_WARNING, 'debug: '..cjson.encode(keys)),但上线前删掉——Functions 的日志默认不输出到 slowlog,也不进 MONITOR

迁移后发现 FUNCTION LIST 返回空,或新函数调用报 ERR Unknown function

说明:Functions 是按库(database)隔离的,不是全局注册。你在 db 0 FUNCTION LOAD,却在 db 1 FCALL,就会找不到;另外,FUNCTION FLUSH 默认只清当前库,不是全实例。

实操建议:

  • 所有 FCALL 前,先 SELECT 到对应 db,或明确指定 db 连接(如 redis-py 的 redis.Redis(db=1))
  • 批量迁移时,用 FUNCTION LIST WITHCODE 导出函数定义,再用 FUNCTION LOAD 逐库重载,别指望一次加载全库通用
  • 集群模式下,Functions 必须在每个 shard 上单独 FUNCTION LOAD,官方不自动同步——漏掉某个节点,就会出现「有时能调、有时报错」的诡异现象
  • CI/CD 中不要用 FUNCTION FLUSH 清环境,改用 FUNCTION DELETE <name> 精确移除,避免误删其他服务部署的函数

性能对比:为什么 FCALL 比 EVAL 慢了 10%?

说明:Functions 引入了额外的沙箱校验、签名验证和上下文隔离,冷启动确实略慢;但真正影响大的是「首次调用」——后续 JIT 缓存生效后,差距基本消失。如果你压测看到持续慢,大概率是没预热或用了太小的 lua-time-limit。

实操建议:

  • 上线前做一次预热:FCALL myfunc 1 keyname 跑几遍,让 LuaJIT 编译缓存就位
  • 检查配置:lua-time-limit 默认 5000ms,Functions 对超时更敏感,若脚本含循环或大 key 扫描,可临时调高,但别关(0)——关了会失去中断保护
  • 避免在 Functions 里做网络请求、文件读写、或调用阻塞命令(如 BLPOP),这些在 Functions 中被禁止,会直接报错,不是变慢
  • 如果函数逻辑简单(比如只是 GET + INCR),EVAL 仍有轻微优势;但逻辑一复杂(分支多、嵌套深),Functions 的可维护性和 debug 能力远胜 EVAL,这时性能差异可以接受
事情说清了就结束。最常卡住人的不是语法转换,而是跨库、跨节点、跨版本这三个“跨”字——它们不会报明显错误,只会让你在某个时间点、某台机器、某个分片上突然失联。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Loomy
Loomy Hot

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

蛙蛙写作

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

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

DeepSeek

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

相关专题

更多
function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3120

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

514

2023.10.07

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

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

4529

2023.11.02

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

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

4095

2023.11.14

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

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

7592

2024.04.02

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

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

643

2024.04.07

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

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

756

2024.04.07

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

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

7522

2024.04.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

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