缓存优化,执行器查询展示优化

This commit is contained in:
暮光:城中城
2019-08-27 22:53:41 +08:00
parent cbaee753cb
commit 63f6b80b79
12 changed files with 113 additions and 85 deletions

View File

@@ -0,0 +1,6 @@
package com.zyplayer.doc.data.utils;
public class CachePrefix {
public static final String WIKI_LOCK_PAGE = "WIKI_LOCK_PAGE_";
public static final String DB_EDITOR_DATA_CACHE = "DB_EDITOR_DATA_CACHE_";
}

View File

@@ -1,6 +1,8 @@
package com.zyplayer.doc.data.utils; package com.zyplayer.doc.data.utils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map; import java.util.Map;
import java.util.Timer; import java.util.Timer;
@@ -8,12 +10,13 @@ import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 缓存工具类 * 轻量缓存工具类
* *
* @author 暮光:城中城 * @author 暮光:城中城
* @since 2019年05月25日 * @since 2019年05月25日
*/ */
public class CacheUtil { public class CacheUtil {
private static Logger logger = LoggerFactory.getLogger(CacheUtil.class);
// 定期清除过期的key // 定期清除过期的key
static { static {
@@ -22,67 +25,99 @@ public class CacheUtil {
@Override @Override
public void run() { public void run() {
long currentTimeMillis = System.currentTimeMillis(); long currentTimeMillis = System.currentTimeMillis();
for (Map.Entry<String, CacheTime> entry : cacheTimeMap.entrySet()) { for (String key : cacheDataMap.keySet()) {
CacheTime cacheTime = entry.getValue(); CacheData cacheData = cacheDataMap.get(key);
if (currentTimeMillis - cacheTime.getLastVisitTime() < (cacheTime.getSecond() * 1000)) { if (cacheData == null || currentTimeMillis - cacheData.getLastVisitTime() < (cacheData.getSeconds() * 1000)) {
continue; continue;
} }
cacheMap.remove(entry.getKey()); cacheDataMap.remove(key);
logger.info("缓存过期,清理缓存:{}", key);
} }
} }
}, 0, 1000); }, 0, 5000);
} }
public static void main(String[] args) throws InterruptedException {
CacheUtil.put("xx", "xx", 6);
Thread.sleep(4000);
CacheUtil.get("xx");
System.out.println(cacheDataMap.get("xx").getLastVisitTime());
Thread.sleep(7000);
CacheUtil.get("xx");
System.out.println(cacheDataMap.get("xx").getLastVisitTime());
Thread.sleep(99000);
}
// 现在是内存缓存不支持分布式部署后期考虑放到redis但感觉也没必要。。 // 现在是内存缓存不支持分布式部署后期考虑放到redis但感觉也没必要。。
private static Map<String, Object> cacheMap = new ConcurrentHashMap<>(); private static Map<String, CacheData> cacheDataMap = new ConcurrentHashMap<>();
private static Map<String, CacheTime> cacheTimeMap = new ConcurrentHashMap<>();
/**
* 放入缓存默认12小时按最后一次访问的12小时
* @param key
* @param value
*/
public static void put(String key, Object value) { public static void put(String key, Object value) {
put(key, value, (long) (60 * 60 * 12)); put(key, value, 60 * 60 * 12);
} }
public static void put(String key, Object value, Long second) { /**
* 放入缓存,有访问则继续有效
* @param key
* @param value
* @param seconds 缓存时长 秒
*/
public static void put(String key, Object value, long seconds) {
if (StringUtils.isBlank(key) || value == null) { if (StringUtils.isBlank(key) || value == null) {
return; return;
} }
cacheMap.put(key, value); cacheDataMap.put(key, new CacheData(seconds, value));
cacheTimeMap.put(key, new CacheTime(second));
} }
/**
* 删除缓存
* @param key
*/
public static void remove(String key) { public static void remove(String key) {
if (StringUtils.isBlank(key)) { if (StringUtils.isBlank(key)) {
return; return;
} }
cacheMap.remove(key); cacheDataMap.remove(key);
cacheTimeMap.remove(key);
} }
/**
* 获取缓存
* @param key
*/
public static <T> T get(String key) { public static <T> T get(String key) {
if (StringUtils.isBlank(key)) { if (StringUtils.isBlank(key)) {
return null; return null;
} }
CacheTime cacheTime = cacheTimeMap.get(key); CacheData cacheData = cacheDataMap.get(key);
if (cacheTime != null) { if (cacheData != null) {
cacheTime.setLastVisitTime(System.currentTimeMillis()); cacheData.setLastVisitTime(System.currentTimeMillis());
cacheTimeMap.put(key, cacheTime); return (T) cacheData.getData();
} }
return (T) cacheMap.get(key); return null;
} }
private static class CacheTime { private static class CacheData {
private Long second; /**缓存时长 秒*/
private Long seconds;
private Long lastVisitTime; private Long lastVisitTime;
private Object data;
public CacheTime(Long second) { public CacheData(long seconds, Object data) {
this.second = second; this.data = data;
this.seconds = seconds;
this.lastVisitTime = System.currentTimeMillis(); this.lastVisitTime = System.currentTimeMillis();
} }
public Long getSecond() { public Long getSeconds() {
return second; return seconds;
} }
public void setSecond(Long second) { public void setSeconds(Long seconds) {
this.second = second; this.seconds = seconds;
} }
public Long getLastVisitTime() { public Long getLastVisitTime() {
@@ -92,5 +127,13 @@ public class CacheUtil {
public void setLastVisitTime(Long lastVisitTime) { public void setLastVisitTime(Long lastVisitTime) {
this.lastVisitTime = lastVisitTime; this.lastVisitTime = lastVisitTime;
} }
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
} }
} }

View File

@@ -14,6 +14,8 @@ import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.support.consts.DocAuthConst; import com.zyplayer.doc.data.repository.support.consts.DocAuthConst;
import com.zyplayer.doc.data.service.manage.DbDatasourceService; import com.zyplayer.doc.data.service.manage.DbDatasourceService;
import com.zyplayer.doc.data.service.manage.UserAuthService; import com.zyplayer.doc.data.service.manage.UserAuthService;
import com.zyplayer.doc.data.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.db.controller.vo.DatabaseExportVo; import com.zyplayer.doc.db.controller.vo.DatabaseExportVo;
import com.zyplayer.doc.db.controller.vo.TableColumnVo; import com.zyplayer.doc.db.controller.vo.TableColumnVo;
import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo; import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo;
@@ -97,6 +99,11 @@ public class DatabaseDocController {
&& !DocUserUtil.haveCustomAuth(DbAuthType.VIEW.getName(), DocAuthConst.DB + sourceId)) { && !DocUserUtil.haveCustomAuth(DbAuthType.VIEW.getName(), DocAuthConst.DB + sourceId)) {
return DocDbResponseJson.ok(); return DocDbResponseJson.ok();
} }
String cacheKey = CachePrefix.DB_EDITOR_DATA_CACHE + sourceId;
Object resultObj = CacheUtil.get(cacheKey);
if (resultObj != null) {
return DocDbResponseJson.ok(resultObj);
}
BaseMapper baseMapper = this.getBaseMapper(sourceId); BaseMapper baseMapper = this.getBaseMapper(sourceId);
DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId); DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getFactoryById(sourceId);
List<DatabaseInfoDto> dbNameDtoList = baseMapper.getDatabaseList(); List<DatabaseInfoDto> dbNameDtoList = baseMapper.getDatabaseList();
@@ -121,6 +128,8 @@ public class DatabaseDocController {
dbResultMap.put("db", dbNameDtoList); dbResultMap.put("db", dbNameDtoList);
dbResultMap.put("table", dbTableMap); dbResultMap.put("table", dbTableMap);
dbResultMap.put("column", tableColumnsMap); dbResultMap.put("column", tableColumnsMap);
// 缓存10分钟如果10分钟内库里面增删改了表或字段则提示不出来
CacheUtil.put(cacheKey, dbResultMap, 6000);
return DocDbResponseJson.ok(dbResultMap); return DocDbResponseJson.ok(dbResultMap);
} }

View File

@@ -1,19 +0,0 @@
package com.zyplayer.doc.db.framework.db.support;
/**
* 动态分库使用
*/
public class DBInfoHolder {
private static final ThreadLocal<String> DB_INFO_NOW = new ThreadLocal<String>();
public static void setDbInfoNow(String dbInfo) {
DB_INFO_NOW.set(dbInfo);
}
public static String getDbInfoNow() {
return DB_INFO_NOW.get();
}
public static void clear() {
}
}

View File

@@ -1,15 +0,0 @@
package com.zyplayer.doc.db.framework.db.support;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 动态切换数据源
*/
public class ErpRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DBInfoHolder.getDbInfoNow();
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={2:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+""+e+".js?"+{0:"49668c3fbed15a679eda",1:"0a0403eb1820498dc9bc"}[e];var i=setTimeout(r,12e4);return a.onerror=a.onload=r,u.appendChild(a),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]); !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(r&&r(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=n(n.s=a[l]);return f};var t={},o={2:0};n.e=function(e){function r(){u.onerror=u.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var a=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,n.nc&&u.setAttribute("nonce",n.nc),u.src=n.p+""+e+".js?"+{0:"ae1e13bde53c50facad6",1:"0a0403eb1820498dc9bc"}[e];var i=setTimeout(r,12e4);return u.onerror=u.onload=r,a.appendChild(u),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=doc-db-manifest.js.map?4cab9b90fde0f8edb725 //# sourceMappingURL=doc-db-manifest.js.map?c1844f50fc431da7b290

View File

@@ -8,7 +8,7 @@
<body> <body>
<div id="app"></div> <div id="app"></div>
<script type="text/javascript" src="doc-db-manifest.js?4cab9b90fde0f8edb725"></script><script type="text/javascript" src="doc-db-vendor.js?0a0403eb1820498dc9bc"></script><script type="text/javascript" src="doc-db-index.js?49668c3fbed15a679eda"></script></body> <script type="text/javascript" src="doc-db-manifest.js?c1844f50fc431da7b290"></script><script type="text/javascript" src="doc-db-vendor.js?0a0403eb1820498dc9bc"></script><script type="text/javascript" src="doc-db-index.js?ae1e13bde53c50facad6"></script></body>
</html> </html>

View File

@@ -137,7 +137,7 @@ public class ZyplayerProxyFilter implements Filter {
httpRequest.cookie(httpCookieList.toArray(new HttpCookie[]{})); httpRequest.cookie(httpCookieList.toArray(new HttpCookie[]{}));
} }
String resultStr = httpRequest.execute().body(); String resultStr = httpRequest.execute().body();
if (proxyUrl.indexOf(Consts.V2_API_DOCS) >= 0) { if (proxyUrl.contains(Consts.V2_API_DOCS)) {
// "basePath":"/" 替换成 "basePath":"/zyplayer-doc-manage/zyplayer-proxy/2/",使其走代理接口 // "basePath":"/" 替换成 "basePath":"/zyplayer-doc-manage/zyplayer-proxy/2/",使其走代理接口
ServletContext servletContext = httpServletRequest.getServletContext(); ServletContext servletContext = httpServletRequest.getServletContext();
Object ctx = servletContext.getAttribute("ctx"); Object ctx = servletContext.getAttribute("ctx");

View File

@@ -29,7 +29,11 @@
<el-table-column width="60px" v-if="executeResultCols.length > 0"> <el-table-column width="60px" v-if="executeResultCols.length > 0">
<template slot-scope="scope">{{scope.row._index}}</template> <template slot-scope="scope">{{scope.row._index}}</template>
</el-table-column> </el-table-column>
<el-table-column v-for="item in executeResultCols" :prop="item.prop" :label="item.prop"></el-table-column> <el-table-column v-for="item in executeResultCols" :prop="item.prop" :label="item.prop">
<template slot-scope="scope">
<el-input :value="scope.row[item.prop]" :readonly="true"></el-input>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
</el-card> </el-card>
@@ -257,9 +261,9 @@
if (lineStr.endsWith(app.editorDbInfo[i].dbName + ".")) { if (lineStr.endsWith(app.editorDbInfo[i].dbName + ".")) {
var tableInfo = app.editorDbTableInfo[app.editorDbInfo[i].dbName]; var tableInfo = app.editorDbTableInfo[app.editorDbInfo[i].dbName];
if (!!tableInfo) { if (!!tableInfo) {
for (var i = 0; i < tableInfo.length; i++) { for (var j = 0; j < tableInfo.length; j++) {
var caption = (!!tableInfo[i].tableComment) ? tableInfo[i].tableName + "-" + tableInfo[i].tableComment : tableInfo[i].tableName; var caption = (!!tableInfo[j].tableComment) ? tableInfo[j].tableName + "-" + tableInfo[j].tableComment : tableInfo[j].tableName;
callbackArr.push({caption: caption, snippet: tableInfo[i].tableName, meta: "table", type: "snippet", score : 1000}); callbackArr.push({caption: caption, snippet: tableInfo[j].tableName, meta: "table", type: "snippet", score : 1000});
} }
isFound = true; isFound = true;
} }
@@ -309,9 +313,9 @@
} }
var columnInfo = app.editorColumnInfo[tableInfo[i].tableName]; var columnInfo = app.editorColumnInfo[tableInfo[i].tableName];
if (!!columnInfo) { if (!!columnInfo) {
for (var i = 0; i < columnInfo.length; i++) { for (var j = 0; j < columnInfo.length; j++) {
var caption = (!!columnInfo[i].description) ? columnInfo[i].name + "-" + columnInfo[i].description : columnInfo[i].name; var caption = (!!columnInfo[j].description) ? columnInfo[j].name + "-" + columnInfo[j].description : columnInfo[j].name;
callbackArr.push({caption: caption, snippet: columnInfo[i].name, meta: "column", type: "snippet", score : 1000}); callbackArr.push({caption: caption, snippet: columnInfo[j].name, meta: "column", type: "snippet", score : 1000});
} }
isFound = true; isFound = true;
} }
@@ -336,6 +340,11 @@
.data-executor-vue .el-table td, .el-table th{ .data-executor-vue .el-table td, .el-table th{
padding: 6px 0; padding: 6px 0;
} }
.data-executor-vue .el-input__inner{
height: 25px;
line-height: 25px;
padding: 0 5px;
}
.data-executor-vue-out .el-tabs__nav-scroll{ .data-executor-vue-out .el-tabs__nav-scroll{
padding-left: 20px; padding-left: 20px;
} }

View File

@@ -19,12 +19,12 @@ import com.zyplayer.doc.data.service.elasticsearch.entity.EsWikiPage;
import com.zyplayer.doc.data.service.elasticsearch.service.EsWikiPageService; import com.zyplayer.doc.data.service.elasticsearch.service.EsWikiPageService;
import com.zyplayer.doc.data.service.elasticsearch.support.EsPage; import com.zyplayer.doc.data.service.elasticsearch.support.EsPage;
import com.zyplayer.doc.data.service.manage.*; import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.data.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil; import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
import com.zyplayer.doc.wiki.controller.vo.WikiPageVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageVo;
import com.zyplayer.doc.wiki.framework.consts.SpaceType; import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import com.zyplayer.doc.wiki.framework.consts.WikiAuthType; import com.zyplayer.doc.wiki.framework.consts.WikiAuthType;
import com.zyplayer.doc.wiki.framework.consts.WikiCachePrefix;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.dozer.Mapper; import org.dozer.Mapper;
@@ -287,7 +287,7 @@ public class WikiPageController {
@PostMapping("/unlock") @PostMapping("/unlock")
public ResponseJson<Object> unlock(Long pageId) { public ResponseJson<Object> unlock(Long pageId) {
String lockKey = WikiCachePrefix.WIKI_LOCK_PAGE + pageId; String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey); DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) { if (pageLockUser != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser(); DocUserDetails currentUser = DocUserUtil.getCurrentUser();
@@ -301,7 +301,7 @@ public class WikiPageController {
@PostMapping("/lock") @PostMapping("/lock")
public ResponseJson<Object> editLock(Long pageId) { public ResponseJson<Object> editLock(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser(); DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String lockKey = WikiCachePrefix.WIKI_LOCK_PAGE + pageId; String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey); DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) { if (pageLockUser != null) {
if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) { if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {

View File

@@ -1,5 +0,0 @@
package com.zyplayer.doc.wiki.framework.consts;
public class WikiCachePrefix {
public static final String WIKI_LOCK_PAGE = "WIKI_LOCK_PAGE_";
}