Redis关键用户定义对象与String

时间:2017-07-28 09:38:42

标签: java redis

我想以redis中的UUID作为键存储前缀,但它应该占用更少的内存。哪种方式更好。 以下是不同的方式:

1)新对象(前缀,uuid)

2)concat(前缀+ uuid)。

3)将对象转换为protobuff并将其存储为keyr

3 个答案:

答案 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)

取决于:

  • 如果前缀+ uuid长度很小,比如少于30个字符。使用concat。
  • 否则,对于更长的密钥长度,请使用带有gzip的protobuf(如果需要),例如:
  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