在Lua脚本里只调用一条SORT命令(不写任何循环),对200万元素排序,验证脚本阻塞主线程的根源是脚本调用的Redis命令本身的时间复杂度,不是Lua代码写得多不多。
本系列前面验证过纯CPU循环会阻塞主线程,这次换成脚本里调用一条O(N)级别的命令。
代码先建一个200万元素的list(biglist),元素是随机整数字符串 script = "return redis.call('SORT', KEYS[1])" 线程A: eval(script, 1, "biglist") 主线程: 0.05秒后,从另一连接发PING
脚本里只有一行redis.call,没有任何Lua层面的循环。
结果SORT-via-Lua total time: 2.328796863555908 elements: 2000000
验证:对200万元素做一次的SORT,本身就是一个O(NlogN)级别的排序操作,哪怕这条命令是Redis用C语言高效实现的,200万这个的数据规模下,耗时依然到了2.3秒这个量级——这跟"脚本是用Lua写的所以慢"完全没关系,脚本里唯一做的事就是调用这一条命令。
机制跟本系列讲Lua阻塞主线程那篇的纯计算循环完全一样。
结果concurrent PING wait time: 1.0841500759124756 ping ok: True
每一步都是本文上面用200万元素的SORT跑出来的原始结果。
SORT 通过 EVAL 调用:验证脚本内部调用O(N)命令对并发请求的阻塞效果