docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker环境下Redis Lua脚本部署与执行

Docker环境下Redis Lua脚本部署与执行方式

作者:无籽西瓜a

这篇文章主要介绍了Docker环境下Redis Lua脚本部署与执行方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

先提前说个核心结论:Redis的Lua脚本不需要编译、不需要安装,核心就是“让Redis能找到脚本文件”,再用简单的命令执行就行。

Docker部署Redis Lua,优先用「目录挂载」,测试用「直接复制文件」

一、Redis Lua脚本执行的本质

很多人会误以为Lua脚本需要像部署应用一样,安装依赖、启动服务——其实完全不用!

Redis本身就内置了Lua解释器,只要Redis能读取到Lua脚本文件,或者你直接把脚本内容传给Redis,它就能直接执行。咱们在Docker里要做的,本质就是「让Redis容器能访问到Lua脚本」,剩下的就是Redis的原生命令操作。

另外补充两个关键知识点:

二、生产环境首选:目录挂载(最规范,方便维护)

这种方式是生产环境最推荐的,核心逻辑是「把宿主机的一个文件夹,挂载到Redis容器里」,这样我们在宿主机修改、新增Lua脚本,容器里就能实时同步,不用每次都复制文件,后期维护特别方便。

步骤1:启动Redis容器,挂载目录

先停止并删除旧的Redis容器(如果有的话),然后执行以下命令,启动一个新的Redis容器,并挂载宿主机目录:

# 先创建宿主机存放Lua脚本的目录(自定义路径,我这里用/home/redis/lua)
mkdir -p /home/redis/lua
chmod 777 /home/redis/lua  # 给权限,避免容器访问不到

# 启动Redis容器,挂载目录
docker run -d \
  --name wzxgRedis  # 容器名字,自定义
  -p 6379:6379    # 端口映射,宿主机6379对应容器6379
  -v /home/redis/lua:/lua  # 挂载:宿主机路径:/容器内路径
  redis:latest redis-server  # 启动Redis服务

注:

-v /home/redis/lua:/lua 这一句,就是把宿主机的/home/redis/lua文件夹,和容器里的/lua文件夹关联起来,相当于“共享文件夹”,宿主机放脚本,容器里就能直接看到。

步骤2:在宿主机编写Lua脚本

在宿主机的挂载目录里写脚本,容器里会自动同步,不用再手动复制。比如写一个简单的“自增计数”脚本。

# 进入宿主机的Lua脚本目录
cd /home/redis/lua

# 创建并编辑脚本(也可以用记事本编辑后上传)
vim wzxg.lua

脚本内容

-- KEYS[1]:传入的第一个key(后续执行时指定)
-- redis.call():调用Redis原生命令
local key = KEYS[1]
-- 对key进行自增,返回自增后的值
local count = redis.call("INCR", key)
return count

保存退出vim(按ESC,输入:wq,回车即可)。这时候,容器里的/lua目录下,wzxg.lua脚本,因为我们挂载了目录。

步骤3:进入容器,执行Lua脚本

脚本准备好了,接下来进入Redis容器,用Redis命令执行脚本,两种方式任选,优先推荐方式2(性能更高)。

# 进入Redis容器的redis-cli客户端
docker exec -it wzxgRedis redis-cli

方式1:直接加载文件执行(测试用,简单)

直接读取容器内的脚本文件,一次性执行,适合测试脚本是否能正常运行:

EVAL "$(cat /lua/wzxg.lua)" 1 mycounter

拆解一下这个命令:

执行后,会返回1(第一次自增),再执行一次返回2,说明脚本执行成功!

方式2:缓存脚本,用SHA值调用(生产推荐)

如果脚本需要频繁执行,每次都传脚本内容会浪费带宽,这时候可以把脚本缓存到Redis里,Redis会返回一个唯一的SHA值,后续直接用SHA值调用即可,性能更高。

# 1. 缓存脚本,返回SHA值
SCRIPT LOAD "$(cat /lua/wzxg.lua)"

SHA 值是 Redis 对 Lua 脚本内容进行哈希计算后,生成的一串唯一字符串(比如 54cfc1234567890abcdef...),相当于这个脚本的 “专属标识”—— 只要脚本内容不变,SHA 值就不变;脚本一改,SHA 值就会变。

# 2. 用SHA值执行脚本,参数和EVAL一样
EVALSHA 54cfc1234567890abcdef 1 mycounter

效果和方式1一样,但后续每次执行,只需要传SHA值,不用再传整个脚本,适合生产环境频繁调用的场景。

三、测试用简易方案:直接复制脚本进容器

如果只是临时测试脚本,不想挂载目录,也可以直接把宿主机的脚本复制进Redis容器,步骤更简单,适合快速测试。

# 1. 宿主机创建脚本(比如还是wzxg.lua,路径随意,比如~/wzxg.lua)
# 2. 复制脚本到Redis容器的/lua目录(没有这个目录会自动创建)
docker cp ~/wzxg.lua wzxgRedis:/lua/wzxg.lua

# 3. 进入redis-cli执行(和上面步骤3一样)
docker exec -it wzxgRedis redis-cli
EVAL "$(cat /lua/wzxg.lua)" 1 mycounter

注意:这种方式,宿主机修改脚本后,不会同步到容器里,需要重新执行docker cp命令复制,所以只适合测试,不适合生产环境。

四、踩过的坑

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文