update 优化 使用 spring-cache 注解优化缓存

This commit is contained in:
疯狂的狮子li
2022-08-15 10:59:20 +08:00
parent 32cd07d9a2
commit 74e075b4d3
18 changed files with 189 additions and 137 deletions

View File

@@ -81,7 +81,8 @@ public class SysConfigController extends BaseController {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
return toAjax(configService.insertConfig(config));
configService.insertConfig(config);
return R.ok();
}
/**
@@ -94,7 +95,8 @@ public class SysConfigController extends BaseController {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) {
return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
return toAjax(configService.updateConfig(config));
configService.updateConfig(config);
return R.ok();
}
/**
@@ -104,7 +106,8 @@ public class SysConfigController extends BaseController {
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PutMapping("/updateByKey")
public R<Void> updateByKey(@RequestBody SysConfig config) {
return toAjax(configService.updateConfig(config));
configService.updateConfig(config);
return R.ok();
}
/**

View File

@@ -86,7 +86,8 @@ public class SysDictDataController extends BaseController {
@Log(title = "字典数据", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysDictData dict) {
return toAjax(dictDataService.insertDictData(dict));
dictDataService.insertDictData(dict);
return R.ok();
}
/**
@@ -96,7 +97,8 @@ public class SysDictDataController extends BaseController {
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody SysDictData dict) {
return toAjax(dictDataService.updateDictData(dict));
dictDataService.updateDictData(dict);
return R.ok();
}
/**

View File

@@ -72,7 +72,8 @@ public class SysDictTypeController extends BaseController {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
return toAjax(dictTypeService.insertDictType(dict));
dictTypeService.insertDictType(dict);
return R.ok();
}
/**
@@ -85,7 +86,8 @@ public class SysDictTypeController extends BaseController {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) {
return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
return toAjax(dictTypeService.updateDictType(dict));
dictTypeService.updateDictType(dict);
return R.ok();
}
/**

View File

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StreamUtils;
import com.ruoyi.common.core.utils.StringUtils;
@@ -11,7 +12,7 @@ import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.redis.utils.RedisUtils;
import com.ruoyi.common.redis.utils.CacheUtils;
import com.ruoyi.system.api.domain.SysUserOnline;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -48,7 +49,8 @@ public class SysUserOnlineController extends BaseController {
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) {
continue;
}
userOnlineList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token));
SysUserOnline dto = CacheUtils.get(CacheNames.ONLINE_TOKEN, token);
userOnlineList.add(dto);
}
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) {
userOnlineList = StreamUtils.filter(userOnlineList, userOnline ->

View File

@@ -45,7 +45,7 @@ public interface ISysConfigService {
* @param config 参数配置信息
* @return 结果
*/
int insertConfig(SysConfig config);
String insertConfig(SysConfig config);
/**
* 修改参数配置
@@ -53,7 +53,7 @@ public interface ISysConfigService {
* @param config 参数配置信息
* @return 结果
*/
int updateConfig(SysConfig config);
String updateConfig(SysConfig config);
/**
* 批量删除参数信息

View File

@@ -53,7 +53,7 @@ public interface ISysDictDataService {
* @param dictData 字典数据信息
* @return 结果
*/
int insertDictData(SysDictData dictData);
List<SysDictData> insertDictData(SysDictData dictData);
/**
* 修改保存字典数据信息
@@ -61,5 +61,5 @@ public interface ISysDictDataService {
* @param dictData 字典数据信息
* @return 结果
*/
int updateDictData(SysDictData dictData);
List<SysDictData> updateDictData(SysDictData dictData);
}

View File

@@ -83,7 +83,7 @@ public interface ISysDictTypeService {
* @param dictType 字典类型信息
* @return 结果
*/
int insertDictType(SysDictType dictType);
List<SysDictData> insertDictType(SysDictType dictType);
/**
* 修改保存字典类型信息
@@ -91,7 +91,7 @@ public interface ISysDictTypeService {
* @param dictType 字典类型信息
* @return 结果
*/
int updateDictType(SysDictType dictType);
List<SysDictData> updateDictType(SysDictType dictType);
/**
* 校验字典类型称是否唯一

View File

@@ -1,24 +1,24 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.redis.utils.RedisUtils;
import com.ruoyi.common.redis.utils.CacheUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -63,16 +63,12 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param configKey 参数key
* @return 参数键值
*/
@Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey")
@Override
public String selectConfigByKey(String configKey) {
String configValue = Convert.toStr(RedisUtils.getCacheObject(getCacheKey(configKey)));
if (StringUtils.isNotEmpty(configValue)) {
return configValue;
}
SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>()
.eq(SysConfig::getConfigKey, configKey));
if (ObjectUtil.isNotNull(retConfig)) {
RedisUtils.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
return retConfig.getConfigValue();
}
return StringUtils.EMPTY;
@@ -102,13 +98,14 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param config 参数配置信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#config.configKey")
@Override
public int insertConfig(SysConfig config) {
public String insertConfig(SysConfig config) {
int row = baseMapper.insert(config);
if (row > 0) {
RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
return config.getConfigValue();
}
return row;
throw new ServiceException("操作失败");
}
/**
@@ -117,8 +114,9 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param config 参数配置信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#config.configKey")
@Override
public int updateConfig(SysConfig config) {
public String updateConfig(SysConfig config) {
int row = 0;
if (config.getConfigId() != null) {
row = baseMapper.updateById(config);
@@ -127,9 +125,9 @@ public class SysConfigServiceImpl implements ISysConfigService {
.eq(SysConfig::getConfigKey, config.getConfigKey()));
}
if (row > 0) {
RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
return config.getConfigValue();
}
return row;
throw new ServiceException("操作失败");
}
/**
@@ -144,7 +142,7 @@ public class SysConfigServiceImpl implements ISysConfigService {
if (StringUtils.equals(UserConstants.YES, config.getConfigType())) {
throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
}
RedisUtils.deleteObject(getCacheKey(config.getConfigKey()));
CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey());
}
baseMapper.deleteBatchIds(Arrays.asList(configIds));
}
@@ -155,9 +153,8 @@ public class SysConfigServiceImpl implements ISysConfigService {
@Override
public void loadingConfigCache() {
List<SysConfig> configsList = selectConfigList(new SysConfig());
for (SysConfig config : configsList) {
RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
}
configsList.forEach(config ->
CacheUtils.put(CacheNames.SYS_CONFIG, config.getConfigKey(), config.getConfigValue()));
}
/**
@@ -165,8 +162,7 @@ public class SysConfigServiceImpl implements ISysConfigService {
*/
@Override
public void clearConfigCache() {
Collection<String> keys = RedisUtils.keys(CacheConstants.SYS_CONFIG_KEY + "*");
RedisUtils.deleteObject(keys);
CacheUtils.clear(CacheNames.SYS_CONFIG);
}
/**
@@ -194,13 +190,4 @@ public class SysConfigServiceImpl implements ISysConfigService {
return UserConstants.UNIQUE;
}
/**
* 设置cache key
*
* @param configKey 参数键
* @return 缓存键key
*/
private String getCacheKey(String configKey) {
return CacheConstants.SYS_CONFIG_KEY + configKey;
}
}

View File

@@ -2,14 +2,17 @@ package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.dict.utils.DictUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.redis.utils.CacheUtils;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.service.ISysDictDataService;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -88,8 +91,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
for (Long dictCode : dictCodes) {
SysDictData data = selectDictDataById(dictCode);
baseMapper.deleteById(dictCode);
List<SysDictData> dictDatas = baseMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType());
}
}
@@ -99,14 +101,14 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
* @param data 字典数据信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_DICT, key = "#data.dictType")
@Override
public int insertDictData(SysDictData data) {
public List<SysDictData> insertDictData(SysDictData data) {
int row = baseMapper.insert(data);
if (row > 0) {
List<SysDictData> dictDatas = baseMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
return baseMapper.selectDictDataByType(data.getDictType());
}
return row;
throw new ServiceException("操作失败");
}
/**
@@ -115,13 +117,13 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
* @param data 字典数据信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_DICT, key = "#data.dictType")
@Override
public int updateDictData(SysDictData data) {
public List<SysDictData> updateDictData(SysDictData data) {
int row = baseMapper.updateById(data);
if (row > 0) {
List<SysDictData> dictDatas = baseMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
return baseMapper.selectDictDataByType(data.getDictType());
}
return row;
throw new ServiceException("操作失败");
}
}

View File

@@ -5,26 +5,26 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.CacheNames;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StreamUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.dict.utils.DictUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.redis.utils.CacheUtils;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.api.domain.SysDictType;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.SysDictTypeMapper;
import com.ruoyi.system.service.ISysDictTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 字典 业务层处理
@@ -84,17 +84,13 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
* @param dictType 字典类型
* @return 字典数据集合信息
*/
@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
@Override
public List<SysDictData> selectDictDataByType(String dictType) {
List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType);
if (CollUtil.isNotEmpty(dictDatas)) {
return dictDatas;
}
dictDatas = dictDataMapper.selectDictDataByType(dictType);
if (CollUtil.isNotEmpty(dictDatas)) {
DictUtils.setDictCache(dictType, dictDatas);
return dictDatas;
}
return null;
}
@@ -115,6 +111,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
* @param dictType 字典类型
* @return 字典类型
*/
@Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
@Override
public SysDictType selectDictTypeByType(String dictType) {
return baseMapper.selectById(new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getDictType, dictType));
@@ -133,7 +130,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
.eq(SysDictData::getDictType, dictType.getDictType()))) {
throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
}
DictUtils.removeDictCache(dictType.getDictType());
CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType());
}
baseMapper.deleteBatchIds(Arrays.asList(dictIds));
}
@@ -146,9 +143,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
List<SysDictData> dictDataList = dictDataMapper.selectList(
new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getStatus, UserConstants.DICT_NORMAL));
Map<String, List<SysDictData>> dictDataMap = StreamUtils.groupByKey(dictDataList, SysDictData::getDictType);
dictDataMap.forEach((k, v) -> {
dictDataMap.forEach((k,v) -> {
List<SysDictData> dictList = StreamUtils.sorted(v, Comparator.comparing(SysDictData::getDictSort));
DictUtils.setDictCache(k, dictList);
CacheUtils.put(CacheNames.SYS_DICT, k, dictList);
});
}
@@ -157,7 +154,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
*/
@Override
public void clearDictCache() {
DictUtils.clearDictCache();
CacheUtils.clear(CacheNames.SYS_DICT);
}
/**
@@ -175,13 +172,14 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
* @param dict 字典类型信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_DICT, key = "#dict.dictType")
@Override
public int insertDictType(SysDictType dict) {
public List<SysDictData> insertDictType(SysDictType dict) {
int row = baseMapper.insert(dict);
if (row > 0) {
DictUtils.setDictCache(dict.getDictType(), null);
return new ArrayList<>();
}
return row;
throw new ServiceException("操作失败");
}
/**
@@ -190,19 +188,20 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
* @param dict 字典类型信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_DICT, key = "#dict.dictType")
@Override
@Transactional(rollbackFor = Exception.class)
public int updateDictType(SysDictType dict) {
public List<SysDictData> updateDictType(SysDictType dict) {
SysDictType oldDict = baseMapper.selectById(dict.getDictId());
dictDataMapper.update(null, new LambdaUpdateWrapper<SysDictData>()
.set(SysDictData::getDictType, dict.getDictType())
.eq(SysDictData::getDictType, oldDict.getDictType()));
int row = baseMapper.updateById(dict);
if (row > 0) {
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType());
DictUtils.setDictCache(dict.getDictType(), dictDatas);
CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType());
return dictDataMapper.selectDictDataByType(dict.getDictType());
}
return row;
throw new ServiceException("操作失败");
}
/**