Redis: аннулирование элемента кэша на основе зависимостей? - PullRequest
0 голосов
/ 24 апреля 2020

Есть ли в Redis собственный способ аннулировать элемент кэша, когда другие указанные элементы удаляются из кэша? Существует ли политика выселения, основанная на зависимостях?

Вот пример того, что я хочу выполнить sh.

Допустим, в Redis у нас есть элемент кэша, ключ которого равен mainKey . Я хотел бы, чтобы этот элемент был автоматически удален, если удаляется другой указанный c элемент. Если, например, mainKey имеет зависимости от ключей d1 и d2 , то я бы хотел удалить mainKey из кэша как только d1 или d2 удаляется из кэша.

In. Net, например, что-то вроде этого довольно легко кодировать с помощью MemoryCache .

[TestMethod]
public void TestCacheItemIsRemovedWhenADependencyGetsRemoved() {
    // ARRANGE

    var cache = new MemoryCache(name: "MyCache");

    // insert dependencies cache items
    var dummyValue = 1;
    cache.Set("d1", dummyValue, absoluteExpiration: DateTime.Now.AddDays(1));
    cache.Set("d2", dummyValue, absoluteExpiration: DateTime.Now.AddDays(1));

    // build cache policy for main cache item
    var policy = new CacheItemPolicy {
        SlidingExpiration = TimeSpan.FromMinutes(10)
    };
    var dependencies = new[] { "d1", "d2" };
    var changeMonitor = cache.CreateCacheEntryChangeMonitor(dependencies);
    policy.ChangeMonitors.Add(changeMonitor);

    // insert main cache item
    cache.Set("mainKey", "this is the main value", policy);

    // ACT

    // remove a dependency key
    cache.Remove("d1");

    // ASSERT

    // mainKey is removed as a consequence of removing "d1"
    Assert.IsFalse(cache.Contains("mainKey"));
    // only "d2" remains in the cache
    Assert.AreEqual(1, cache.GetCount());
    Assert.IsTrue(cache.Contains("d2"));
}
...