为什么redis连接异常,从MySQL获取的数据不能返回前端页面

@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);
    }

大概知道什么问题,如果需要紧急解决的话,可以私聊吗