美文网首页
数量控制器

数量控制器

作者: AD刘涛 | 来源:发表于2020-10-07 22:14 被阅读0次

假设我们目前在做一个抽奖活动,我们使用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同时访问数量控制器,会存在什么问题?

  • 问题 1:假定A,B同时读到key不存在,然后由于种种原因,代码运行速度不一致,出现 A 先执行了incrby,进行加1操作,然而 B 此时才进行初始化,执行set 操作, 覆盖之前的数据。这样一来则会出现数据不一致的现象。
  • 问题 2:假定限量100,A,B 同时读到当前数量为99,A ,B先执行incrby后,总量为101,超卖了。

如何解决并发问题

  • 对于问题1,我们使用setnx命令进行解决。当 A 先执行了incrby,进行加1操作,然后 B 在次进行初始化,执行setnx 操作时,该命令只在键 key 不存在的情况下, 将键 key 的值设置为 value 。若键 key 已经存在, 则 setnx 命令不做任何动作。因此不会出现数据不一致的情况。

  • 对于问题2,我们先执行incrby命令,通过返回值进行判断是否超限。因为incrby命令是原子操作,线程安全。并发情况下,串行执行。即不会出现超买的情况。

流程图.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

相关文章

  • 数量控制器

    假设我们目前在做一个抽奖活动,我们使用redis进行计数: 以下是我们的代码实现: 并发场景: 客户端A,B同时访...

  • 任意控制器跳转

    (推荐下面这种,不受控制器数量影响) for (UIViewController *controller in s...

  • 封装头部切换视图

    效果 头部按钮可以点击切换到不同的控制器,也可以手势滑动切换到不同的控制器。控制器的数量可以控制,封装的下划线,颜...

  • k8s 控制器

    什么是控制器? k8s内拥有许多的控制器类型,用来控制pod的状态、行为、副本数量等等,控制器通过pod的标签来控...

  • @RequestMapping笔记

    @RequestMapping 可以创建数量不限的控制器,分别处理不同的业务请求 每个控制器可以有多个处理请求的方...

  • 台达MotionControl个人学习笔记(原创简书)

    MotionControl简称MC控制器,通常用在伺服轴运行数量比较多的时候会采用的专用控制器。 今天特意为大家整...

  • iOS 14 push多个控制器 返回到根控制器 tabbar会

    发现当子控制器的数量大于1时,返回到根控制器 tabbar会消失!!! 解决方法:修改自定义的Navigation...

  • 云计算day09-Kubernetes_K8s

    1. ReplicationController资源 副本控制器 rc:保证指定数量的pod始终存活,rc通过标签...

  • Kubernetes-Deployment详解

    Deployment与控制器模型 Deployment可以帮我们做什么 定义一组Pod期望数量,Controlle...

  • iOS 改变UITabBarController的控制器数量

    代码如下: 重点: 初始化好的子控制器放在childControllerArray可变数组中 添加一个通知,当某个...

网友评论

      本文标题:数量控制器

      本文链接:https://www.haomeiwen.com/subject/qpjqpktx.html