服务在多次请求后处于死机状态 可能解决办法

由于连接redis未手动关闭连接导致后续服务连接等待BUG 服务处于暂停状态

 // 先根据角色查商品类目Id
        List<Long> roleIds = userRoleMapper.queryByAccountId(accountId, platformId);
 
        HashMap<Long, JedisPool> jedisPoolContext = this.redisConfig.getJedisPoolContext();
        JedisPool pool = jedisPoolContext.get(platformId);
        Jedis jedis = pool.getResource();

        if (null != roleIds) {
       // 获取缓存中存在的数据
                List<Long> roleIdNoInCache = new ArrayList<>();
                roleIds.forEach(roleId -> {
                            String redisRoleKey = RedisKeyEnum.REDIS_CATEGORY_ID_BY_ROLE_PREFIX.getKey() + roleId;
                            String catJsonString = jedis.get(redisRoleKey);
                            if (null != catJsonString && !catJsonString.isEmpty()) {// 如果redis中存在缓存信息
                                Set<Long> categoryCacheId = JSON.parseObject(catJsonString, new TypeReference<Set<Long>>() {
                                });
                                categoryIds.addAll(categoryCacheId);
                            } else { // 缓存中不存在数据则查数据库 收集最后一起查询数据库
                                roleIdNoInCache.add(roleId);
                            }
                        }
                );

                log.info("缓存不存在缓存的角色缓存categoryId ={}", roleIdNoInCache);
                if (!roleIdNoInCache.isEmpty()) {// 去数据库一次性查找缓存中不存在的categoryId
                    Set<RoleCategoryResultVo> categoryDataS = roleCategoryMapper.queryForCategoryIdByRoleIds(platformId, roleIdNoInCache);

                    // 将数据暂存缓存中
                    Map<Long, List<RoleCategoryResultVo>> longListMap = categoryDataS.stream().collect(Collectors.groupingBy(RoleCategoryResultVo::getRoleId));
                    longListMap.forEach((roleId, roleCategoryResultVos) -> {
                        Set<Long> catId = roleCategoryResultVos.stream().map(RoleCategoryResultVo::getCategoryId).collect(Collectors.toSet());
                        // 加入返回的categoryIds
                        categoryIds.addAll(catId);
                        // 写入缓存
                        jedis.setex(RedisKeyEnum.REDIS_CATEGORY_ID_BY_ROLE_PREFIX.getKey() + roleId, 86400, JSON.toJSONString(catId));
                    });
                
            } 

在这代码中由于获取redis连接后 未能在最后关闭redis连接 导致连接一直存在 才导致系统直接死机

解决方法:手动关闭redis连接

 public String get(Long platformId, String key) {
        Jedis jedis = null;
        HashMap<Long, JedisPool> jedisPoolContext = null;
        JedisPool pool = null;

        String var6;
        try {
            jedisPoolContext = this.redisConfig.getJedisPoolContext();
            pool = (JedisPool)jedisPoolContext.get(platformId);
            jedis = pool.getResource();
            var6 = jedis.get(key);
        } catch (JedisException var11) {
            LOG.error("平台id:" + platformId + ",get error, key:" + key, var11);
            throw RedisException.REDIS_GET_FAIL.newInstance("platformId:{%s},get error, key:{%s},error:{%s}", new Object[]{platformId, key, var11.getMessage()});
        } catch (Exception var12) {
            LOG.error("redis error", var12);
            throw RedisException.REDIS_NOT_CONNECT;
        } finally {
            if (jedis != null) {
                jedis.close();
            }

        }

        return var6;
    }

TIPS:最好自己封装好redis的操作类或者使用框架做redis操作,以免忘记关闭redis连接

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值