IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 如何使用Redis和RabbitMQ实现一个学生抢课系统(可类比商品秒杀系统) -> 正文阅读

[大数据]如何使用Redis和RabbitMQ实现一个学生抢课系统(可类比商品秒杀系统)

  • 电商项目中的秒杀场景我们都很常见,不只是京东和淘宝现在很多的小程序公众号也有做现时限购的秒杀场景,那么如何做一个秒杀系统呢?

  • 把数据全部放在MySQL数据中,这显然是不现实的,因为在秒杀开始时会有大量的请求涌进来,如果直接访问数据库,我们的MySQL很容易崩点,我们就应该做一层过滤。

如下就是实现一个抢课系统的来类比一个秒杀系统。

我们这里引入Redisson,官介绍如下:

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

详细文档链接

而在我们的这个秒杀程序中主要运用了Redisson中的**信号量(Semaphore)。**

在抢课之前我们先将课程进行一个上架操作,主要就是将课程的最高选课人数作为信号量存入redis中。关键代码如下:

@Autowired
    private CourseMapper courseMapper;
    @Autowired
    private RedissonClient redissonClient;
    
    private final  String COURSE_SEMAPHORE = "subject:course:num:";//

    @Test
    public void contextLoads() {
        log.info("开始上架课程");
        List<Course> sessions = courseMapper.selectOkCourse();
        sessions.stream().forEach(session ->{
            String jsonString = JSON.toJSONString(session);
            //引入分布式的信号量 用信号量控制并发数,限流
            RSemaphore semaphore = redissonClient.getSemaphore(COURSE_SEMAPHORE + session.getId());
            //课程的最大人数作为信号量
            semaphore.trySetPermits(session.getNum());

        });
    }

在学生抢课的过程中,我们会做一下几步操作:

1、校验该学生是否已经讲过该课程

2、校验该课程是否已经达到最大选课人数

3、该学生的选课信息放入倒RabbitMQ中,由其他模块进行异步处理学生选课入库

代码如下:

public String subject(String studentId, String courseId) {
        log.info("抢课任务开始{},{}",studentId,courseId);
        Long ttl = 24*3600L; //过期时间根据具体情况配置,这里为了简便写了两天
        //2.4验证学生是否已经抢过该课(幂等性)
        //setnx不存在的时候才占位
        String redisKey = studentId+"_"+courseId;
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(redisKey, "1".toString(), ttl, TimeUnit.SECONDS);
        if(aBoolean) {
            //成功表示该学生第一次选课
            //3.获取信号量tryAcquire()非阻塞方法
            RSemaphore semaphore = redissonClient.getSemaphore(COURSE_SEMAPHORE + courseId);
	   //获取信号量,同一个课程,同一个学生只能选一次,故这里获取一个信号量,若是商品可根据限购几件来设定     
 boolean b = semaphore.tryAcquire(1);
            if(b){
                //还有信号量,抢课信息入库 MQ登场
                log.info("抢课完成");
                SubjectTo subjectTo = new SubjectTo(studentId,courseId);
                rabbitTemplate.convertAndSend("course-event-exchange","course.seckill.course",subjectTo);
                log.info("发送完成");
                return "1";
            }else {
                //该课程已经被抢完
                log.error("该课程已经被抢完");
                return "3";
            }
        }else{
            //已经选过该课程
            log.error("该过程已经抢过");
            return "2";
        }
    }

监听MQ的入库程序如下:

@RabbitListener(queues = "seckill.course.queue")
    public void handleSecKillOrderCreate(SubjectTo to) {
        try {
            log.info("---------抢课信息准备入库-----------");
            //加入课程学生表中
            courseService.makeItCoures(to);
            //该课程剩余可选人数减少1(主要是为了展示课程剩余人数来使用)
            courseService.changeNowNum(to.getCourseId());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

以上就上学生抢课系统的主要思路,比较简介。其中步骤主要分为如下:

    1、课程上架

    2、学生抢课模块,抢课校验,课程信息放MQ中

   3、监听MQ中的选课信息,进行入库操作。

个人公众号 :hellotqq,坚持原创输出,坚持分享学习感悟,与您共同成长!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:38:09  更:2022-05-25 11:38:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:46:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码