java redis 先进先出_荐 (Redis使用系列) Springboot 使用r...

本文介绍如何使用Springboot结合Redis实现一个基于list数据结构的先进先出(FIFO)队列,包括入队、出队、查看队列信息、移除指定成员、查看成员位置等功能。通过具体的接口调用来演示每个操作的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

如题,该篇实践教程就是简单的抛砖引玉,通过实现一个简单的排队场景,带着大家熟悉下 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 ,看看效果:

5935d320395ce6c121309f43529b8ca3.png

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

eadaa0afae2a13f1d675012043086098.png

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

b64f155b68b95ff9528ffe7490eb8739.png

2.队伍总人数

/**

* 队伍总人数

*/

@ResponseBody

@GetMapping("/queueCount")

public String queueCount() {

Long listSize = redisTemplate.opsForList().size("yourQueue");

return "队伍总人数:"+listSize;

}

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

494ee5f1c03c0b9413295ea4c92efed8.png

3.队伍信息

/**

* 队伍详情

*/

@ResponseBody

@GetMapping("/queueData")

public String queueData() {

List listData = redisTemplate.opsForList().range("yourQueue", 0, -1);

return listData.toString();

}

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

42e0f7e875b25d17ba883ae0d7480900.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 这个用户离开队伍:

99fb038b41cf4f9cffd3a45a4a7190fd.png

结果:

534d0e799bbe55a0e389ac1b08ab9338.png

5.正常排队完离开队伍

/**

* 默认离队,先进先出

*/

@ResponseBody

@GetMapping("/defaultLeaveQueue")

public void defaultLeaveQueue() {

redisTemplate.opsForList().leftPop("yourQueue");

}

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

109fbcd96b8af422fc72681c2a7c33f2.png

结果:

5041737c8b7e7db18832d405befbe97a.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所在队伍的位置,以及他前面还有多少人,后面还有多少人:

5e32a5cb58a482ed695e6d20282b7c7e.png

结果:

82c3b354a600cf983792e916f72e771c.png

874445311371dc0d3f0ffcd08225ff81.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这个用户前面:

163c4e65c0d13b69256906ca7bf7c544.png

结果:

d94d634d951cac98f90b34efb4d5541d.png

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

5a935ffa85723d3b83776b0f379e502e.png

结果:

b5f2d4bdb6696f29a4ba6ac24081282e.png

该篇就到此。

本文地址:https://blog.youkuaiyun.com/qq_35387940/article/details/107338720

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值