数量控制器

2020-10-07  本文已影响0人  AD刘涛

假设我们目前在做一个抽奖活动,我们使用redis进行计数:

流程图.png

以下是我们的代码实现:

function v1() {
    $amountLimit = 100;
    $keyName = getKeyName('v1');
    $redis = getRedisClient();
    $incrAmount = 1;
    if (!$redis->exists($keyName)) {
        $redis->set($keyName, 95);
    }
    $currAmount = $redis->get($keyName);
    if ($currentAmount + $incrAmount > $amountLimit) {
        printf("Bad luck");
        return;
    }
    printf("Good luck");
 }

并发场景: 客户端A,B同时访问数量控制器,会存在什么问题?

如何解决并发问题

流程图.png
function v2() {
    $amountLimit = 100;
    $keyName = getKeyName('v1');
    $redis = getRedisClient();
    $incrAmount = 1;
    if (!$redis->exists($keyName)) {
        $redis->setnx($keyName, 95);
    }
    $currAmount = $redis->get($keyName);
    if ($redis->incrby($keyName, $incrAmount) > $amountLimit) {
        printf("Bad luck");
        return;
    }
    printf("Good luck");
 }

链接1
链接2

上一篇 下一篇

猜你喜欢

热点阅读