zoukankan      html  css  js  c++  java
  • 本地缓存,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;
    }
  • 相关阅读:
    springcloud-Ribbon之手写轮询算法
    springcloud-Ribbon负载均衡规则的替换
    git本地库和远程库的连接和断开
    本地项目第一次提交到码云或github
    python基础语法练习
    Xss-labs-level11-15
    Vulnhub-靶机-ESCALATE_LINUX: 1
    Xss-labs-level7-10
    Vulnhub-靶机-DC: 6
    Jenkins入门之执行Powershell脚本
  • 原文地址:https://www.cnblogs.com/maohuidong/p/15325032.html
Copyright © 2011-2022 走看看