Redis 批次指令 for .net and golang

Redis 批次指令(batch command) for .net and golang

如果要對 Redis 做批次指令的操作(例:一次要 delete 幾萬個 key),正常都會用批次的方式來進行操作,以減少 redis round trip time。

原本在 .net 裡面的程式寫法,個人常用的是:

var lsTask = new List<Task<bool>>();
var batch = redis.GetInstance(0).CreateBatch();

for(var item in lsItems)
{
	var task = batch.KeyDeleteAsync("key");
	lsTask.Add(task);
}

batch.Execute();

Task.WaitAll(lsTask.ToArray());

但最近在用 golang 實作時,並沒有查到像 .net 一樣的類別庫可以用。所以就間接的查到用 redis pipeline 來實作一樣的接作。

rdb := redis.NewClusterClient(&redis.ClusterOptions{
	Addrs: _redisServer,
})

pipe := rdb.Pipeline()

context := rdb.Context()

for _, v := range ids{
	pipe.Del(context, v)
}

_, err := pipe.Exec(context)

***根據 redis 官網說法,就算是批次送,一批最好也切成10,000個指令就夠了。雖然切成一批10,000跟一次全部全送出去的效率不會差太多,但切成一批10,000對 redis instance 的記憶體負擔比較不會那麼重。

***包成批次送除了 round trip time(RTT) 的減少外,最主要的原因是單次單次送, redis server socket I/O 的負擔會過重。因為 redis 是用 TCP 連線,每送一次指令的連線,就會有一次 socket I/O 的操作。