diff --git a/src/main/java/app/configurations/CacheConfig.java b/src/main/java/app/configurations/CacheConfig.java index 541e681..d1e5148 100644 --- a/src/main/java/app/configurations/CacheConfig.java +++ b/src/main/java/app/configurations/CacheConfig.java @@ -11,6 +11,6 @@ import org.springframework.context.annotation.Configuration; public class CacheConfig { @Bean public CacheManager cacheManager() { - return new ConcurrentMapCacheManager("steam_data", "steam_search_data"); + return new ConcurrentMapCacheManager("steam_data", "steam_search_data", "graphs"); } } diff --git a/src/main/java/app/controllers/user/PublicController.java b/src/main/java/app/controllers/user/PublicController.java index 4822605..14dc6b2 100644 --- a/src/main/java/app/controllers/user/PublicController.java +++ b/src/main/java/app/controllers/user/PublicController.java @@ -139,6 +139,7 @@ public class PublicController { searchFilter.setEnd(Timestamp.from(Instant.now()).toLocalDateTime()); if (searchFilter.getBeginTime() == null) searchFilter.setBegin(Timestamp.from(Instant.now().minusSeconds(30 * 3600* 24)).toLocalDateTime()); + searchFilter.setEndOrBeginTimeOfDay(); return new ResponseEntity<>(graphService.getVipOnPeriod( searchFilter diff --git a/src/main/java/app/controllers/user/UsertimeController.java b/src/main/java/app/controllers/user/UsertimeController.java index 0fca4b9..e01c311 100644 --- a/src/main/java/app/controllers/user/UsertimeController.java +++ b/src/main/java/app/controllers/user/UsertimeController.java @@ -42,6 +42,7 @@ public class UsertimeController { searchFilter.setEnd(Timestamp.from(Instant.now()).toLocalDateTime()); if (searchFilter.getBeginTime() == null) searchFilter.setBegin(Timestamp.from(Instant.now().minusSeconds(30 * 3600* 24)).toLocalDateTime()); + searchFilter.setEndOrBeginTimeOfDay(); return new ResponseEntity<>(graphService.getUsertimeOnPeriod( searchFilter diff --git a/src/main/java/app/entities/SearchFilter.java b/src/main/java/app/entities/SearchFilter.java index 928babf..1771d58 100644 --- a/src/main/java/app/entities/SearchFilter.java +++ b/src/main/java/app/entities/SearchFilter.java @@ -7,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.sql.Timestamp; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; @@ -22,12 +23,30 @@ public class SearchFilter { private String serverId = null; private Long utc = 0L; - public boolean isEmpty() { - return accounts == null || accounts.isEmpty() || begin == null || end == null; + public void setEndOrBeginTimeOfDay() { + if (begin != null) { //todo utc support + begin = begin.toLocalDate().atStartOfDay(); + } + if (end != null) { + end = end.toLocalDate().atStartOfDay().minusSeconds(1).plusDays(1); + } + } + + public String getCacheKey() { + StringBuilder stringBuilder = new StringBuilder(); + if (accounts != null) + stringBuilder.append(String.join(",", accounts)).append(";"); + if (begin != null) + stringBuilder.append(begin).append(";"); + if (end != null) + stringBuilder.append(end).append(";"); + if (serverId != null) + stringBuilder.append(serverId).append(";"); + return stringBuilder.toString(); } /** - * Выдает список из ид 3 версии [U:1:127332962] + * Выдает список из ид 3 версии [U:1:127332962], а точнее 127332962 * @param profileService * @return */ @@ -105,12 +124,20 @@ public class SearchFilter { return serverId == null || serverId.isEmpty() ? null : serverId; } + /** + * разница в днях между заданными данными, иначе 0 + * @return + */ public Long getDayDelta() { if (begin != null && end != null) return ChronoUnit.DAYS.between(begin, end); else return 0L; } + /** + * высираем период исходя из заданного участка времени + * @return + */ public String getMaybePeriod() { long delta = getDayDelta(); if (delta <= 30) return "day"; diff --git a/src/main/java/app/services/db/GraphService.java b/src/main/java/app/services/db/GraphService.java index 1236d78..d757961 100644 --- a/src/main/java/app/services/db/GraphService.java +++ b/src/main/java/app/services/db/GraphService.java @@ -5,10 +5,15 @@ import app.entities.db.period.PerPeriodStatistic; import app.services.ProfileService; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.util.List; @@ -21,6 +26,14 @@ public class GraphService { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + private final static Logger logger = LoggerFactory.getLogger(GraphService.class); + + @Scheduled(cron = "@hourly") + @CacheEvict(value = "graphs", allEntries = true) + public void purgeCache() { + logger.info("Cache clean"); + } + /** * 2021-03-08 00:00:00.000000 +00:00,3853,srv1 * 2021-03-12 00:00:00.000000 +00:00,930,srv1 @@ -30,6 +43,7 @@ public class GraphService { * @param searchFilter * @return */ + @Cacheable(value = "graphs", key = "#searchFilter.cacheKey") public List getUsertimeOnPeriod(SearchFilter searchFilter) { final String sql = "select date_trunc(:delta, timestamp) AS ts, :delta as period, sum(connect_duration) as value, srv_id from user_connections " + "where (:account_ids_empty = true or account_id in (:account_ids)) and connect_duration != 0 and timestamp between :begindate and :enddate " + @@ -60,6 +74,7 @@ public class GraphService { } } + @Cacheable(value = "graphs", key = "#searchFilter.cacheKey") public List getVipOnPeriod(SearchFilter searchFilter) { final String sql = "select date_trunc(:delta, timestamp) AS ts, :delta as period, count(*) as value, givemethod, amount from gived_vip " + "where (:account_ids_empty = true or steam2 in (:account_ids)) and givemethod != 4 and timestamp between :begindate and :enddate " +