Redis中基于依赖的缓存项失效?

在Redis中,是否有一种本地方法可以在从缓存中移除其他指定项时使缓存项无效?是否有基于依赖关系的驱逐策略?

以下是我想要实现的示例。

假设在Redis中,我们有一个缓存项,其键是mainKey。如果另一个特定项被移除,我想让该项自动移除。例如,如果mainKey依赖于键d1d2,那么只要从缓存中移除了其中之一,我就想要将mainKey从缓存中移除。

例如,在.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"));
}
点赞
用户3632172
用户3632172

这是缓存失效中已知的障碍,你需要缓存标记来克服它。

例如,如果主键(mainKey)依赖于键d1和d2,那么每当从缓存中删除d1或d2之一时,我希望主键(mainKey)也立即从缓存中删除。

TL;DR- 你需要给彼此依赖的键打标记,当它们中的某个键发生某些操作(更新或删除)时,你需要删除所有共享相同标记的缓存项。

2021-03-29 13:24:26