現在用redis來做數據緩存的越來越多了,很多項目都有初始化redis數據的過程,由於初始化的數據比較大,那么該過程越快越好。這里我們以HashSet方法為例,
這里我們推薦用HashEntry[] hashFields方法傳入多個fields,應為它發送的HMSET指令即批量插入數據,另一個方法發送的HSET指令。
在閱讀StackExchange.Redis里面我確實沒有找到pipe指令,后來發現該指令的實現是:通過CreateBatch方法實現的。源碼的單元測試例子是:
using System; using System.Collections.Generic; using System.Threading.Tasks; using NUnit.Framework; namespace Tests { [TestFixture] public class Batches { [Test] public void TestBatchNotSent() { using (var muxer = Config.GetUnsecuredConnection()) { var conn = muxer.GetDatabase(0); conn.KeyDeleteAsync("batch"); conn.StringSetAsync("batch", "batch-not-sent"); var tasks = new List<Task>(); var batch = conn.CreateBatch(); tasks.Add(batch.KeyDeleteAsync("batch")); tasks.Add(batch.SetAddAsync("batch", "a")); tasks.Add(batch.SetAddAsync("batch", "b")); tasks.Add(batch.SetAddAsync("batch", "c")); Assert.AreEqual("batch-not-sent", (string)conn.StringGet("batch")); } } [Test] public void TestBatchSent() { using (var muxer = Config.GetUnsecuredConnection()) { var conn = muxer.GetDatabase(0); conn.KeyDeleteAsync("batch"); conn.StringSetAsync("batch", "batch-sent"); var tasks = new List<Task>(); var batch = conn.CreateBatch(); tasks.Add(batch.KeyDeleteAsync("batch")); tasks.Add(batch.SetAddAsync("batch", "a")); tasks.Add(batch.SetAddAsync("batch", "b")); tasks.Add(batch.SetAddAsync("batch", "c")); batch.Execute(); var result = conn.SetMembersAsync("batch"); tasks.Add(result); Task.WhenAll(tasks.ToArray()); var arr = result.Result; Array.Sort(arr, (x, y) => string.Compare(x, y)); Assert.AreEqual(3, arr.Length); Assert.AreEqual("a", (string)arr[0]); Assert.AreEqual("b", (string)arr[1]); Assert.AreEqual("c", (string)arr[2]); } } } }
var batch = conn.CreateBatch();這里的batch實際就是管道。真正的執行需要調用 batch.Execute()方法。網上也有類似的文章 redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作