用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万条数据而没有任何问题。
相比于逐条发送命令,这样做速度明显更快。