コード例 #1
0
        private RedisValue[] GetRedisValues(HashEntry[] result)
        {
            var table   = result.ToDictionary(item => item.Name, item => item.Value);
            var columns = objectSerialization.GetColumns();
            var values  = new RedisValue[columns.Length];

            for (var i = 0; i < columns.Length; i++)
            {
                if (table.TryGetValue(columns[i], out var value))
                {
                    values[i] = value;
                }
                else
                {
                    values[i] = RedisValue.Null;
                }
            }

            return(values);
        }
コード例 #2
0
        public IObservable <T> GetRecords(IDatabaseAsync database, IDataKey dataKey, long fromRecord = 0, long toRecord = -1)
        {
            if (database == null)
            {
                throw new ArgumentNullException(nameof(database));
            }

            if (dataKey == null)
            {
                throw new ArgumentNullException(nameof(dataKey));
            }

            var key = link.GetKey(dataKey);

            logger.LogDebug("GetRecords: {0} {1}:{2}", key, fromRecord, toRecord);
            return(Observable.Create <T>(
                       async observer =>
            {
                if (!columnsCache.TryGetValue(typeof(T), out RedisValue[] columns))
                {
                    var subKey = link.GetKey("object");
                    columns = objectSerialization.GetColumns()
                              .Select(item => (RedisValue)($"{subKey}:*->" + item))
                              .ToArray();
                    columnsCache[typeof(T)] = columns;
                }

                var exist = await link.Resilience.AsyncRetryPolicy.ExecuteAsync(
                    async() =>
                    await database.KeyExistsAsync(key).ConfigureAwait(false)).ConfigureAwait(false);

                if (!exist)
                {
                    logger.LogDebug("Key doesn't exist: {0}", key);
                    observer.OnCompleted();
                    return;
                }

                var result = await link.Resilience.AsyncRetryPolicy.ExecuteAsync(
                    async() => await
                    database.SortAsync(
                        key,
                        fromRecord,
                        toRecord,
                        Order.Ascending,
                        SortType.Numeric,
                        "nosort",
                        columns).ConfigureAwait(false))
                             .ConfigureAwait(false);
                if (result.Length % columns.Length != 0)
                {
                    logger.LogError(
                        "Result {0} mismatched with requested number of columns {1}",
                        result.Length,
                        columns.Length);
                    observer.OnCompleted();
                    return;
                }

                var values = objectSerialization.GetInstances(result);
                foreach (var value in values)
                {
                    observer.OnNext(value);
                }

                observer.OnCompleted();
            }));