(Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九

前言



如题,该篇实践教程就是简单的抛砖引玉,通过实现一个简单的排队场景,带着大家熟悉下 redis里list数据结构的相关操作。



正文



在开始编码前,我们先简单了解下该篇实践教程实现 排队场景,


包括哪些功能:


1. 正常排队


2.队伍总人数


3.队伍信息


4.某人离开队伍


5.正常排队完离开队伍


6.某人在队伍的所在位置,前面人数,后面人数


7.插队 (道德不允许,咱们只是做个例子)



开始编码:



ps :怎么整合redis这篇文章就不介绍了,如果还不会的可以看我的这个系列的教程。



为了方便咱们的演示,直接通过写接口调接口的方式。


创建一个MyTestController.java,注入一下RedisTemplate:


/**
 * @Author : JCccc
 * @CreateTime : 2020/3/27
 * @Description :
 **/
@Controller
@RequestMapping("/test")
public class MyTestController {
    @Autowired
    private RedisTemplate redisTemplate;
}


1. 正常排队


    /**
     * 加入队伍
     * @param userId
     */
    @ResponseBody
    @GetMapping("/addQueue")
    public void addQueue(@RequestParam("userId") String userId) {
      //  redisTemplate.opsForList().leftPush("myQueue",userId);
        redisTemplate.opsForList().rightPush("yourQueue",userId);
    }


可以看到这个接口里面,我的代码有一行注释的,其实两行低吗都是往队伍里面去添加数据达到 排队加入队伍的功能。


而通过数据顺序来说,我选择使用rightPush,这样更能容易理解排队的原则,先进先出。

 

那么我们开始调用接口 /addQueue ,看看效果:


image.png


可以看到redis里面的数据,01 妥妥地加入到了队伍:


 image.png


重复上面的操作,模拟出一个小队列数据,将02,03,04,05 也按顺序排队加入到队伍里,结果如:


image.png


2.队伍总人数


    /**
     * 队伍总人数
     */
    @ResponseBody
    @GetMapping("/queueCount")
    public String queueCount() {
        Long listSize = redisTemplate.opsForList().size("yourQueue");
       return "队伍总人数:"+listSize;
    }


调用接口,查看队伍总人数:


image.png


3.队伍信息


    /**
     * 队伍详情
     */
    @ResponseBody
    @GetMapping("/queueData")
    public String queueData() {
        List listData = redisTemplate.opsForList().range("yourQueue", 0, -1);
        return listData.toString();
    }


调用接口,查看队伍详情:


image.png


4.某人离开队伍


    /**
     * 离开队伍
     * @param userId
     */
    @ResponseBody
    @GetMapping("/leaveQueue")
    public void leaveQueue(@RequestParam("userId") String userId) {
        Long removeNum = redisTemplate.opsForList().remove("yourQueue", 0, userId);
        System.out.println(removeNum);
    }


这个接口里面使用的方法,第二个参数,需要注意:


对于list数据其实是允许重复的,但是我们模拟的队列数据,给用户分配的userId保持唯一。


但是原有的remove方法使兼容了重复数据移除的场景,


当传入 0: 移除整个队列里的 目标值 ,也就是录入传入userId是01,


那么有一个也移除,有N个也移除,反正保证干干净净。


当传入小于0的数,如-1或者传入大于0的数,如1: 就是不同顺序去检查这个队伍,直到碰到第一个目标值,进行删除。



调用接口,模拟 03 这个用户离开队伍:


image.png


结果:


image.png


5.正常排队完离开队伍


    /**
     * 默认离队,先进先出
     */
    @ResponseBody
    @GetMapping("/defaultLeaveQueue")
    public void defaultLeaveQueue() {
        redisTemplate.opsForList().leftPop("yourQueue");
    }


当前队伍里面01排在最前面,所以当调用接口时,默认排完队离开的就是01,先进先出:


image.png


结果:


image.png


6.某人在队伍的所在位置, 前面人数,后面人数


    /**
     * 查看我自己的队列位置
     * @param userId
     */
    @ResponseBody
    @GetMapping("/getMyPosition")
    public void getMyPosition(@RequestParam("userId") String userId){
        List listData = redisTemplate.opsForList().range("yourQueue", 0, -1);
        int myPositionBeforeNum = listData.indexOf(userId);
        int myPositionNum = listData.indexOf(userId)+1;
        int size=listData.size();
        System.out.println("所在位置前面人数:"+myPositionBeforeNum);
        System.out.println("所在位置:"+myPositionNum);
        System.out.println("所在位置后面人数:"+(size-myPositionNum));
    }


调用接口,查看04所在队伍的位置,以及他前面还有多少人,后面还有多少人:


image.png

结果:

image.pngimage.png


7.插队  


ps:有时候业务需要插队场景还是有需要的


    /**
     * 野蛮插队
     * @param userId
     * @param toUserId
     */
    @ResponseBody
    @GetMapping("/savageAction")
    public void savageAction(@RequestParam("userId") String userId ,@RequestParam("toUserId") String toUserId,@RequestParam("type") String type){
            //userId 插队人
            //toUserId 被插队人
            //before 插前面
            //after 插后面
           if ("before".equals(type)){
               redisTemplate.opsForList().leftPush("yourQueue",toUserId,userId);
             }
           if ("after".equals(type)){
               redisTemplate.opsForList().rightPush("yourQueue",toUserId,userId);
           }
    }


插队有分插前面和后面,调用接口,模拟一个新用户 2020 插队,插入到了04这个用户前面:


image.png


结果:


image.png


再调用接口,模拟一个新用户 3003 插队,插入到了2020这个用户后面:


image.png


结果:


image.png


该篇就到此。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
1
0
34
分享
相关文章
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
166 0
Redis设计与实现——数据结构与对象
Redis 是一个高性能的键值存储系统,其数据结构设计精妙且高效。主要包括以下几种核心数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表。此外,Redis 对象通过类型和编码方式动态转换,优化内存使用,并支持引用计数、共享对象和淘汰策略(如 LRU/LFU)。这些特性共同确保 Redis 在性能与灵活性之间的平衡。
Redis原理—1.Redis数据结构
本文介绍了Redis 的主要数据结构及应用。
Redis原理—1.Redis数据结构
|
7月前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
235 36
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
137 2
|
9月前
|
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
155 5
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
627 0
传统maven项目和现在spring boot项目的区别
创建springboot项目的基本流程——以宠物类别为例
创建springboot项目的基本流程——以宠物类别为例
205 0
创建springboot项目的基本流程——以宠物类别为例
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问