• 本地缓存,redis缓存综合应用


    /**
    * 系统弹幕有效期(本地缓存10S,redis缓存1分钟)
    **/
    private static Map<String,LocalDateTime> barrageShowValidMap = new ConcurrentHashMap<>();
    private static Map<String,List<BarrageShowVO>> barrageShowMap = new ConcurrentHashMap<>();
    private static Long barragesShowCacheTimes = Constant.ONE_MINUTE;
    private static Long barragesShowCacheLocalTimes = Constant.TEN_SECOND;

    /**
    * @desc : 获取系统弹幕
    * @author : 毛会懂
    * @create: 2021/9/18 11:01:00
    **/
    private List<BarrageShowVO> getSysBarrages(Integer activityId){
    if (activityId == null) {
    throw new BusinessException(GameErrorCodeEnum.LOTTY_PRE_VERIFY_ERROR.getErrorCode(), "活动id为空");
    }

    List<BarrageShowVO> barrageShowList;
    // 从本地取系统弹幕
    String localKey = "ACTIVITY_SYS_BARRAGE_" + activityId.toString();
    LocalDateTime localDateTime = barrageShowValidMap.get(localKey);
    LocalDateTime now = LocalDateTime.now();
    if(localDateTime != null && localDateTime.isAfter(now)){
    log.info("读本地缓存");
    barrageShowList = barrageShowMap.get(localKey);
    }else {
    log.info("读redis缓存");
    String barragesKey = RedisKeyManagement.getKey(RedisKeyManagement.ACTIVITY_SYS_BARRAGES, Arrays.asList(activityId.toString()));
    barrageShowList = (List<BarrageShowVO>) redisService.get(barragesKey);
    if (barrageShowList == null) {
    synchronized (this) {
    log.info("同步读redis缓存");
    barrageShowList = (List<BarrageShowVO>) redisService.get(barragesKey);
    if (barrageShowList == null) {
    // 查询系统弹幕
    QueryWrapper<ActivitySysBarrageDO> sysBarrageQueryWrapper = new QueryWrapper<>();
    sysBarrageQueryWrapper.eq("activity_id", activityId);
    sysBarrageQueryWrapper.eq("status", EnableStatusEnum.ENABLE);
    List<ActivitySysBarrageDO> sysBarrageList = sysBarrageService.list(sysBarrageQueryWrapper);
    barrageShowList = new ArrayList<>();
    if(!CollectionUtils.isEmpty(sysBarrageList)) {
    for (ActivitySysBarrageDO barrageDO : sysBarrageList) {
    BarrageShowVO showVO = new BarrageShowVO();
    BeanUtils.copyProperties(barrageDO,showVO);
    barrageShowList.add(showVO);
    }
    }
    redisService.set(barragesKey, barrageShowList, barragesShowCacheTimes);
    }
    }
    }

    // 添加到本地缓存
    if(barrageShowList != null) {
    barrageShowValidMap.put(localKey, LocalDateTime.now().plusSeconds(barragesShowCacheLocalTimes));
    barrageShowMap.put(localKey, barrageShowList);
    }
    // 清除过期的缓存(只有map的size超过50才会清缓存,防止清缓存频率太高)
    if(barrageShowValidMap.size() > 50){
    Iterator<Map.Entry<String, LocalDateTime>> iterator = barrageShowValidMap.entrySet().iterator();
    while (iterator.hasNext()){
    Map.Entry<String, LocalDateTime> next = iterator.next();
    LocalDateTime value = next.getValue();
    if(value.isBefore(now)){
    iterator.remove();
    String key = next.getKey();
    barrageShowMap.remove(key);
    }
    }
    }
    }
    return barrageShowList;
    }
  • 相关阅读:
    用户代理列表--爬虫伪装浏览器访问用
    python爬虫解析页面数据的三种方式
    requests模块的使用
    Python pip源更改
    个人博客项目开发
    Django之中间件
    Django之发送邮件
    Django组件之用户认证组件
    Django之Cookie与session
    Django组件之分页器
  • 原文地址:https://www.cnblogs.com/maohuidong/p/15325032.html
Copyright © 2020-2023  润新知