Pdsr.Cache.NoCache
4.0.0
dotnet add package Pdsr.Cache.NoCache --version 4.0.0
NuGet\Install-Package Pdsr.Cache.NoCache -Version 4.0.0
<PackageReference Include="Pdsr.Cache.NoCache" Version="4.0.0" />
<PackageVersion Include="Pdsr.Cache.NoCache" Version="4.0.0" />
<PackageReference Include="Pdsr.Cache.NoCache" />
paket add Pdsr.Cache.NoCache --version 4.0.0
#r "nuget: Pdsr.Cache.NoCache, 4.0.0"
#:package Pdsr.Cache.NoCache@4.0.0
#addin nuget:?package=Pdsr.Cache.NoCache&version=4.0.0
#tool nuget:?package=Pdsr.Cache.NoCache&version=4.0.0
Pdsr Cache Helper
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.
- install the package
dotnet add package Pdsr.Cache.Redisfor Redis. - Add the
RedisCacheManagerto DI through the extensionAddRedisCacheManager(c => { c.EndPoints = ["my-redis:6379"]; c.KeyPrefix = "my-app:"; }) - Instantiate the
ICacheManagerin your controller or service. - 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.TryGetandIAsyncCacheManager.TryGetAsyncwere added; custom implementations must add them.- Redis outages now throw instead of returning
default/false(see above). IRedisConnectionFactoryreturnsIConnectionMultiplexer, addsConnectionAsync, and owns the connection; disposing a cache manager no longer closes it.RedisConfiguration: obsoleteHost/Portremoved;UseCallingAssemblyNameAsClientNamerenamed toUseEntryAssemblyNameAsClientName;RetryCount,Database,KeyPrefixandAllowFlushDatabaseadded. Host names are no longer resolved to fixed IPs at startup.- Redis
Clearno longer flushes the database by default. Set<T>(key, data, TimeSpan? expiry)no longer has a default forexpiry; the RedisGet/GetAsyncpreferReplicaparameter is now required.- Redis sets:
RemoveFromSetItemAsyncis nowRemoveFromSetAsyncand also deletes the item;GetSetLengthis nowGetSetLengthAsync;GetSetItemsAsyncleaves out expired items. - A zero or negative cache time now means "don't cache" in every provider.
InMemoryCacheConfig.MaxEnteriesCountis nowMaxEntriesCount; in-memory patterns use Redis glob syntax instead of regex.SqlCacheManager.RemoveByPattern/ClearthrowNotSupportedException.- 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,ICacheManagerExtendedandRedisCacheManagerExtended, and the non-genericSet/SetAsync/Getoverloads.
Contribute
Please refer to contribute. Some parts definitely needs help.
Documents
Under Creation.
| Product | Versions 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. |
-
.NETStandard 2.0
- Pdsr.Cache (>= 4.0.0)
-
.NETStandard 2.1
- Pdsr.Cache (>= 4.0.0)
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 | 10 | 10/6/2026 |
| 3.6.0 | 345 | 2/13/2025 |
| 3.5.1 | 279 | 10/9/2024 |
| 3.5.1-beta.1 | 145 | 10/9/2024 |
| 3.5.0 | 329 | 2/20/2024 |
| 3.3.1 | 319 | 8/26/2023 |
| 3.3.0 | 324 | 7/18/2023 |
| 3.2.1 | 429 | 2/20/2023 |
| 3.2.0 | 513 | 11/11/2022 |
| 3.1.8 | 626 | 9/13/2022 |
| 3.0.7 | 598 | 8/25/2022 |
| 3.0.6 | 626 | 6/21/2022 |
| 3.0.5 | 683 | 5/11/2022 |
| 3.0.4 | 691 | 4/18/2022 |
| 3.0.3 | 663 | 4/18/2022 |
| 3.0.2 | 650 | 4/18/2022 |