JAVA本地缓存快速查询:使用分组思想
温馨提示:
本文最后更新于 2025年01月24日,已超过 426 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
- 由于项目的应急需要,应用程序需要预先加载4800万白名单数据,为了达到快速查询的目标,使用了
分库分表的思路。 - 4800万数据根据白名单计算出hash值,使用设定好的分组数取模,将数据以
CurrentHashMap<String, List<Object>>的方式进行存储,满足线程安全,同时满足分组后的高效查询 - 具体实现如下:
package com.gdsz.tools;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StringHashGrouping {
public static void main(String[] args) {
// 模拟4800万元素的字符串List
List<String> largeList = new ArrayList<>();
for (int i = 0; i < 48000000; i++) {
largeList.add("String_" + i);
}
int groupCount = 3000;
Map<Integer, List<String>> groupMap = hashGrouping(largeList, groupCount);
// 测试查询效率
for (int j=190000; j<200000; j++) {
long startTime = System.currentTimeMillis();
String str = "String_" + j;
int hash = Math.abs(str.hashCode()) % groupCount;
System.out.println("查询结果:" + groupMap.get(hash).get(100));
long endTime = System.currentTimeMillis();
System.out.println("查询耗时: " + (endTime - startTime) + "ms");
}
}
public static Map<Integer, List<String>> hashGrouping(List<String> list, int groupCount) {
Map<Integer, List<String>> groupMap = new HashMap<>();
for (String str : list) {
int hash = Math.abs(str.hashCode()) % groupCount;
groupMap.putIfAbsent(hash, new ArrayList<>());
groupMap.get(hash).add(str);
}
return groupMap;
}
}
- 运行结果:
查询结果:String_331141
查询耗时: 0ms
查询结果:String_311045
查询耗时: 0ms
查询结果:String_230127
查询耗时: 0ms
查询结果:String_222109
查询耗时: 0ms
正文到此结束
- 本文标签: Java
- 本文链接: https://t-leader.cn/article/5
- 版权声明: 本文由站长原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权