|
@@ -29,7 +29,9 @@ public class RankTask {
|
|
|
// 参数是cron表达式 是使用一个字符串来描述要定期执行的任务
|
|
|
// https://cron.ciding.cc/ cron表达式生成器
|
|
|
// 生成一个每5s执行一次的 0/5 * * * * ? * 要将最后一个*去掉
|
|
|
+ // 生成一个每1min执行一次的 0 0/1 * * * ?
|
|
|
// 生成一个每天凌晨执行的 0 0 0 1/1 * ?
|
|
|
+// @Scheduled(cron = "0 0/1 * * * ?")
|
|
|
@Scheduled(cron = "0 0 0 1/1 * ?")
|
|
|
public void updateRank() {
|
|
|
System.out.println("updateRank " + LocalDateTime.now());
|
|
@@ -37,46 +39,48 @@ public class RankTask {
|
|
|
String key = RedisKeyConst.VISIT_ZSET;
|
|
|
redisTemplate.delete(key);
|
|
|
|
|
|
+ String key2 = RedisKeyConst.NEW_ZSET;
|
|
|
+ redisTemplate.delete(key2);
|
|
|
+
|
|
|
+ String key3 = RedisKeyConst.UPDATE_ZSET;
|
|
|
+ redisTemplate.delete(key3);
|
|
|
+
|
|
|
+ // 合并三个榜单的初始化
|
|
|
List<BookInfo> bookInfos = bookInfoMapper.selectList(null);
|
|
|
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
|
|
|
+ Random random = new Random();
|
|
|
for (BookInfo bookInfo : bookInfos) {
|
|
|
+ // 点击量榜单中value的分数
|
|
|
Long visitCount = bookInfo.getVisitCount();
|
|
|
- String bookInfoJson = gson.toJson(bookInfo);
|
|
|
- zSetOperations.add(key, bookInfoJson, visitCount);
|
|
|
- }
|
|
|
|
|
|
- // 更新新书榜
|
|
|
- String key2 = RedisKeyConst.NEW_ZSET;
|
|
|
- redisTemplate.delete(key2);
|
|
|
- for (BookInfo bookInfo : bookInfos) {
|
|
|
+ // 新书榜榜单中value的分数
|
|
|
LocalDateTime createTime = bookInfo.getCreateTime();
|
|
|
long epochMilli;
|
|
|
if (createTime != null) {
|
|
|
+ // 获取一个实例 通过时区ZoneOffset +8东八区 转化为毫秒级
|
|
|
epochMilli = createTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
} else {
|
|
|
+ // 如果数据为空 使用当前时间 再随机一个参数
|
|
|
epochMilli = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
- Random random = new Random();
|
|
|
epochMilli += random.nextInt(100);
|
|
|
}
|
|
|
- String json = gson.toJson(bookInfo);
|
|
|
- zSetOperations.add(key2, json, epochMilli);
|
|
|
- }
|
|
|
|
|
|
- // 更新 书籍更新榜
|
|
|
- String key3 = RedisKeyConst.UPDATE_ZSET;
|
|
|
- redisTemplate.delete(key3);
|
|
|
- for (BookInfo bookInfo : bookInfos) {
|
|
|
+ // 更新榜榜单中value的分数
|
|
|
LocalDateTime updateTime = bookInfo.getUpdateTime();
|
|
|
- long epochMilli;
|
|
|
+ long epochMilliUpdate;
|
|
|
if (updateTime != null) {
|
|
|
- epochMilli = updateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
+ epochMilliUpdate = updateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
} else {
|
|
|
- epochMilli = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
- Random random = new Random();
|
|
|
- epochMilli += random.nextInt(100);
|
|
|
+ epochMilliUpdate = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
+ epochMilliUpdate += random.nextInt(100);
|
|
|
}
|
|
|
- String json = gson.toJson(bookInfo);
|
|
|
- zSetOperations.add(key3, json, epochMilli);
|
|
|
+
|
|
|
+ // 通用的value
|
|
|
+ String bookInfoJson = gson.toJson(bookInfo);
|
|
|
+
|
|
|
+ zSetOperations.add(key, bookInfoJson, visitCount);
|
|
|
+ zSetOperations.add(key2, bookInfoJson, epochMilli);
|
|
|
+ zSetOperations.add(key3, bookInfoJson, epochMilliUpdate);
|
|
|
}
|
|
|
|
|
|
}
|