Skip to content

Instantly share code, notes, and snippets.

@klmallory
Created August 23, 2019 16:43
Show Gist options
  • Save klmallory/da06bd68b5ebef92de72cd4597880c1a to your computer and use it in GitHub Desktop.
Save klmallory/da06bd68b5ebef92de72cd4597880c1a to your computer and use it in GitHub Desktop.
Redis Console Snippet
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