feat: add page data cache

This commit is contained in:
2025-02-27 16:50:27 +08:00
parent f67aeaab03
commit 57551e9521
6 changed files with 135 additions and 17 deletions

View File

@@ -8,7 +8,6 @@
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hcframe-base</artifactId>
<version>1.2.3-SNAPSHOT</version>
@@ -179,7 +178,7 @@
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>

View File

@@ -51,6 +51,11 @@ public class WebPageInfo implements Serializable {
example = "asc")
private String order = ASC;
@ApiModelProperty(
value = "开启缓存"
)
private boolean enableCache = false;
public static boolean hasSort(WebPageInfo webPageInfo) {
return !StringUtils.isBlank(webPageInfo.getSortField());
}

View File

@@ -1,19 +1,101 @@
package com.taixingyiji.base.common.utils;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.pagehelper.PageInfo;
import com.taixingyiji.base.common.WebPageInfo;
import com.github.pagehelper.PageHelper;
import com.taixingyiji.base.module.cache.CacheService;
import com.taixingyiji.base.module.cache.base.BaseCache;
import com.taixingyiji.base.module.cache.emum.CacheType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
@Component
public class MyPageHelper {
private static MyPageHelper myPageHelper;
@Autowired
BaseCache baseCache;
@PostConstruct
public void init() {
myPageHelper = this;
}
public static void start(WebPageInfo webPageInfo) {
if (WebPageInfo.hasSort(webPageInfo)) {
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), webPageInfo.getSortSql());
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), webPageInfo.getSortSql()).setAsyncCount(true);
} else {
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize());
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize()).setAsyncCount(true);
}
}
public static void orderBy(String sortField,String order){
PageHelper.orderBy(sortField+" "+order);
public static void noCount(WebPageInfo webPageInfo) {
if (WebPageInfo.hasSort(webPageInfo)) {
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), false).setOrderBy(webPageInfo.getSortSql());
} else {
PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), false);
}
}
public static PageInfo<Map<String, Object>> noCount(WebPageInfo webPageInfo, Supplier<List<Map<String, Object>>> querySupplier) {
if (WebPageInfo.hasSort(webPageInfo)) {
return PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), webPageInfo.getSortSql()).count(false).doSelectPageInfo(querySupplier::get);
} else {
return PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize()).count(false).doSelectPageInfo(querySupplier::get);
}
}
public static PageInfo<Map<String, Object>> myStart(WebPageInfo webPageInfo, Supplier<List<Map<String, Object>>> querySupplier) {
if (WebPageInfo.hasSort(webPageInfo)) {
return PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize(), webPageInfo.getSortSql()).doSelectPageInfo(querySupplier::get);
} else {
return PageHelper.startPage(webPageInfo.getPageNum(), webPageInfo.getPageSize()).doSelectPageInfo(querySupplier::get);
}
}
public static PageInfo<Map<String, Object>> start(WebPageInfo webPageInfo, String sql, Supplier<List<Map<String, Object>>> querySupplier) {
Long currentTime = System.currentTimeMillis();
String data = myPageHelper.baseCache.get(CacheType.pageCache.toString(), sql, String.class);
JSONObject jsonObject = new JSONObject();
if (StringUtils.isEmpty(data)) {
PageInfo<Map<String, Object>> result = myStart(webPageInfo, querySupplier);
jsonObject.set("time", currentTime);
jsonObject.set("count", result.getTotal());
myPageHelper.baseCache.add(CacheType.pageCache.toString(), sql, jsonObject.toString(), String.class);
return result;
} else {
JSONObject cacheJson = JSONUtil.parseObj(data);
Long saveTime = (Long) cacheJson.get("time");
long timeDiffInSeconds = (currentTime - saveTime) / 1000;
if (timeDiffInSeconds > 60) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
PageInfo<Map<String, Object>> result = myStart(webPageInfo, querySupplier);
jsonObject.set("time", currentTime);
jsonObject.set("count", result.getTotal());
myPageHelper.baseCache.add(CacheType.pageCache.toString(), sql, jsonObject.toString(), String.class);
}
});
thread.start();
}
long total = cacheJson.get("count", Long.class);
noCount(webPageInfo);
PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(querySupplier.get());
pageInfo.setTotal(total);
return pageInfo;
}
}
public static void orderBy(String sortField, String order) {
PageHelper.orderBy(sortField + " " + order);
}
}

View File

@@ -11,5 +11,6 @@ public enum CacheType {
// 基表信息缓存
baseCache,
// 数据库连接缓存
datasourceCache
datasourceCache,
pageCache,
}

View File

@@ -85,12 +85,12 @@ public class TableCache implements CacheService {
case tableCache:
OsSysTable osSysTable = osSysTableMapper.getTableAllInfo((String) key);
JudgeException.isNull(osSysTable, "can not find key " + key + " in cache which cache name is " + name);
baseCache.add(name.toString(), key, osSysTableMapper.getTableAllInfo((String)key), OsSysTable.class);
baseCache.add(name.toString(), key, osSysTableMapper.getTableAllInfo((String) key), OsSysTable.class);
break;
case baseCache:
OsSysTable osSysTable1 = getCacheValue(CacheType.tableCache, key, OsSysTable.class);
Condition condition = Condition.creatCriteria().andEqual("DELETED",1).build();
List<Map<String, Object>> baseList = baseMapper.selectByCondition(osSysTable1.getTableName(),condition);
Condition condition = Condition.creatCriteria().andEqual("DELETED", 1).build();
List<Map<String, Object>> baseList = baseMapper.selectByCondition(osSysTable1.getTableName(), condition);
JudgeException.isNull(baseList, "can not find key " + key + " in cache which cache name is " + name);
baseCache.add(name.toString(), key, baseList, List.class);
break;

View File

@@ -376,16 +376,22 @@ public class BaseMapperImpl implements BaseMapper {
@Override
public <E> PageInfo<Map<String, Object>> selectByEqual(DataMap<E> dataMap, Map<String, Object> map, WebPageInfo webPageInfo) {
JudgesNull(dataMap.getTableName(), "tableName can not be null!");
MyPageHelper.start(webPageInfo);
Condition condition = equal(dataMap, map);
if(webPageInfo.isEnableCache()){
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(condition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@Override
public PageInfo<Map<String, Object>> selectByEqual(String tableName, Map<String, Object> map, WebPageInfo webPageInfo) {
JudgesNull(tableName, "tableName can not be null!");
MyPageHelper.start(webPageInfo);
Condition condition = equal(DataMap.builder().tableName(tableName).build(), map);
if(webPageInfo.isEnableCache()){
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(condition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@@ -466,38 +472,57 @@ public class BaseMapperImpl implements BaseMapper {
@Override
public PageInfo<Map<String, Object>> selectByCondition(Condition condition, WebPageInfo webPageInfo) {
MyPageHelper.start(webPageInfo);
if(webPageInfo.isEnableCache()){
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(condition));
}
return new PageInfo<>(selectList(condition));
}
@Override
public <E> PageInfo<Map<String, Object>> selectByCondition(DataMap<E> dataMap, Condition condition, WebPageInfo webPageInfo) {
JudgesNull(dataMap.getTableName(), "tableName can not be null!");
MyPageHelper.start(webPageInfo);
condition = condition.toCreatCriteria(dataMap).build();
if(webPageInfo.isEnableCache()){
Condition finalCondition = condition;
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(finalCondition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@Override
public PageInfo<Map<String, Object>> selectByCondition(String tableName, Condition condition, WebPageInfo webPageInfo) {
JudgesNull(tableName, "tableName can not be null!");
MyPageHelper.start(webPageInfo);
condition = condition.toCreatCriteria(DataMap.builder().tableName(tableName).build()).build();
if(webPageInfo.isEnableCache()){
Condition finalCondition = condition;
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(finalCondition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@Override
public PageInfo<Map<String, Object>> selectByCondition(String tableName, List<String> fieldList, Condition condition, WebPageInfo webPageInfo) {
JudgesNull(tableName, "tableName can not be null!");
MyPageHelper.start(webPageInfo);
condition = condition.toCreatCriteria(DataMap.builder().tableName(tableName).fieldList(fieldList).build()).build();
if(webPageInfo.isEnableCache()){
Condition finalCondition = condition;
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(finalCondition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@Override
public PageInfo<Map<String, Object>> selectByCondition(String tableName, String fieldList, Condition condition, WebPageInfo webPageInfo) {
JudgesNull(tableName, "tableName can not be null!");
MyPageHelper.start(webPageInfo);
condition = condition.toCreatCriteria(DataMap.builder().tableName(tableName).fields(fieldList).build()).build();
if(webPageInfo.isEnableCache()){
Condition finalCondition = condition;
return MyPageHelper.start(webPageInfo,condition.getSql(),() -> selectList(finalCondition));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(selectList(condition));
}
@@ -602,6 +627,9 @@ public class BaseMapperImpl implements BaseMapper {
@Override
public PageInfo<Map<String, Object>> selectSqlByPage(String sql, WebPageInfo webPageInfo) {
if(webPageInfo.isEnableCache()){
return MyPageHelper.start(webPageInfo,sql,() -> (tableMapper.useSql(sql)));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(tableMapper.useSql(sql));
}
@@ -614,8 +642,11 @@ public class BaseMapperImpl implements BaseMapper {
@Override
public PageInfo<Map<String, Object>> selectSqlByPage(String sql, Map<String, Object> params, WebPageInfo webPageInfo) {
MyPageHelper.start(webPageInfo);
params.put("sql",sql);
if(webPageInfo.isEnableCache()){
return MyPageHelper.start(webPageInfo,sql,() -> sqlSessionTemplate.selectList(TABLE_MAPPER_PACKAGE + "useSql", params));
}
MyPageHelper.start(webPageInfo);
return new PageInfo<>(sqlSessionTemplate.selectList(TABLE_MAPPER_PACKAGE + "useSql", params));
}