skyouc
2024-12-21 c635d78b479510ebe2556a420948effcd30a0731
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.zy.asrs.wms.asrs.timer;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.wms.asrs.entity.CacheStatistics;
import com.zy.asrs.wms.asrs.service.CacheStatisticsService;
import com.zy.asrs.wms.common.constant.RedisConstants;
import com.zy.asrs.wms.common.domain.CacheHitDto;
import com.zy.asrs.wms.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
 
@Component
public class CacheStatisticsTimer {
 
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private CacheStatisticsService cacheStatisticsService;
 
    /**
     * 将缓存统计保存至数据库
     * 每30分钟扫描一次
     */
//    @Scheduled(cron = "0 30 * * * ? ")
    public void run() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String now = format.format(new Date());
        Set<String> keys = redisUtil.searchRedisKeys(RedisConstants.STATISTICS_CACHE_DATA);
        for (String key : keys) {
            if(key.contains(now)){
                continue;
            }
 
            try {
                String[] split = key.split(":");
                String ymd = split[1];
                String cacheKey = split[2];
                Object object = redisUtil.get(key);
                if(object == null){
                    continue;
                }
 
                CacheHitDto cacheHitDto = JSON.parseObject(object.toString(), CacheHitDto.class);
                CacheStatistics cacheStatistics = cacheStatisticsService.getOne(new LambdaQueryWrapper<CacheStatistics>().eq(CacheStatistics::getYmd, ymd).eq(CacheStatistics::getCacheKey, cacheKey));
                if (cacheStatistics == null) {
                    cacheStatistics = new CacheStatistics();
                    cacheStatistics.setYmd(ymd);
                    cacheStatistics.setCacheKey(cacheKey);
                    cacheStatistics.setHit(0);
                    cacheStatistics.setMiss(0);
                    cacheStatisticsService.save(cacheStatistics);
                }
 
                cacheStatistics.setHit(cacheStatistics.getHit() + cacheHitDto.getHit());
                cacheStatistics.setMiss(cacheStatistics.getMiss() + cacheHitDto.getMiss());
                cacheStatisticsService.updateById(cacheStatistics);
 
                redisUtil.del(key);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
    }
 
}