我正在实现一个类似缓存的应用程序,该应用程序使用NavigableMap
数据结构来缓存20种不同用户名的文本数据(几百个JSON
字符串)(目前只有两个,最终会扩展到大约20个用户名)。我有7种时间序列缓存/ NavigableMaps
,用于7种不同类型,每种用户名每30分钟刷新一次。然后在服务器线程中,给定类型,时间范围和用户名,我访问相应的NavigableMap
。
当我只有一个用户名时,我分别拥有7个NavigableMap <Long, String>
,而且都很完美。但是为了处理更多用户,我创建了一个父级静态ConcurrentHashMap
,每个键(即用户名)映射到其自己的NavigableMap
,每个缓存都在单独的线程(即20个线程)中完成。全部加到父级HashMap
中。
在添加另一个NavigableMap
数据后,该数据比其他类型的数据更多,并且检索率更高,我 有时 一些奇怪的退休(获取)< / strong>问题,甚至有时ConcurrentHashMap
都不用put
更新。我的猜测是它无法从ConcurrentHashMap
检索数据。
出什么问题了?单个ConcurrentHashMap
数据结构是否对快速检索造成任何问题?其次,同时 PUT 两个不同的键,是否会引起任何问题?
主要定义如下:
public class MyCache {
static ConcurrentHashMap<String, NavigableMap <Long, String>> map1= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map2= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map3= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map4= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map5= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map6= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
static ConcurrentHashMap<String, NavigableMap <Long, String>> map7= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
public static void main(String[] args) throws Exception {
new Server(); //new server thread accessing caches
for (int i =0 ; i< users.length; i++) //cache data for each username
new Caching();
}
}
这里有一个示例PUT
可以同时发生:
MyCache.map1.put(username, new ConcurrentSkipListMap <Long, String> (map1Temp));
这是访问/ GET
部分:
//...
switch (type) {
case "type1":
list = new ArrayList<String>(MyCache.map1.get(username).subMap(start, end).values());
break;
case "type2":
list = new ArrayList<String>(MyCache.map2.get(username).subMap(start, end).values());
break;
// ...
case "type7":
list = new ArrayList<String>(MyCache.map7.get(username).subMap(start, end).values());
break;
//and send the array as text over HTTP