Redis实现秒杀的方法介绍(附代码)


当前第2页 返回上一页

8701366-aac79db31b955b90.png有 30 个商品 ID,数据正常。

秒杀

接下来是关键的一步,使用的是 Redis 的 lpop 命令获取商品 ID,利用的是 Redis 的原子性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

     * 秒杀

     */

    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 次

8701366-535cc667294c012c.png

执行完成,速度并不快,并且还有 794 个访问失败。来看下数据是否正确吧。在页面中打印 buy_success

8701366-2d63e7468a8ca601.png

30 个成功者。再来看下秒杀失败的数量

8701366-497a62375905a8bf.png不是一个准确的数字,2165+30 是所有请求成功的数字,再加上失败的 794 ,总数是 2989,依然不足 3000。

结语

上述测试有不足的地方,相应速度慢、请求失败、失败计数不准确。看来有很多要优化的地方,不止是代码层。测试的时候忘记将访问记录入库关掉,应该是有些影响。
好的方面是秒杀成功的数量是准确的,没有超卖。【相关推荐:Redis教程】

以上就是Redis实现秒杀的方法介绍(附代码)的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

解决Redis存入数据出现乱码的问题

centos7.6安装mysql和Redis的教程

介绍Redis在windows上启动等常用操作

Redis密码管理介绍

Redis之django-Redis使用

cmd怎么启动Redis

lnmp环境下升级phpRedisRedis-server版本的方法

麦子学院深入浅出 Redis 视频资料分享

window 下Redis的安装步骤

Redis中设置lru算法的方法

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...