Created
August 23, 2019 16:43
-
-
Save klmallory/da06bd68b5ebef92de72cd4597880c1a to your computer and use it in GitHub Desktop.
Redis Console Snippet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void TestRedisClusterGets() | |
{ | |
var cacheCon = ConnectionMultiplexer.Connect("10.100.1.80:6379,10.100.1.81:6379,10.100.1.82:6379"); | |
var sw = new Stopwatch(); | |
Console.WriteLine($"Getting all keys {sw.ElapsedMilliseconds}ms"); | |
var keys = cacheCon.GetDatabase().HashGetAll("KeyLookup").Select(s => $"KeyFormat_{s.Value}")); | |
Console.WriteLine($"All keys retreived {sw.ElapsedMilliseconds}ms"); | |
var rnd = new Random(); | |
//Sync | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = keys.Skip((int)i * 30).Take(30); | |
var swp = new Stopwatch(); | |
//var tasks = new List<Task<RedisValue>>(); | |
swp.Start(); | |
foreach (var k in k30) | |
{ | |
cacheCon.GetDatabase().StringGet(k); | |
} | |
Console.WriteLine($"Sync in {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
}); | |
//Semi Sync | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = keys.Skip((int)i * 30).Take(30); | |
var swp = new Stopwatch(); | |
//var tasks = new List<Task<RedisValue>>(); | |
swp.Start(); | |
Parallel.ForEach(k30, k => | |
{ | |
cacheCon.GetDatabase().StringGet(k); | |
}); | |
Console.WriteLine($"Semi Sync Batch in {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
}); | |
//Async / Pipeline | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = keys.Skip((int)i * 30).Take(30); | |
var swp = new Stopwatch(); | |
var tasks = new List<Task<RedisValue>>(); | |
swp.Start(); | |
foreach (var k in k30) | |
{ | |
tasks.Add( | |
cacheCon.GetDatabase().StringGetAsync(k) | |
); | |
} | |
Console.WriteLine($"All keys requested {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
var prods = Task.WhenAll(tasks); | |
prods.Wait(); | |
Console.WriteLine($"Async Pipeline in {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
}); | |
//Batch | |
var kGroup = keys.Skip(10000).Take(3000); | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = kGroup.Skip(rnd.Next(0, 2960)).Take(30); | |
var swp = new Stopwatch(); | |
var tasks = new List<Task<RedisValue>>(); | |
swp.Start(); | |
var b = cacheCon.GetDatabase().CreateBatch(); | |
foreach (var k in k30) | |
{ | |
tasks.Add( | |
b.StringGetAsync(k) | |
); | |
} | |
b.Execute(); | |
Console.WriteLine($"All keys requested {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
b.WaitAll(tasks.ToArray()); | |
Console.WriteLine($"Batch Async completed in {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
}); | |
//Async With Serialization | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = kGroup.Skip(rnd.Next(0, 2960)).Take(30); | |
var swp = new Stopwatch(); | |
var tasks = new List<Task<Stuff>>(); | |
swp.Start(); | |
foreach (var k in k30) | |
{ | |
tasks.Add( | |
cacheCon.GetDatabase().StringGetAsync(k).ContinueWith(v => v.Result.ToString() != null ? JsonConvert.DeserializeObject<Stuff>(v.Result.ToString()) : default) | |
); | |
} | |
Console.WriteLine($"All keys requested {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
var prods = Task.WhenAll(tasks); | |
prods.Wait(); | |
Console.WriteLine($"Aysnc With Deserialization in {swp.ElapsedMilliseconds}ms on Thread {Thread.CurrentThread.ManagedThreadId}"); | |
}); | |
//Read Through Cache Test | |
var mco = new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromMinutes(1)}; | |
var mc = new Microsoft.Extensions.Caching.Memory.MemoryCache | |
(Microsoft.Extensions.Options.Options.Create<MemoryCacheOptions>(mco)); | |
var mcp = new Polly.Caching.Memory.MemoryCacheProvider(mc); | |
cachePolicy = Polly.Caching.CachePolicy.CacheAsync<Stuff> | |
(mcp, | |
new RelativeTtl(TimeSpan.FromMinutes(7)), | |
new DefaultCacheKeyStrategy(), | |
(ctx, s) => { }, //Console.WriteLine($"Memory Cache Hit {s}"), | |
(ctx, s) => { }, // (ctx,s) => null, | |
(ctx, s) => { }, //Console.WriteLine($"Saving this for later {s}"), | |
onCachePutError: (ctx, s, e) => Console.WriteLine($"Error caching {s}, {e}"), | |
onCacheGetError: (ctx, s, e) => Console.WriteLine($"Error getting {s}")); | |
//Async With Serialization And Polly / Memcache wrapper. | |
Parallel.For(0, 200, (i, o) => | |
{ | |
var k30 = kGroup.Skip(rnd.Next(0, 2960)).Take(30); | |
var swp = new Stopwatch(); | |
var tasks = new List<Task<Stuff>>(); | |
swp.Start(); | |
foreach (var k in k30) | |
{ | |
tasks.Add( | |
cachePolicy.ExecuteAsync(ctx => | |
GetProdAsync(ctx) | |
, new Context(k))); | |
} | |
Console.WriteLine($"All keys requested {swp.ElapsedMilliseconds}ms"); | |
var prods = Task.WhenAll(tasks); | |
prods.Wait(); | |
Console.WriteLine($"Async with Cache in {swp.ElapsedMilliseconds}ms"); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment