本篇文章给人人带来的内容是关于Redis完成秒杀的要领引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。
导语:秒杀想必人人都相识,在短时间内要求接见会激增,同时要保证不会超卖和数据的准确,关于手艺方面照样有些磨练的。惋惜的是,一向没有机会在项目中完成。再看了一些材料后,盘算试验下。以下代码仅为测试所用,环境比较简单,请依据现实情况举行修正。
建立秒杀行列
在最先秒杀之前,先将商品放入行列中,以下
/** * 建立秒杀列表 */ public function createList() { $count = 30; $redisKey = 'goods_list'; for ($i = 1; $i <= $count; $i++) { // 测试用,防备数据毛病 if (Redis::llen($redisKey) >= $count) { break; } Redis::rpush($redisKey, $i); } }
实行完后,在 Redis 中看下
秒杀
接下来是症结的一步,运用的是 Redis 的 lpop
敕令猎取商品 ID,运用的是 Redis 的原子性。
/** * 秒杀 */ public function buy() { // 随机用户名,无意义,仅做标记 $username = Hash::make(now()); if ($goodsId = Redis::lpop('goods_list')) { // 购置胜利 Redis::hset('buy_success', $goodsId, $username); } else { // 购置失利 Redis::incr('buy_fail'); } }
如上,简化了代码,购置以后,胜利与否只是做纪录。现实运用中,当然会越发庞杂,但要注重的是,不要同步操作 Mysql。多说一句,Hash:make(now())
纵然值雷同,也不会生成雷同的数据,参考这里。
测试
末了就是举行测试了,运用 ab 测试,实行 ab -c 300 -n 3000 http://localhost/buy/
,上述敕令的意义是 300 并发,共要求 3000 次
实行完成,速率并不快,而且另有 794 个接见失利。来看下数据是不是准确吧。在页面中打印 buy_success
值
30 个胜利者。再来看下秒杀失利的数目
不是一个准确的数字,2165+30 是一切要求胜利的数字,再加上失利的 794 ,总数是 2989,依旧不足 3000。
结语
上述测试有不足的处所,响应速率慢、要求失利、失利计数不准确。看来有许多要优化的处所,不止是代码层。测试的时刻遗忘将接见纪录入库关掉,应该是有些影响。
好的方面是秒杀胜利的数目是准确的,没有超卖。【相干引荐:Redis教程】
以上就是Redis完成秒杀的要领引见(附代码)的细致内容,更多请关注ki4网别的相干文章!