为了账号安全,请及时绑定邮箱和手机立即绑定

redis计数器与数量控制

慕来 全栈工程师
难度入门
时长47分
学习人数
综合评分9.67
30人评价 查看评价
9.8 内容实用
9.4 简洁易懂
9.8 逻辑清晰
  • import redis.clients.jedis.Jedis;
    /**
     * 2018/11/6 11:57
     */
    public class CountThread extends Thread {
    
        public static void main(String args[]) {
            MyThread thread1 = new MyThread();
            thread1.setName("线程1");
            MyThread thread2 = new MyThread();
            thread2.setName("线程2");
            Jedis jedis = new Jedis("localhost", 6379);
            jedis.del("myCounter");//每次初始删除key
            jedis.close();
            thread1.start();
            thread2.start();
            //可以多设立几个线程,方便查看异常结果
        }
    }
    
    class MyThread extends Thread {
        final int amountLimit = 100;//总库存量
        String keyName = "myCounter";//redis key Name
    
        @Override
        public void run() {
            //每个线程执行7次
            for (int i = 0; i < 7; i++) {
                v1();
            }
        }
    
        //计数器v1
        public void v1() {
            Jedis jedis = new Jedis("localhost", 6379);
            int incrAmount = 1;//每次incr大小
    
            if (!jedis.exists(keyName)) {
                jedis.set(keyName, String.valueOf(95));
            }
    
            int currentAmount = Integer.parseInt(jedis.get(keyName));
            if (currentAmount + incrAmount > amountLimit) {
                System.out.println(Thread.currentThread() + "Bad luck!v1");
            } else {
                jedis.incrBy(keyName, incrAmount);
                System.out.println(Thread.currentThread() + "Good Luck!v1");
            }
            jedis.close();
        }
    
        //计数器v2
        public void v2() {
            Jedis jedis = new Jedis("localhost", 6379);
            int incrAmount = 1;
            if (!jedis.exists(keyName)) {
                jedis.setnx(keyName, String.valueOf(95));
            }
    
            if (jedis.incrBy(keyName, incrAmount) > amountLimit) {
                jedis.decrBy(keyName, incrAmount);//超额回滚
                System.out.println(Thread.currentThread() + "Bad luck!v2");
            } else {
                System.out.println(Thread.currentThread() + "Good Luck!v2");
            }
            jedis.close();
        }
    }

    有什么问题欢迎讨论

    查看全部
  • set 设置值 exists 判断key是否存在 get 获取值 incr 增加/减少值 incrby 增加/减少指定数值 setnx 不存在才能设置key
    查看全部
  • redis 数量控制并发优化

    查看全部
  • redis 数量控制并发问题

    查看全部
  • v1

    function v1() {

     $amountLimit = 100;

      // ...

    }

    查看全部
  • PHP function

    查看全部
  • Linux Redis PHP Nginx

    查看全部
  • setnx = set not exists

    先计算,后判断


    查看全部
  • 并发请求,导致数据不一致问题

    set 可能会出现覆盖

    先判断,后计算,计算错误


    查看全部
  • 流程图 抽奖


    微信抢红包,金额随机分配逻辑

    查看全部
  • 数量控制

    商品抢购

    抽奖

    抢红包

    查看全部
  • 超时时间 30s

    ```sh

    127.0.0.1:6379> expire test2 30

    (integer) 1

    127.0.0.1:6379> ttl test2

    (integer) 23

    127.0.0.1:6379> ttl test2

    (integer) 21

    127.0.0.1:6379> ttl test2

    (integer) 17

    127.0.0.1:6379> ttl test2

    (integer) 14

    127.0.0.1:6379> ttl test2

    (integer) 12

    127.0.0.1:6379> ttl test2

    (integer) 8

    127.0.0.1:6379> ttl test2

    (integer) 6

    127.0.0.1:6379> ttl test2

    (integer) 3

    127.0.0.1:6379> ttl test2

    (integer) -2

    127.0.0.1:6379> ttl test2

    (integer) -2

    127.0.0.1:6379> exists test2

    (integer) 0

    127.0.0.1:6379> 


    ```

    查看全部
  • setnx 判断是否存在,不存在才会set,防止错误的覆盖


    ```sh

    127.0.0.1:6379> get test

    "6"

    127.0.0.1:6379> setnx test 2020

    (integer) 0

    127.0.0.1:6379> setnx test2 2020

    (integer) 1

    127.0.0.1:6379> get test

    "6"

    127.0.0.1:6379> get test2

    "2020"

    127.0.0.1:6379> 

    127.0.0.1:6379> set test2 77

    OK

    127.0.0.1:6379> get test2

    "77"

    ```

    查看全部
  • ```sh

    ➜  ~ redis-cli

    127.0.0.1:6379> exists test

    (integer) 0

    127.0.0.1:6379> set test 3

    OK

    127.0.0.1:6379> get test

    "3"

    127.0.0.1:6379> incr test

    (integer) 4

    127.0.0.1:6379> get test

    "4"

    (integer) 3

    127.0.0.1:6379> incrby test 3

    (integer) 7

    127.0.0.1:6379> get test

    "7"

    127.0.0.1:6379> incrby test -1

    (integer) 6

    127.0.0.1:6379> get test

    "6"

    127.0.0.1:6379> 

    ```

    查看全部
  • redis 应用场景 

    频率限制, 计数器 key ip value time

    数量控制 

    数量统计

    查看全部
首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
1、熟悉一门编程语言 2、对redis有兴趣的人群
老师告诉你能学到什么?
1、redis的设计目的,应用场景,工作模式及优缺点; 2、redis计数器应用于数量控制; 3、redis并发处理。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!