Browse Source

0724 重构代码

Qing 9 months ago
parent
commit
c57eb2cc5f

+ 2 - 0
novel-demo/src/main/java/com/sf/cons/RedisKeyConst.java

@@ -20,4 +20,6 @@ public class RedisKeyConst {
     // 存储书籍id 和书籍信息的hash
     public final static String BOOK_HASH = "book:bookHash";
     // 验证码和token String
+    public final static String USER_VERIFY_PRE = "book:";
+    public final static String USER_TOKEN_PRE = "book:token_";
 }

+ 18 - 38
novel-demo/src/main/java/com/sf/service/impl/BookRankByRedisServiceImpl.java

@@ -26,52 +26,20 @@ public class BookRankByRedisServiceImpl implements IBookRankService {
 
     @Override
     public List<BookRankRespDto> listVisitRankBooks() {
-        // 将书籍对象的json放入zset的value中 点击量放入scores
-        // 当zset中已经有值时  只需要从zset中取数据
-        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
-        Long size = zSetOperations.size(RedisKeyConst.VISIT_ZSET);
-        if (size == 0) {
-            System.out.println("visitZset size:" + size);
-            initData();
-        }
-        Set<String> set = zSetOperations.reverseRange(RedisKeyConst.VISIT_ZSET, 0, 29);
-        return set.stream().map(str -> {
-            // 将map中的每一个元素 转化为BookRankRespDto
-            BookInfo bookInfo = gson.fromJson(str, BookInfo.class);
-            BookRankRespDto bookRankRespDto = new BookRankRespDto();
-            BeanUtils.copyProperties(bookInfo, bookRankRespDto);
-            return bookRankRespDto;
-        }).toList();
-    }
-
-    // 数据初始化
-    private void initData() {
-        List<BookInfo> bookInfos = bookInfoMapper.selectList(null);
-        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
-        for (BookInfo bookInfo : bookInfos) {
-            Long visitCount = bookInfo.getVisitCount();
-            String bookInfoJson = gson.toJson(bookInfo);
-            zSetOperations.add(RedisKeyConst.VISIT_ZSET, bookInfoJson, visitCount);
-        }
+        return getRankDataByRedis(RedisKeyConst.VISIT_ZSET);
     }
 
     @Override
     public List<BookRankRespDto> listNewestRankBooks() {
-        String key = RedisKeyConst.NEW_ZSET;
-        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
-        Set<String> set = zSetOperations.reverseRange(key, 0, 29);
-        return set.stream().map(str -> {
-            // 将map中的每一个元素 转化为BookRankRespDto
-            BookInfo bookInfo = gson.fromJson(str, BookInfo.class);
-            BookRankRespDto bookRankRespDto = new BookRankRespDto();
-            BeanUtils.copyProperties(bookInfo, bookRankRespDto);
-            return bookRankRespDto;
-        }).toList();
+        return getRankDataByRedis(RedisKeyConst.NEW_ZSET);
     }
 
     @Override
     public List<BookRankRespDto> listUpdateRankBooks() {
-        String key = RedisKeyConst.UPDATE_ZSET;
+        return getRankDataByRedis(RedisKeyConst.UPDATE_ZSET);
+    }
+
+    private List<BookRankRespDto> getRankDataByRedis(String key){
         ZSetOperations zSetOperations = redisTemplate.opsForZSet();
         Set<String> set = zSetOperations.reverseRange(key, 0, 29);
         return set.stream().map(str -> {
@@ -83,6 +51,18 @@ public class BookRankByRedisServiceImpl implements IBookRankService {
         }).toList();
     }
 
+    // 数据初始化
+//    private void initData() {
+//        List<BookInfo> bookInfos = bookInfoMapper.selectList(null);
+//        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
+//        for (BookInfo bookInfo : bookInfos) {
+//            Long visitCount = bookInfo.getVisitCount();
+//            String bookInfoJson = gson.toJson(bookInfo);
+//            zSetOperations.add(RedisKeyConst.VISIT_ZSET, bookInfoJson, visitCount);
+//        }
+//    }
+
+
     // 这是实时榜单的处理逻辑
     @Override
     public void updateVisitRank(Long bookId) {

+ 6 - 2
novel-demo/src/main/java/com/sf/service/impl/UserInfoServiceImpl.java

@@ -2,6 +2,7 @@ package com.sf.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.sf.cons.RedisKeyConst;
 import com.sf.dto.req.UserLoginReqDto;
 import com.sf.dto.req.UserRegisterReqDto;
 import com.sf.dto.resp.ImgVerifyCodeRespDto;
@@ -57,7 +58,10 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
         // 将这个唯一的sessionId和code码关联 存储在容器中
         // 将pair(成对的数据)中的第一个数据 和 sessionId存入map中
 //        captcha.put(sessionId, pair.getFirst());
-        redisTemplate.opsForValue().set(sessionId, pair.getFirst(),10,TimeUnit.MINUTES);
+
+        // 验证码使用string存储
+        String key = RedisKeyConst.USER_VERIFY_PRE + sessionId;
+        redisTemplate.opsForValue().set(key, pair.getFirst(), 10, TimeUnit.MINUTES);
         ImgVerifyCodeRespDto verifyCodeRespDto = ImgVerifyCodeRespDto.builder()
                 .sessionId(sessionId)
                 .img(pair.getSecond())   // 将hutool生成的base数据设置进去
@@ -115,7 +119,7 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
         // 注册之后 自动登录 同样将token信息存储到redis中
         // 当前的退出 是客户端处理的 没有登录状态的请求 不携带token信息
         // 如果服务端也接收退出的请求  那么再从redis中删除此token
-        String tokenKey = "token_" + userInfo.getId();
+        String tokenKey = RedisKeyConst.USER_TOKEN_PRE + userInfo.getId();
         redisTemplate.opsForValue().set(tokenKey, token, 10, TimeUnit.DAYS);
         return respDto;
     }

+ 26 - 22
novel-demo/src/main/java/com/sf/task/RankTask.java

@@ -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);
         }
 
     }