redis+lua优惠券秒杀demo

目标是实现高并发的优惠券秒杀系统,项目地址:https://github.com/owenliang/redis-lua

redis+lua

主要基于redis内嵌lua来实现库存的幂等性扣减,这块代码如下:

脚本懒惰加载

当执行evalsha发现报错的情况下,则执行一次script load命令上传lua脚本,可以简化脚本上传的工作。

开发与调试脚本

直接基于PHP调用lua很难调试脚本的问题,官方的redis-cli支持单步调试lua脚本,你可以自己学习一下:《Redis Lua scripts debugger》。

我的开发流程是这样的:

编写lua脚本,然后命令行执行脚本:

redis-cli EVAL “$(cat /path/to/your/script.lua)” 1 “mykey” “myargv”

如果发现报错,则进行单步调试:

redis-cli –ldb –eval /path/to/your/script.lua mykey1 mykey2 , myargv1 myargv2

注意逗号之前的是key列表,之后的是argv列表,逗号两边需要留白。

使用起来就像gdb一样,n是下一步,p 变量名查看变量值,restart重新执行脚本,大家自己去挖掘更多吧。

压测脚本

先把脚本上传到redis,得到对应的SHA1值。

redis-cli SCRIPT LOAD “$(cat /path/to/your/script.lua)”

现在,执行压测:

redis-benchmark -r 100000000 -n 1000000 EVALSHA “8c2bdb856cefb05f39dc675c0fde28ef4c7bb0bd” 1 “mykey1” __rand_int__

-r指定了随机数的区间,__rand_int__用于随机数占位。

在这里,我让argv[1]随机生成,请求的次数是-n指定的,并发连接数使用-c(默认50)。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~