Redis的数据类型List使用场景实战
场景题:面试官问redis的List数据结构在你们项目是怎么用的,你说没有用过,这哪行,说你能想到啥场景不,面试的你不知所措。。。
进入正题:
知识回顾
// 从左边推送数据
redisTemplate.opsForList().leftPush("mylist", "Hello");
// 从右边推送数据
redisTemplate.opsForList().rightPush("mylist", "Redis");
// 获取所有的数据
List<Object> list = redisTemplate.opsForList().range("mylist", 0, -1);
使用场景:
1,Queue(队列使用 ) 队列使用 = LPUSH + RPOP
2,Blocking MQ(阻塞) = LPUSH + BRPOP
项目中的业务场景:
1,场景:学校系统需要做一个值日擦黑板业务,有几点要求如下
一:所有的学生要求做一休三
二:擦黑板的同学,和每天喊起立的同学,都是全班所有的学生
三:擦黑板的同学和喊起立的同学,都要求做一休三,且不能是同一个人执行任务
四:擦黑板的同学值日,三天内不能喊起立任务
2,逻辑思考业务实现,
- 可以理解为2个数组,进行排序,周六周日的时间不安排人员,其中一个固定数组有序,另一个无序
- 如果需要调整值班信息,要有个新增或修改功能
- 修改数据只能修改当前时间以后的数据,之前的数据不能修改
要有个数组或者队列保存值班过的人员信息 - 实现第三条逻辑有,可以保存一张表,单独保存数据每次都要修改,删除,可以借助redis的List数据模型,里面有个队列可以满足情况
采用redis的list数据结构编写代码
开干上代码:
1,添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2,配置类
@Component
public class RedisOperationUtils {/*** 值日信息redis中的key*/public final String WATCH_WILL_PREFIX = "watch:will:exist:";
}
实现类
@Slf4j
@Service("WxxService")
public class WxxxServiceImpl extends ServiceImpl<WxxMapper, WxxxEntity> implements WxxxxxService {@Autowiredprivate RedisTemplate<String, String> redisTemplateList;@Overridepublic void automaticWatchWillRoster(LocalDate startDate, LocalDate endDate) {// 设置数据类型ListOperations<String, String> listOps = redisTemplateList.opsForList();// 待新增的值班人员信息List<WatchWillEntity> entityList = new ArrayList<>();// 如果结束时间 > 开始时间就一直执行LocalDate currentDate = startDate;Date currentTime = new Date();while (!currentDate.isAfter(endDate)) {// 获取所有的值日过的同学集合 为第二个数组做过滤使用List<String> watchkeepersStudentList = listOps.range(redisOperationUtils.WATCH_WILL_PREFIX + "student", 0, -1);//TODO:做一些数据过滤,过滤完后,listOps.leftPush(redisOperationUtils.WATCH_WILL_PREFIX + "student", studentPersonName);// 获取值日的长度如果大于3 需要移除Long size = Optional.ofNullable(listOps.size(redisOperationUtils.WATCH_WILL_PREFIX + "student")).orElse(0L);if ( size > 3) {listOps.rightPop(redisOperationUtils.WATCH_WILL_PREFIX + "student");}}// 批量插入if (!CollectionUtils.isEmpty(entityList)) {// 批量插入}}}
遇到的问题
1,随机性要好,这个去当前同学的索引,取前后3天数据除外
2,有可能再初始化的时候,redis的list队列里面的数据长度为空,不能再移除,要判断长度
3,添加到redis的list的数据时候,一定要非空,不然数据有可能为空,不能做值日任务
4,是所有的同学都是要求做一休三,业务要做判断
喜欢我的文章的话,麻烦点个阅读或者点个点赞,是我编写博客的动力