private async Task <TResult> QueryByCacheAsync <T1, T2, T3, TResult>(T1 k1, T2 k2, T3 k3, Func <T1, T2, T3, Task <TResult> > callback, String action) { // 读写分离 if (Strategy != null) { if (Strategy.Validate(this, k1 + "", action)) { return(await ReadOnly.QueryByCacheAsync(k1, k2, k3, callback, action)); } } CheckDatabase(); // 读缓存 var cache = GetCache(); var key = ""; if (cache != null) { var sb = Pool.StringBuilder.Get(); if (!action.IsNullOrEmpty()) { sb.Append(action); sb.Append('#'); } Append(sb, k1); Append(sb, k2); Append(sb, k3); key = sb.Put(true); if (cache.TryGetValue <TResult>(key, out var value)) { return(value); } } Interlocked.Increment(ref _QueryTimes); var rs = await InvokeAsync(k1, k2, k3, callback, action); cache?.Set(key, rs, Expire); return(rs); }