@Slf4j
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
@Transactional(rollbackFor = {Exception.class})
@Override
public void importData(InputStream inputStream) {
EasyExcel.read(inputStream, ExcelDictDTO.class, new ExcelDictDTOListener(baseMapper)).sheet().doRead();
log.info("Excel导入成功");
}
@Override
public List<ExcelDictDTO> listDictData() {
List<Dict> dictList = baseMapper.selectList(null);
//创建ExcelDictDTO列表,将Dict列表转换成ExcelDictDTO列表
ArrayList<ExcelDictDTO> excelDictDTOList = new ArrayList<>(dictList.size());
dictList.forEach(dict -> {
ExcelDictDTO excelDictDTO = new ExcelDictDTO();
BeanUtils.copyProperties(dict, excelDictDTO);
excelDictDTOList.add(excelDictDTO);
});
return excelDictDTOList;
}
@Override
public List<Dict> listByParentId(Long parentId) {
log.info("从MySQL数据库中获取数据列表");
QueryWrapper<Dict> dictQueryWrapper = new QueryWrapper<>();
dictQueryWrapper.eq("parent_id", parentId);
List<Dict> dictList = baseMapper.selectList(dictQueryWrapper);
//返回数据列表
return dictList;
}
}
图上代码运行
从mysql数据库中获取列表
正确返回到前端页面
引入redis
在直接从MySQL数据库获取列表前写入代码try..catch代码段
try {
//首先查询redis中是否存在数据列表
List<Dict> dictList = (List<Dict>)redisTemplate.opsForValue().get("srb:core:dictList:" + parentId);
if(dictList != null){
//如果存在则从redis中直接返回数据列表
log.info("从redis中获取数据列表");
return dictList;
}
} catch (Exception e) {
log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));
}
完整代码
@Slf4j
@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
@Resource
private RedisTemplate redisTemplate;
@Transactional(rollbackFor = {Exception.class})
@Override
public void importData(InputStream inputStream) {
EasyExcel.read(inputStream, ExcelDictDTO.class, new ExcelDictDTOListener(baseMapper)).sheet().doRead();
log.info("Excel导入成功");
}
@Override
public List<ExcelDictDTO> listDictData() {
List<Dict> dictList = baseMapper.selectList(null);
//创建ExcelDictDTO列表,将Dict列表转换成ExcelDictDTO列表
ArrayList<ExcelDictDTO> excelDictDTOList = new ArrayList<>(dictList.size());
dictList.forEach(dict -> {
ExcelDictDTO excelDictDTO = new ExcelDictDTO();
BeanUtils.copyProperties(dict, excelDictDTO);
excelDictDTOList.add(excelDictDTO);
});
return excelDictDTOList;
}
@Override
public List<Dict> listByParentId(Long parentId) {
//引入redis
try {
//首先查询redis中是否存在数据列表
List<Dict> dictList = (List<Dict>)redisTemplate.opsForValue().get("srb:core:dictList:" + parentId);
if(dictList != null){
//如果存在则从redis中直接返回数据列表
log.info("从redis中获取数据列表");
return dictList;
}
} catch (Exception e) {
log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));
}
//如果不存在则查询MySQL数据库
log.info("从数据库中获取数据列表");
QueryWrapper<Dict> dictQueryWrapper = new QueryWrapper<>();
dictQueryWrapper.eq("parent_id", parentId);
List<Dict> dictList = baseMapper.selectList(dictQueryWrapper);
//返回数据列表
return dictList;
}
}
在redis连接状态下无任何异常
控制台获取到列表,返回前端页面
但我最大疑问是断开redis,控制台也是能获取到列表但就是无法返回前端页面
前端页面
请问要怎样引入redis即使断开连接情况下前端网页不受影响。redis能用就用,不能用直接从MySQL取
本人刚接触不久,还望各位耐心指点迷津
检查redis连接 应该像检查数据库连接一样写
你要改成手动去创建 redisTemplate,或者说要手动去连接 redis。如果自动连接 redis 的话,如果启动没有连接成功,就会抛出异常,启动就失败了。
看看是不是请求超时了,你控制台这边可以打印出来mysql的内容,那逻辑部分是通的,你debug也是可以走完当前方法的。然后前端没显示,你浏览器按F12看看发出的那个请求是不是响应超时,导致根本没接到数据。因为你逻辑中级引入了redis,他链接不上的话会有几秒钟的耗时
1.查看RedisTemplate 是否注入---即查看redis的配置是否是正确的------根据异常信息来看,redis没有连接成功
不知道你redis 是部署在本地还是服务器,可以先用redis可视化工具连接试一下能不能连接成功,成功:则redis没问题是代码配置的问题。失败:看服务器上redis是否启动,配置是否正确,服务器的端口是否开放
@Resource
private RedisTemplate redisTemplate;
redisTemplate是spring容器启动时加载的,你的异常捕获只能处理业务异常,这个报错是redisTemplate创建时异常。可以在try中手动创建 redisTemplate。
public static void main(String[] args) {
//单机模式
RedisStandaloneConfiguration rsc = new RedisStandaloneConfiguration();
rsc.setPort(6379);
rsc.setPassword("ivory");
rsc.setHostName("192.168.100.81");
//集群模式
RedisClusterConfiguration rcc = new RedisClusterConfiguration();
rcc.setPassword("123456");
List<RedisNode> nodes = Collections.singletonList(new RedisNode("192.168.1.1", 6379));
rcc.setClusterNodes(nodes);
RedisTemplate<String, String> template = new RedisTemplate<>();
//单机模式
JedisConnectionFactory fac = new JedisConnectionFactory(rsc);
//集群模式
//JedisConnectionFactory fac = new JedisConnectionFactory(rcc);
fac.afterPropertiesSet();
template.setDefaultSerializer(new StringRedisSerializer());
template.setConnectionFactory(fac);
template.afterPropertiesSet();
ValueOperations<String, String> op = template.opsForValue();
final String key = "123_tmp";
final String value = "abc";
template.delete(key);
op.set(key, value);
assert Objects.equals(op.get(key), value);
}
大概知道什么问题,如果需要紧急解决的话,可以私聊吗