1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using StackExchange.Redis; 7 using System.Diagnostics; 8 9 10 namespace HelloRedis 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 var redis = ConnectionMultiplexer.Connect("localhost:6379"); 17 var db = redis.GetDatabase(); 18 19 db.StringSet("mykey", "fuck"); 20 21 Stopwatch sw = new Stopwatch(); 22 sw.Start(); 23 Parallel.For(0, 10000, (i) => { 24 db.StringSet("mykey", i); 25 }); 26 sw.Stop(); 27 Console.WriteLine($"同步api耗时:{sw.ElapsedMilliseconds}"); 28 29 30 sw.Restart(); 31 Parallel.For(0, 10000,async (i) => { 32 await db.StringSetAsync("mykey", i); 33 }); 34 sw.Stop(); 35 Console.WriteLine($"异步api耗时:{sw.ElapsedMilliseconds}"); 36 37 Console.ReadKey(); 38 } 39 } 40 }
是跟redis采用单线程有关吗?还是我用法有误?
又补了两个
Parallel.For(0, 10000,async (i) => { db.StringSetAsync("mykey", i); }); sw.Stop(); Console.WriteLine($"异步api耗时:{sw.ElapsedMilliseconds}"); //并行异步, 不要结果, 这时是21毫秒 for (int i = 0; i <= 10000; i++) { db.StringSet("mykey", i); } sw.Stop(); //for循环同步不要结果301, 要结果就更多一点 for (int i = 0; i <= 10000; i++) { db.StringSetAsync("mykey", i); } sw.Stop(); //for循环异步不要结果, 这种是最快的 只要12毫秒
等待的异步和同步没有区别.只是多了一层调用而已.
异步只是提高了线程的利用率
你的异步方法只有这一句 await db.StringSetAsync("mykey", i); 异步是让当前方法立即返回不阻塞其它语句的执行,但是你这样写就成了没有其它语句需要执行。。。反而因为你的方法是异步的,程序频繁查询db.StringSetAsync是否执行完,浪费更多时间。。不要认为异步就要更快。。异步只是不要让cpu在程序执行IO时等着,而是继续执行接下来的语句。。。不懂这么说你明白了没有。。。
你换成不同的key就知道了。