我想以redis中的UUID作为键存储前缀,但它应该占用更少的内存。哪种方式更好。 以下是不同的方式:
1)新对象(前缀,uuid)
2)concat(前缀+ uuid)。
3)将对象转换为protobuff并将其存储为keyr
答案 0 :(得分:3)
Redis keys是二进制安全的。因此,最好存储UUID的直接字节,而不是UUID的字符串表示字节。 UUID是16个字节,假设您的前缀是4个字节。这就是你的方法脱颖而出的方法:
1)新对象(前缀,uuid):这将创建一个java对象,但是在存储时,它将存储对象的序列化形式,这将远远超过UUID +前缀字节
2)concat(前缀+ uuid):这是理想的方法,但你不必以字符串形式附加前缀和uuid。 取一个字节数组,其前N个字节用作前缀,接下来的128位(16字节)用于UUID。 Redis键是二进制安全的,因此您的字节数组成为键。这是最节省内存的方法
3)将对象转换为protobuff并将其存储为密钥:这也将存储序列化格式,并添加protobuf中提供的数据类型信息,因此不如2的内存效率。
最好的方法是(2),字节连接和存储为字节数组键。
答案 1 :(得分:2)
取决于:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzipOut = new GZIPOutputStream(baos); ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut); // Serialise object. objectOut.writeObject(prefix+uuid); gzipOut.flush(); gzipOut.close(); // save this byte[] as key baos.toByteArray();
答案 2 :(得分:1)
将密钥名称大小的字节记帐很重要 - 尽可能缩短密码。
也就是说,请记住,Redis中的每个键都有一个开销(在实际的键名和值之上)。虽然确切的开销取决于体系结构和版本,但拥有大量密钥意味着很多开销。正如https://redis.io/topics/memory-optimization#using-hashes-to-abstract-a-very-memory-efficient-plain-key-value-store-on-top-of-redis
所述,使用Hashes的常见方法之一就是使用Hashes