• 秒杀简单实现


    秒杀的写法:文件锁,mysql锁,redis队列
    流程:1、加锁
    2、判断库存
    3、秒杀处理
    4、解锁
    问题:高并发下,文件锁,mysql 锁都会产生卡锁现象,导致服务器崩溃,而redis队列也会偶发性出现超卖
    解决办法:redis乐观锁,通过监视锁(key),原子执行
    代码如下(简化):
     
    include 'db.php';
     
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('123456');
     
    $redis->watch('sales'); // 监视作用,监视一个或多个key,如果在事务执行之前被其他事件改动,则事务会被打断
     
    // 获取销量
    $sales = $redis->get('sales');
     
    $sku = 5;
     
    // 如果销量大于库存,则活动结束
    if($sales >= $sku)
    {
    exit('活动结束');
    }
     
    $redis->multi(); // 事务,要么成功提交,要么不提交,被其他用户打断,提交失败
     
    $redis->set('sales', $sales+1);
     
    $res = $redis->exec(); // 事务提交
     
    if($res)
    {
    $sql = "update products set sku = sku - 1 where id = 1";
    if($db->exec($sql))
    {
    exit("减库存成功");
    }
    }

  • 相关阅读:
    内存管理工具
    c语言目录操作总结
    重写strstr、strcpy、memcpy、memset、atof算法
    统计编码量工具
    hdu4348
    bzoj4358: permu
    bzoj2658: [Zjoi2012]小蓝的好友(mrx)
    bzoj2657: [Zjoi2012]旅游(journey)
    bzoj3583: 杰杰的女性朋友
    bzoj3673 bzoj3674可持久化并查集
  • 原文地址:https://www.cnblogs.com/bestvish/p/10411027.html
Copyright © 2020-2023  润新知