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键过期设置

Redis用在什么地方

centos将Redis配置为系统服务的方法

Redis事务及相关命令介绍

使用Redis实现一个安全可靠的分布式锁

详细介绍消息队列的概念、原理及使用场景(附案例)

Redis密码管理介绍

Redis集群和分布式区别

分析Redis原理及实现

Redis的key可以是中文吗

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


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

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

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

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

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

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

评论

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