为何Redis计算Lua脚本SHA-1哈希前会去除尾部空白?
Redis SCRIPT LOAD + EVALSHA 持续报 NOSCRIPT 错误的排查与解决
最近优化Redis部署流程时,我踩了个挺头疼的坑:本来想通过独立程序用sha1sum预先算出Lua脚本的SHA-1哈希,之后直接用EVALSHA调用脚本,结果却一直收到NOSCRIPT错误,折腾了好一阵才找到根因。
一开始我怀疑是Redis v3.0.6的问题,测试后发现Redis计算脚本哈希前好像会修改脚本内容——比如移除最后一行的尾部空白?但深入排查才发现,根本不是Redis的锅,是Bash的IFS变量在搞鬼!当用常规方式传递脚本内容时,IFS会悄悄篡改脚本里的换行和空白字符,导致本地算出的SHA-1和Redis实际存储的完全对不上。
靠谱的解决姿势
要避免脚本内容被篡改,必须让Redis拿到和本地文件完全一致的内容,最稳妥的方式是通过标准输入传递脚本:
redis-cli -x SCRIPT LOAD < script.lua
用这个命令上传脚本后,Redis生成的SHA-1哈希就和本地用sha1sum计算的完全匹配了,EVALSHA调用也不会再报错。
内容的提问来源于stack exchange,提问作者Sean Werkema
相关产品推荐
相关产品推荐

