java中cache系统的压缩特性

java中cache系统的压缩特性,java,arrays,string,caching,compression,Java,Arrays,String,Caching,Compression,我正在构建一个缓存,它必须存储尽可能多的数据。CPU不是一个主要问题,因为下一级的数据要比运行一点CPU进行解压缩要昂贵得多 我在寻找一个好的策略,而不是一个完整的实现。应该缓存的典型对象实例可以作为hashmaps列表进行日化。这些映射中的键与该列表中另一个映射中的键非常相似。键和值是字符串 不同缓存对象(这也意味着不同列表)中的映射可能并不总是具有相似的键。可能只有一部分(50%)的键是相同的 我正在考虑将键提取到一个头数组中,并将hashmap的每个值集合提取到另一个长度相同的数组中。这意

我正在构建一个缓存,它必须存储尽可能多的数据。CPU不是一个主要问题,因为下一级的数据要比运行一点CPU进行解压缩要昂贵得多

我在寻找一个好的策略,而不是一个完整的实现。应该缓存的典型对象实例可以作为hashmaps列表进行日化。这些映射中的键与该列表中另一个映射中的键非常相似。键和值是字符串

不同缓存对象(这也意味着不同列表)中的映射可能并不总是具有相似的键。可能只有一部分(50%)的键是相同的

我正在考虑将键提取到一个头数组中,并将hashmap的每个值集合提取到另一个长度相同的数组中。这意味着数据数组可能是稀疏的(空指针)。但我不必随身携带元数据。数据数组中的position是查找正确密钥的唯一方法

现在我想压缩数据数组。压缩在单个数据阵列上无法很好地工作,因为信息很少。它需要将几个数据阵列粘在一起才能获得良好的压缩率

在java中有没有压缩字符串数组的好方法?为了获得好的结果,我应该对这些数据阵列中的多少个进行集群


有没有更好的蟑螂?这是一个收集想法的开放式问题,请随时详细说明:-)

Flyweight可以帮助您

如果不压缩,则可以使用Flyweight模式,以避免在每个对象中重复使用字符串键

请记住,字符串是一个对象,因此hashmap中的键是对它的引用。如果许多具有相同属性的对象使用对同一字符串对象的引用,则每个引用只有4字节,内存中只有一个字符串

如何确保在对象之间共享字符串对象?您可以使用类似于
String.intern()
的东西但请不要使用String.intern()本身

插入字符串就是为相同的字符串值返回相同的字符串对象。必须为这些字符串保留缓存。我不推荐String.intern()的原因是缓存是String类本身,因此它永远不会被释放。但您可以实现类似的功能

如果是新字符串,此代码将返回您自己的字符串。如果不是,则返回第一个

HashMap<String,String> internedStrings = new HashMap<String,String>();

syncrhonized String returnUniqueString(String str) {
   String alreadyCached = internedStrings.get(str);
   if (alreadyCached == null) {
      internedStrings.put(str, str);
      alreadyCached = str;
   }
   return alreadyCached;
}
HashMap internedStrings=newhashmap();
同步化字符串returnUniqueString(字符串str){
String alreadyCached=internedStrings.get(str);
if(alreadyCached==null){
internedStrings.put(str,str);
alreadyCached=str;
}
返回已缓存;
}
但如果您正在压缩,则不

因为压缩意味着您正在序列化对象图,并且每个属性名称将被序列化为不同的字符串,所以会重复自身。可能压缩的大小不会增长太多,因为它是一个重复的字符串,但当您重新偏移对象时,它们将单独创建


也许您可以在重新偏移时使用
returnUniqueString

这听起来是个不错的方法

但是,我建议你考虑将映射值分解成列表的不同方法:而不是为每个映射列表,为每个不同的键列出一个列表,包含每个项目的密钥的值。 例如,如果您的地图是:

1: {
    colour: red,
    size: small,
},
2: {
    colour: blue,
    flavour: strawberry
},
3: {
    colour: red,
    size: large,
    flavour: strawberry
}
然后分解为:

colour: [red, blue, red]
size: [small, null, large]
flavour: [null, strawberry, strawberry]

这似乎有点奇怪,但关键是将同一类型的值聚集在一起,这将有助于提高压缩效率。

也许使用intern字符串作为键就足够了?你能写一点代码来描述你的数据结构吗?这种描述在我的脑海里很难想象。