我想知道redis中lua脚本、原子减decr、普通的get再set请求这三者的执行效率对比,lua脚本慢的话慢多少百分比。java中测试很明显发现瓶颈在网络,百度了一番找到了这个redis自带的redis-benchmark工具。
直接执行以下命令就能得到当前的redis服务每秒能处理的各种类型请求数
redis-benchmark -q -n 100000
PING_INLINE: 23110.70 requests per second, p50=1.047 msec
PING_MBULK: 22722.11 requests per second, p50=1.071 msec
SET: 20898.64 requests per second, p50=1.071 msec
GET: 22094.56 requests per second, p50=1.095 msec
INCR: 22177.87 requests per second, p50=1.103 msec
LPUSH: 20379.05 requests per second, p50=1.095 msec
RPUSH: 23573.79 requests per second, p50=1.031 msec
LPOP: 22675.74 requests per second, p50=1.047 msec
RPOP: 23078.70 requests per second, p50=1.047 msec
SADD: 23781.21 requests per second, p50=1.023 msec
HSET: 24485.80 requests per second, p50=0.999 msec
SPOP: 24260.07 requests per second, p50=1.007 msec
ZADD: 24479.80 requests per second, p50=0.999 msec
ZPOPMIN: 21682.57 requests per second, p50=1.063 msec
LPUSH (needed to benchmark LRANGE): 22614.20 requests per second, p50=1.063msec
LRANGE_100 (first 100 elements): 17921.15 requests per second, p50=1.311 msec
LRANGE_300 (first 300 elements): 11346.87 requests per second, p50=2.231 msec
LRANGE_500 (first 500 elements): 8975.05 requests per second, p50=2.951 msec
LRANGE_600 (first 600 elements): 7865.35 requests per second, p50=3.431 msec
MSET (10 keys): 22099.45 requests per second, p50=1.095 msec
这里看到INCR原子加操作可以说跟set、get的执行效率几乎一样的,都是每秒能处理20000个请求。
然后到了lua脚本,这里官方文档写得莫名其妙,百度到的文章也只会复读机官方文档。
上面官方文档给的这个命令根本不会执行脚本,效果就是加载了10万次脚本。
去github上面查了下立马查到了正确的测试lua脚本效率操作方式。
[BUG] redis-benchmark lua script not working · Issue #12565 · redis/redis · GitHub
测试lua脚本效率操作为:
步骤一、先加载脚本,拿到返回的SHA码
redis-cli script load "local currentValue = tonumber(redis.call('GET', 'testLua')); if currentValue ~= nil and currentValue >= 0 then redis.call('DECR', 'testLua'); return 1; else return 0; end"
会返回一串什么sha码
f46e914e4ddd9513e6308b964af4f87b4cc0f262
步骤二、接着就可以开始性能测试了
redis-benchmark -q -n 100000 EVALSHA f46e914e4ddd9513e6308b964af4f87b4cc0f262 0
执行结果
EVALSHA f46e914e4ddd9513e6308b964af4f87b4cc0f262 0: 22094.56 requests per second, p50=1.103 msec
啊这,lua脚本里包含了2个操作你同样能每秒处理22000次啊?结果好奇怪,但是测试结束我的key确实有按照脚本的预期被减了10万。