Redis管道Batch操作

发布时间 2023-09-14 11:58:26作者: 蛋蛋十二月

管道Batch操作

private async Task AddTTL()
        {
            var db = RDDB.RedisAgent.Database;
            Stopwatch sp = Stopwatch.StartNew();
            var batch1 = db.CreateBatch();
            for (int i = 0; i < 1000000; i++)
            {
                string key = $"ipcounter:{Guid.NewGuid().ToString()}";
                batch1.StringIncrementAsync(key);
                //batch1.KeyExpireAsync(key,TimeSpan.FromMinutes(60));
            }
            batch1.Execute();
            sp.Stop();
            await Console.Out.WriteLineAsync($"batch  set time: {sp.ElapsedMilliseconds}");
            await Console.Out.WriteLineAsync("执行完成");
        }

插入数据100万耗时:

普通添加

private async Task AddTTL2()
        {
            var db = RDDB.RedisAgent.Database;
            Stopwatch sp = Stopwatch.StartNew();
            for (int i = 0; i < 1000000; i++)
            {
                string key = $"ipcounter:{Guid.NewGuid().ToString()}";
                await db.StringIncrementAsync(key);
                //db.KeyExpireAsync(key, TimeSpan.FromMinutes(60));
            }
            sp.Stop();
            await Console.Out.WriteLineAsync($"set time: {sp.ElapsedMilliseconds}");
            await Console.Out.WriteLineAsync("执行完成");
        }

插入1000条耗时:

由此可知,在插入100万条数据,第一种插入方法是第二种方法的1000倍 (同理删除查询也是)

原理:

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务,大部分耗时时间都是在网络传输这个过程。这意味着通常情况下一个请求会遵循以下步骤:

  • 根据tcp的Request/Response protocol模式

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

  • 服务端处理命令,并将结果返回给客户端。

使用CreateBatch可以在一次请求中执行多个Redis命令,有效减少了网络传输和请求的开销。