用bash输出redis协议的故事

大量のデータをredisに流し込む際に、コマンドを送るよりバルクでプロトコル流すと速いので、
http://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/mass-insert.html

尝试用Python编写了一下

def cmd2bulk(*cmd):
    z = lambda x: (len(bytes(str(x), "utf-8")), x)
    return "*%d\r\n%s" % (len(cmd), "".join(["$%d\r\n%s\r\n" % z(x) for x in cmd]))

if __name__ == '__main__':
    import sys
    import unittest

    class TestRedisBulk(unittest.TestCase):

        def test_redis_proto1(self):
            expect = "*3\r\n$3\r\nSET\r\n$6\r\nKEY985\r\n$8\r\nVALUE985\r\n"
            result = cmd2bulk("SET", "KEY985", "VALUE985")
            self.assertEqual(expect, result)

        def test_redis_proto2(self):
            expect = "*5\r\n$4\r\nSADD\r\n$4\r\nhoge\r\n$9\r\nあああ\r\n$6\r\nいい\r\n$3\r\n\r\n"
            result = cmd2bulk("SADD", "hoge", "あああ", "いい", "う")
            self.assertEqual(expect, result)

    unittest.main()

在Bash上也可以做吧不是吗?

function redis_bulk() {
    printf "*%d\r\n" "${#@}"
    for x in "${@}"; do
        printf "$%d\r\n%s\r\n" $(echo -ne "$x" | wc -c) "$x"
    done
}

redis_bulk HMSET "ほげ" foo 123 bar "ばー" | redis-cli --pipe

這個故事。

请注意

bash还没有在实际运营中使用,所以无法确定。

Python的部分可以连续一口气流入大约100万条数据而没有任何问题。
相比于逐条发送命令,这样做速度明显更快。

bannerAds