Redis的数据类型String使用场景实战
String模型的使用场景
常见面试题:redis在你们项目是怎么使用的?String类型说一个,还有其他用处没?
知识回顾
// 获取redis的key为 WATCH_KEEPER_PREFIX + "wka" 的值String wka = redisTemplate.opsForValue().get(redisOperationUtils.WATCH_KEEPER_PREFIX + "wka");// 设置value的值,一般情况不用设置过期时间redisTemplate.opsForValue().set(redisOperationUtils.WATCH_KEEPER_PREFIX + "wka", "xxx");
使用场景
1,对象存储,key可以是用户的id,value:对象的JSON对象
2,分布式锁,key是锁的唯一值,value是一个脚本,比如lua脚本
3,可以做计数器使用 ,比如在微信朋友圈点赞
incr wxarticle:readcount:{朋友圈内容id}
get wxarticle:readcount:{朋友圈内容id}
代码实战:
1,场景是做一个班级值日表,每天负责擦黑板,从第一个人开始轮有生成,老师可以在系统中调动值日人员的顺序。
2,因为班级人数是有限,可以放到一个数组里面,写一个定时任务自动生成下一个月值日计划,并在入库前记录当前待添加数据库最后一条值班人姓名
3,上代码
依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
注入实现:
@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic void automaticGenerationWatchBill(LocalDate startDate, LocalDate endDate) {List<WatchBillEntity> entityList = new ArrayList<>();// 1、获取redis上次最后一天 班级值班人员,如果为空从头开始String lastStudent = redisTemplate.opsForValue().get(redisOperationUtils.WATCH_BILL + "student");// 名字为空 默认从头开始String knownName = Optional.ofNullable(lastStudent).orElse("xxx");// 如果结束时间 > 开始时间就一直执行LocalDate currentDate = startDate;Date currentTime = new Date();while (!currentDate.isAfter(endDate)) {// 组装值班学生数据..// 日期加1currentDate = currentDate.plusDays(1);entityList.add(entity);}// 批量插入if (!CollectionUtils.isEmpty(entityList)) {watchBillMapper.batchInsertWatchBill(entityList);// 设置最后一天 值班同学名字redisTemplate.opsForValue().set(redisOperationUtils.WATCH_BILL + "student", entityList.get(entityList.size() - 1).getWathchStudent());}}
遇到的问题:
1,如果问题,value对象如果开始不存在话,需要给一个初始值,
喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中