Pdsr.Cache.InMemory 4.0.0

dotnet add package Pdsr.Cache.InMemory --version 4.0.0
                    
NuGet\Install-Package Pdsr.Cache.InMemory -Version 4.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Pdsr.Cache.InMemory" Version="4.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Pdsr.Cache.InMemory" Version="4.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Pdsr.Cache.InMemory" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Pdsr.Cache.InMemory --version 4.0.0
                    
#r "nuget: Pdsr.Cache.InMemory, 4.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Pdsr.Cache.InMemory@4.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Pdsr.Cache.InMemory&version=4.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Pdsr.Cache.InMemory&version=4.0.0
                    
Install as a Cake Tool

Pdsr Cache Helper

NuGet version (Pdsr.Cache)

A helper library (wrapper) for caching with Redis, MSSQL, ...

What is it?

I have started building several libraries to keep up with the DRY principle, one of them was this lib, helping me to use cache systems.

The first goal this library is keeping Cache requests in one go so I don't have to check if the cache exists, if the cache time has passed, etc.

Getting Started

you need to install the package, add to DI and then use it in services.

  1. install the package dotnet add package Pdsr.Cache.Redis for Redis.
  2. Add the RedisCacheManager to DI through the extension AddRedisCacheManager(c => { c.EndPoints = ["my-redis:6379"]; c.KeyPrefix = "my-app:"; })
  3. Instantiate the ICacheManager in your controller or service.
  4. Use any of the Get,Set, ... methods. Async or Sync.
public class MyClass
{
    private readonly ICacheManager _cache;
    public MyClass(ICacheManager cache) => _cache = cache;

    public async Task SomeMethod(CancellationToken cancellationToken = default)
    {
        var results = await _cache.GetAsync<SomeModel>(
            "some-key" , // cache key identifier
            async () => // Func<Task<T>> to produce something
            {
                var model = new SomeModel(); // produce something time consuming
                return model;
            },
            60, // cache time
            cancellationToken);

        return results;
    }
}

Reading a value that may be missing

Use TryGet/TryGetAsync instead of IsSet followed by Get. The two-step version can race with expiry, and Get returns default on a miss, so a cached false and "not cached" look the same.

var cached = await _cache.TryGetAsync<bool>($"access:{userId}", cancellationToken);
if (cached.HasValue)
    return cached.Value;

When Redis is down

Reads, writes and IsSet throw (RedisConnectionException or RedisTimeoutException) instead of reporting a miss. The read-through overloads that take an acquire delegate fall back to it and return a correct, uncached value.

Cancellation

Every async method takes a CancellationToken. Cancelling it stops the caller waiting and throws OperationCanceledException, but it can't recall a command that was already sent to Redis or SQL Server. That command may still run, so a cancelled SetAsync or RemoveAsync can still write or delete the key. A token that is already cancelled is rejected before anything is sent.

Sharing a Redis server

Set KeyPrefix so each application has its own keyspace. With a prefix, Clear and RemoveByPattern only touch that application's keys. Without one, Clear refuses to run FLUSHDB unless AllowFlushDatabase is set.

Upgrading to 4.0

4.0 is a breaking release:

  • ISyncCacheManager.TryGet and IAsyncCacheManager.TryGetAsync were added; custom implementations must add them.
  • Redis outages now throw instead of returning default/false (see above).
  • IRedisConnectionFactory returns IConnectionMultiplexer, adds ConnectionAsync, and owns the connection; disposing a cache manager no longer closes it.
  • RedisConfiguration: obsolete Host/Port removed; UseCallingAssemblyNameAsClientName renamed to UseEntryAssemblyNameAsClientName; RetryCount, Database, KeyPrefix and AllowFlushDatabase added. Host names are no longer resolved to fixed IPs at startup.
  • Redis Clear no longer flushes the database by default.
  • Set<T>(key, data, TimeSpan? expiry) no longer has a default for expiry; the Redis Get/GetAsync preferReplica parameter is now required.
  • Redis sets: RemoveFromSetItemAsync is now RemoveFromSetAsync and also deletes the item; GetSetLength is now GetSetLengthAsync; GetSetItemsAsync leaves out expired items.
  • A zero or negative cache time now means "don't cache" in every provider.
  • InMemoryCacheConfig.MaxEnteriesCount is now MaxEntriesCount; in-memory patterns use Redis glob syntax instead of regex.
  • SqlCacheManager.RemoveByPattern/Clear throw NotSupportedException.
  • DI extension classes were renamed (RedisServiceCollectionExtensions, …); the extension methods themselves are unchanged except that the Redis service lifetime parameters were removed (everything is a singleton).
  • Removed: Pdsr.Cache.Polly, ICacheManagerExtended and RedisCacheManagerExtended, and the non-generic Set/SetAsync/Get overloads.

Contribute

Please refer to contribute. Some parts definitely needs help.

Documents

Under Creation.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.0 0 10/6/2026
4.0.0-beta.4 0 10/6/2026
4.0.0-beta.3 0 10/6/2026
4.0.0-beta.2 2 10/6/2026
4.0.0-beta.1 21 10/6/2026
3.6.0 694 2/13/2025
3.5.1 310 10/9/2024
3.5.1-beta.1 137 10/9/2024
3.5.0 374 2/20/2024
3.3.1 296 8/26/2023
3.3.0 727 7/18/2023
3.2.1 425 2/20/2023
3.2.0 537 11/11/2022
3.1.8 624 9/13/2022
3.0.7 606 8/25/2022
3.0.6 626 6/21/2022
3.0.5 679 5/11/2022
3.0.4 640 4/18/2022
3.0.3 656 4/18/2022
3.0.2 646 4/18/2022
Loading failed