【发布时间】:2013-05-20 08:06:03
【问题描述】:
在我的笔记本电脑上,直接设置String 总是比设置byte[] 更好,即使在我使用Jedis 测试时使用Serialization mechanism。我很困惑,如果在调用 jedis set(String, String) 时应该序列化 String?如果Serialization mechanism 发生了,这不是我在下面SerializeUtil 中写的默认机制吗?
我的代码如下:
public void testRedis() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
StringBuilder sb = new StringBuilder(str);
sb.append(i);
jedis.set(sb.toString(), value);
}
long endTime = System.currentTimeMillis();
System.out.println("default: " + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
StringBuilder sb = new StringBuilder(str);
sb.append(i);
jedis.set(sb.toString().getBytes(), value.getBytes());
}
endTime = System.currentTimeMillis();
System.out.println("byte: " + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
StringBuilder sb = new StringBuilder(str);
sb.append(i);
jedis.set(SerializeUtil.serDefaultString(sb.toString()), SerializeUtil.serDefaultString(value));
}
endTime = System.currentTimeMillis();
System.out.println("default ser: " + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
StringBuilder sb = new StringBuilder(str);
sb.append(i);
jedis.set(SerializeUtil.serUTFString(sb.toString()), SerializeUtil.serUTFString(value));
}
endTime = System.currentTimeMillis();
System.out.println("utf ser: " + (endTime - startTime));
}
也许需要SerializeUtil:
public static byte[] serDefaultString(String data) {
byte[] result = null;
ObjectOutputStream oos = null;
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
try {
oos = new ObjectOutputStream(byteArray);
try {
oos.writeObject(data);
oos.flush();
result = byteArray.toByteArray();
} finally {
oos.close();
}
} catch(IOException e) {
e.printStackTrace();
}
return result;
}
public static byte[] serUTFString(String data) {
byte[] result = null;
ObjectOutputStream oos = null;
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
try {
oos = new ObjectOutputStream(byteArray);
try {
oos.writeUTF(data);
oos.flush();
result = byteArray.toByteArray();
} finally {
oos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
谁能告诉我为什么?
将String 操作+ 替换为StringBuilder,现在set(String, String) 仍然比其他方法更快。
另一个问题,在使用set(byte[], byte[]) 时是否有必要将serialize 字符串转换为字节或只调用String.getBytes[] ?
【问题讨论】:
-
谢谢,正在研究,很有帮助!
-
您可以将 Kryo 用于 byte[] 格式化例程...我在笔记本电脑上使用 1000 个并行线程对其进行了测试,并且在单个事务中可能比字符串读/写快 3 倍。
标签: java string performance serialization redis