dotnet / extensions

This repository contains a suite of libraries that provide facilities commonly needed when creating production-ready applications.
MIT License
2.66k stars 755 forks source link

[API Proposal]: Add sliding expiration to `HybridCacheEntryOptions` #5649

Open CoryCharlton opened 4 days ago

CoryCharlton commented 4 days ago

Background and motivation

This is a duplicate of https://github.com/dotnet/aspnetcore/issues/56754 which I believe is in the wrong repo.


Are there any plans to implement a sliding expiration for HybridCacheEntryOptions?

The existing DistributedCacheEntryOptions has a SlidingExpiration property which has been working well for my team and I. We have another mechanism to invalidate cache keys when updates to the underlying data occurs so we like to keep the data in Redis for as long as it is being used and eventually expire when that particular data is not regularly accessed.

Desired Solution

Ideally, the same SlidingExpiration property would be added to HybridCacheEntryOptions and the value would be passed along in ToDistributedCacheEntryOptions and handled in the downstream IDistributedCache calls.


API Proposal

namespace Microsoft.Extensions.Caching.Hybrid;

public sealed class HybridCacheEntryOptions
{
    public TimeSpan? SlidingExpiration { get; set; }
}

API Usage

// Set the sliding expiration
var entryOptions = new HybridCacheEntryOptions
{
    SlidingExpiration = TimeSpan.FromMinutes(5)
};

Risks

At first glance the risk involved here is implementing this in a manner that does not negate the performance benefits provided by using HybridCache.

For instance if a cache request hits the local MemoryCache it's expiration would get updated but the entry in the IDistributedCache would not.

mvxproject commented 3 days ago

In the case when we get the cache from MemoryCache we can refresh the distributed cache before returning the value.

_backendCache.RefreshAsync(key, token);