/// <summary>
 /// Add an item to the store (or update it)
 /// </summary>
 /// <param name="key">The <see cref="StoreKey"/>.</param>
 /// <param name="eTag">The <see cref="ValidatorValue"/>.</param>
 /// <returns></returns>
 public Task SetAsync(StoreKey key, ValidatorValue eTag)
 {
     // store the validator value
     _store[key.ToString()] = eTag;
     // save the key itself as well, with an easily searchable stringified key
     _storeKeyStore[key.ToString()] = key;
     return(Task.FromResult(0));
 }
Beispiel #2
0
        public async Task SetAsync(StoreKey key, ValidatorValue eTag)
        {
            if (!ShouldCacheValue(key.Values.FirstOrDefault()))
            {
                return;
            }

            if (_redis == null)
            {
                _logger.LogError("Cannot find Redis database to set the storekey");
                return;
            }

            var db = _redis.GetDatabase();

            var hashValues = new []
            {
                ETagKey, eTag.ETag.Value,
                ETagTypeKey, eTag.ETag.ETagType.ToString(),
                LastModifiedKey, eTag.LastModified.ToString("O", CultureInfo.InvariantCulture),
                SetByRegistryKey, false.ToString(CultureInfo.InvariantCulture)
            };

            await db.ScriptEvaluateAsync(HmsetnxScript,
                                         new RedisKey[] { key.ToString() },
                                         Array.ConvertAll(hashValues, value => (RedisValue)value),
                                         CommandFlags.FireAndForget);
        }
Beispiel #3
0
        public async Task <ValidatorValue> GetAsync(StoreKey key)
        {
            if (!ShouldCacheValue(key.Values.FirstOrDefault()))
            {
                return(null);
            }

            _logger.LogDebug("Checking Redis for key '{key}'", key.ToString());

            if (_redis == null)
            {
                _logger.LogError("Cannot find Redis database to get the storekey");
                return(null);
            }

            var db = _redis.GetDatabase();

            var redisValues =
                await db.HashGetAsync(key.ToString(), new RedisValue[] { ETagKey, ETagTypeKey, LastModifiedKey, SetByRegistryKey }, CommandFlags.PreferReplica);

            if (redisValues.Length != 4 ||
                redisValues[0].IsNullOrEmpty ||
                redisValues[1].IsNullOrEmpty ||
                redisValues[2].IsNullOrEmpty ||
                redisValues[3].IsNullOrEmpty)
            {
                return(null);
            }

            var setByRegistry = bool.Parse(redisValues[3].ToString());

            if (!setByRegistry)
            {
                return(null);
            }

            var eTag     = redisValues[0].ToString();
            var eTagType = Enum.Parse <ETagType>(redisValues[1].ToString(), true);

            var lastModified = DateTimeOffset.ParseExact(
                redisValues[2].ToString(),
                "O",
                CultureInfo.InvariantCulture);

            return(new ValidatorValue(new ETag(eTagType, eTag), lastModified));
        }
 /// <summary>
 /// Remove an item from the store
 /// </summary>
 /// <param name="key">The <see cref="StoreKey"/>.</param>
 /// <returns></returns>
 public Task <bool> RemoveAsync(StoreKey key)
 {
     _storeKeyStore.TryRemove(key.ToString(), out _);
     return(Task.FromResult(_store.TryRemove(key.ToString(), out _)));
 }
 public Task <ValidatorValue> GetAsync(StoreKey key) => GetAsync(key.ToString());
 public Task SetAsync(StoreKey key, ValidatorValue eTag) => SetAsync(key.ToString(), eTag);