更新缓存操作
需求分析:
问题描述:
并发操作redis,发现redis连接数增长异常(呈直线上升)
原因分析:
发现redis更新时,没有处理好之前的连接缓存,而是直接替换,导致旧的缓存没有及时删除。
修改方案:
1.更新时,先关闭之前的连接,再替换
2.只更新redis配置修改的连接
update:
比较(ip,password,timeOut)的hash,不一致则更新。
dele:差集 old-new=dele
add:差集 new-old=add
3.考虑连接正在使用的情况
需求分析: 问题描述: 并发操作redis,发现redis连接数增长异常(呈直线上升) 原因分析: 发现redis更新时,没有处理好之前的连接缓存,而是直接替换,导致旧的缓存没有及时删除。 修改方案: 1.更新时,先关闭之前的连接,再替换 2.只更新redis配置修改的连接 update: 之前的连接: 比较(ip,password,timeOut)的hash,不一致则更新。 dele:差集 old-new=dele add:差集 new-old=add 3.考虑连接正在使用的情况 操作连接池,先关闭连接,再更新配置,创建新连接 代码实现 ~~~java Map oldServiceMap; Map nowConfigHashMap = new HashMap(); for(){ // 遍历获取原始数据 // 生成(ip,password,timeOut)的hash nowConfigHashMap.put(toHash(ip,password,timeOut),obj); // } // 历史数据处理 1.确定key([url+password+timeOut]) 2.如何保证更新过度 // 集合操作,过滤掉不需要更新的数据 oldServiceMap.getKey(); nowConfigHashMap.getKey(); update: dele:差集 old-new=dele nowConfigHashMap.getKey().stream().filter(item -> !oldServiceMap.getKey().stream().map(e -> e.getGoodsId()).collect( Collectors.toList()).contains(item.getGoodsId())).collect(Collectors.toList()); add:差集 new-old=add ~~~ ~~~java public static List<T> aa(List<T> list1, List<T> list2) { Set<T> set2 = new HashSet<>(list2); List<T> result = new ArrayList<>(); list1.stream().forEach(e -> { if (!set2.contains(e)) { result.add(e); } }); return result; } ~~~