公司做了一个答题小程序,现在正在优化阶段,看一下还有什么地方可以修改一下,然后就看到了排行榜功能,之前的排行榜就是单纯的数据库多表联查,考虑到数据量大了以后这样查询非常影响msql性能,于是替换为redis实现:
Set<ZSetOperations.TypedTuple> sortByCategoryIdList = new HashSet<>();
这是用来装返回的数据的,
重点是TypedTuple对象
创建时指定用户K(用户对象,可指定任何类型)和V(分数,Double),redis通过这个score对数据进行排序.
需要注意的地方是: 通过redis取数据的时候当结果为null时他会创建对象
因此返回的集合长度为0时有两种情况
1.有数据但是从redis中没有读取到
2.本身就没有匹配的数据
例如redis被人执行了清空操作,此时数据库中是有数据的,但是此时从redis中是拿不到的,所以当返回结果长度为0时,需要从数据库在查询一次,如果返回结果依然为0,则代表本身没有匹配数据,返回暂无上榜即可.反之则将数据库查出来的数据返回,同时更新redis将数据同步.
关于定时任务:
排行榜固定5分钟刷新一次,定时任务直接使用springboot自带的即可, @Scheduled(fixedRate = 1000x60x5)
fixRate代表执行的间隔时间
Application启动类上需要添加@EnableScheduling 开启定时任务功能