缓存中间件-redis的lua脚本都有哪些及其执行过程
程序员文章站
2022-04-05 18:58:12
...
世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
redis主要的lua脚本命令有:
1. eval: 执行脚本(前面已经介绍过,先封装成f_sha,然后执行)
1> 封装函数f_sha
2> 将脚本加入到lua_scripts_dict中
3> 设置超时钩子
4> 执行脚本
5> 移除超时钩子
6> 返回结果
2. evalsha:根据sha校验和执行脚本
3. script load:加载脚本(eval的前两步)
4. script exists:根据sha判断脚本是否存在
5. script flush:清除原有脚本并创建新的字典(lua_scripts_dict)
6. script kill(shutdown nosave):结束脚本进程
如果前面没有写操作,则直接script kill
如果前面有写操作,为了消除写操作的影响,执行shutdown nosave
lua脚本执行过程如图:
对于集群中的主从复制,其他的脚本只要主服务器将脚本命令同步到从服务器即可,但是evalsha命令,有些特殊,如果对master没有同步到或还没同步到的从服务器执行evalsha命令,可能会出现不存在的情况,因为对应的f_sha脚本函数还没有同步到从服务器上,
对此设置了一个repl_scriptcache_dict通过sha来记录是否已将该sha对应的函数同步到了所有的从服务器上,如果全部从服务器都同步了,会将对应的sha存储到repl_scriptcache_dict,否则不会存进去,所以可以根据这个来判断lua脚本的同步情况,并且对于没有同步的从服务器,如果找不到sha,则会执行eval命令来代替evalsha,保证命令的顺利执行。
更多消息,关注公众号:
上一篇: 深入理解MVP概念送上demo
下一篇: Python Task10 类与对象