原创

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
正文到此结束
本文目录