Ejemplo n.º 1
0
        private TResult QueryByCache <T1, T2, T3, TResult>(T1 k1, T2 k2, T3 k3, Func <T1, T2, T3, TResult> callback, String action)
        {
            // 读写分离
            if (Strategy != null)
            {
                if (Strategy.Validate(this, k1 + "", action))
                {
                    return(ReadOnly.QueryByCache(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 = Invoke(k1, k2, k3, callback, action);

            cache?.Set(key, rs, Expire);

            return(rs);
        }