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

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

相关推荐

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

    2024-03-30 10:38:02       38 阅读
  2. Redis数据类型String使用场景实战

    2024-03-30 10:38:02       38 阅读
  3. Redis 数据类型使用场景

    2024-03-30 10:38:02       38 阅读
  4. Redis(1)】Redis数据类型使用场景

    2024-03-30 10:38:02       37 阅读
  5. Redis 常用数据类型,各自使用场景是什么?

    2024-03-30 10:38:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 10:38:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 10:38:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 10:38:02       87 阅读
  4. Python语言-面向对象

    2024-03-30 10:38:02       96 阅读

热门阅读

  1. 如何使用 RabbitMQ 进行消息的发送和接收

    2024-03-30 10:38:02       46 阅读
  2. 查验身份证

    2024-03-30 10:38:02       41 阅读
  3. 如何使用 WebView 将 React Native 嵌入到原生应用中

    2024-03-30 10:38:02       40 阅读
  4. HTTPS

    HTTPS

    2024-03-30 10:38:02      44 阅读
  5. 当构造器参数较多时考虑用生成器

    2024-03-30 10:38:02       40 阅读
  6. 复习拓扑排序

    2024-03-30 10:38:02       44 阅读
  7. Redis 过期删除策略

    2024-03-30 10:38:02       37 阅读
  8. Springmvc文件下载例子

    2024-03-30 10:38:02       46 阅读
  9. C#多线程编程详细教学

    2024-03-30 10:38:02       40 阅读
  10. c++中缓冲器的使用案例

    2024-03-30 10:38:02       46 阅读
  11. [超细] npm 版本号规范升级流程

    2024-03-30 10:38:02       46 阅读