Redis的数据类型List使用场景实战

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,逻辑思考业务实现,

  1. 可以理解为2个数组,进行排序,周六周日的时间不安排人员,其中一个固定数组有序,另一个无序
  2. 如果需要调整值班信息,要有个新增或修改功能
  3. 修改数据只能修改当前时间以后的数据,之前的数据不能修改
    要有个数组或者队列保存值班过的人员信息
  4. 实现第三条逻辑有,可以保存一张表,单独保存数据每次都要修改,删除,可以借助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 {

 	@Autowired
    private RedisTemplate<String, String> redisTemplateList;


    @Override
    public 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,是所有的同学都是要求做一休三,业务要做判断

喜欢我的文章的话,麻烦点个阅读或者点个点赞,是我编写博客的动力

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值