redis秒杀场景解决方案


本文摘自PHP中文网,作者尚,侵删。

在大流量程序开发中,必然会遇到高并发的应用的场景。解决方案大致分为两个方向,消息队列、锁.

redis 实现消息队列核心简单版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

$key = 'quque';

/**

 * 秒杀商品数量有限,预先存储到消息队列

 */

public function qnquque() {

    for($i = 1 ; $i<=5 ;$i++) {

        $redis->lpush($key,$i);

    }

}

 

/**

 * 这里省略掉业务逻辑处理,默认业务逻辑处理完,出队列

 */

public function dequque() {

    $redis->rpop($key);

    /**

     *  这里开始商品购买后的业务逻辑处理

     */

}

消息队列是防止超买超卖很好的一种解决方案,要实现消息队列的高级功能需要用到专业的消息队列工具例如(rabbitmq).用户Redis 用户redis实现消息队列还是有一些缺点的,可以自行查找文章补充。这边不一一概述。最大问题还是分布式集群的问题。

Redis 乐观锁实现秒杀功能

它的优点如下:

消息队列对内存消耗较大,10000个请求,需要操作10000 出队列。容易造成内存资源瞬间爆棚

使用乐观锁的逻辑,CPU相对来说消耗较低、内存资源占用少

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

$redis = new redis();

$result = $redis->connect('127.0.0.1', 6379);

$cachekey = $redis->get("cachekey");

$number = 100;   //抢购数量

if($cachekey<$number){

    $redis->watch("cachekey");

    $redis->multi();

     

    //设置延迟,方便测试效果。

    sleep(5);

    //插入抢购数据

    $redis->hSet("cachekeyList","user_id_".mt_rand(1, 9999),time());

    $redis->set("cachekey",$cachekey+1);

    $result = $redis->exec();

    if($result){

        $cachekeyList = $redis->hGetAll("cachekeyList");

        echo "恭喜".$cachekeyList."抢购成功!<br/>";

    }else{

        echo "再接再厉";

        exit;

    }

}

更多redis知识请关注redis入门教程栏目。

以上就是redis秒杀场景解决方案的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

Redis的事务及乐观锁的应用

php+Redis实现加锁与解锁操作

怎么查看Redis集群信息

Redis性能测试与客户端连接详解

Redis什么时候出的

增加Redis命令的方法

Redis怎么存session

详细了解Redis中的事务

Redis分布式怎么做

Redis集群需要设置哨兵吗

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


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

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

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

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

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

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

评论

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