在我的笔记本电脑上,当我使用String
进行测试时,直接设置byte[]
总是比设置Serialization mechanism
更好,即使使用Jedis
也是如此。我很困惑,如果在调用jedis String
时应该序列化set(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)
仍然比其他方法更快。
另一个问题,使用serialize
或只调用set(byte[], byte[])
时,是否需要String.getBytes[]
字符串到字节?
答案 0 :(得分:1)
set(byte [],byte [])效率更高,因为当你使用String时,它们在Jedis内部在byte []中转换,然后在通信缓冲区中进行编码。
现在,问题是您在标准库中没有像String一样的廉价byte []格式化例程。使用序列化类来格式化缓冲区太昂贵了。你需要的是byte []的StringBuilder(即带有格式选项的ByteBuilder类)。