由于连接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连接