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

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 的工作模式

    • 用 Redis:实现计数器

    • 用 Redis 计数器实现并发场景下的数量控制

    查看全部
  • 数量控制器 v2

    http://img4.mukewang.com/629d6d700001c70405420758.jpg

    查看全部
  • 数量控制器 v1

    http://img1.mukewang.com/629d6b980001decb06820978.jpg

    并发场景:客户端 A、B 同时访问数量控制器


    问题 1:

    A 先执行 incrby,然后 B 执行 set,数据不一致


    问题 2:

    假定限量 100,A、B 同时读到当前数量为 99,A、B 执行完 incrby 后,总量为 101,超限了

    查看全部
  • Redis 数量控制器

    • 商品抢购。没控制住?库存不够了,成本失控

    • 抽奖限量。没控制住?钱多花了

    • 抢红包。

    查看全部
    0 采集 收起 来源:redis数量控制器-V1、V2版

    笔记审核中笔记正在审核中,仅自己可见 2022-06-06

  • Redis 计数器

    • 频率控制:接口防刷,密码尝试次数限制。

    • 数量统计:请求量统计。

    • 数量控制:商品抢购,奖励额度控制。

    查看全部
  • Redis 常用数据类型

    • STRING 字符串。整数型字符串

    • HASH 哈希。PHP 关联数组,Python 字典

    • LIST 列表。Python 元组

    • SET 集合。集合中的元素唯一

    • ZSET 有序集合。元素有分值,用于排序

    • Redis 的数据类型如此丰富,如果仅仅当作缓存来用,确实是“杀鸡焉用牛刀”。Memcache 更合适。

    查看全部
  • Redis 优缺点

    • 优点:无需处理并发问题,降低系统复杂度

    • 缺点:不适合缓存大尺寸对象(超过 100KB)(为什么?)

    查看全部
  • Redis 的工作模式

    • 单进程 单进程 单进程(重要的事情说三遍!!!)

    • 阻塞式

    Redis 在同一时刻只能处理一个请求,后来的请求需要排队等待!

    查看全部
  • Redis 与 Memcache 对比

    • Memcache 是内存对象缓存系统,设计目标为通过缓解数据库的压力来加快 web 应用的响应速度

    • Redis 应用场景更丰富,Memcache 仅适合作为缓存使用

    查看全部
  • Redis 是什么

    • 缓存

    • 数据库

    • 消息代理

    查看全部
  • 课程介绍

    • 认识 Redis 的本质:设计目标,应用场景

    • 理解 Redis 的工作模式

    • 认识 Redis 计数器

    • 如何用 Redis 计数器实现并发场景下的数量控制

    查看全部
  • 并发场景下数量控制

    查看全部
  • v1

    function v1() {

     $amountLimit = 100;

      // ...

    }

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

举报

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

微信扫码,参与3人拼团

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

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