当我使用jedis,set(byte [],byte [])或set(String,String)时,哪一个性能更好?

时间:2013-05-24 16:37:36

标签: java string performance serialization redis

在我的笔记本电脑上,当我使用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[]字符串到字节?

1 个答案:

答案 0 :(得分:1)

set(byte [],byte [])效率更高,因为当你使用String时,它们在Jedis内部在byte []中转换,然后在通信缓冲区中进行编码。

现在,问题是您在标准库中没有像String一样的廉价byte []格式化例程。使用序列化类来格式化缓冲区太昂贵了。你需要的是byte []的StringBuilder(即带有格式选项的ByteBuilder类)。

这样的事情: https://code.google.com/p/coding4play/source/browse/trunk/Server/src/gameserver/util/ByteBuilder.java?r=63