Aiursoft.InMemoryKvDb 1.0.6

dotnet add package Aiursoft.InMemoryKvDb --version 1.0.6                
NuGet\Install-Package Aiursoft.InMemoryKvDb -Version 1.0.6                
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="Aiursoft.InMemoryKvDb" Version="1.0.6" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Aiursoft.InMemoryKvDb --version 1.0.6                
#r "nuget: Aiursoft.InMemoryKvDb, 1.0.6"                
#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.
// Install Aiursoft.InMemoryKvDb as a Cake Addin
#addin nuget:?package=Aiursoft.InMemoryKvDb&version=1.0.6

// Install Aiursoft.InMemoryKvDb as a Cake Tool
#tool nuget:?package=Aiursoft.InMemoryKvDb&version=1.0.6                

Aiursoft InMemoryKvDb

MIT licensed Pipeline stat Test Coverage NuGet version (Aiursoft.InMemoryKvDb) ManHours

Aiursoft InMemoryKvDb is a lightweight, thread-safe, in-memory key-value database with support for automatic Least Recently Used (LRU) cache eviction. It allows for efficient storage and retrieval of key-value pairs while preventing unbounded memory usage by leveraging configurable LRU eviction policies.

This library is ideal for scenarios where you need an in-memory cache that automatically discards the least recently accessed items, such as storing temporary user data, caching API responses, or handling in-memory operations for temporary data processing, without worrying about potential memory overflows.

Why this project

The traditional way to create an In-Memory Key-Value Database in C# is:

public class InMemoryDatabase : ISingletonDependency
{
    private ConcurrentDictionary<Guid, Player> Players { get; } = new();
    
    public Player GetOrAddPlayer(Guid id)
    {
        lock (Players)
        {
            return Players.GetOrAdd(id, _ => new Player(id)
            {
                NickName = "Anonymous " + new Random().Next(1000, 9999)
            });
        }
    }
    
}

However, if a hacker keeps calling GetOrAddPlayer with a new Guid, the Players dictionary will grow infinitely. And cause you OutOfMemoryException.

Installation

First, install Aiursoft.InMemoryKvDb to your ASP.NET Core project from nuget.org:

dotnet add package Aiursoft.InMemoryKvDb

Add the service to your IServiceCollection in Startup.cs (or Program.cs in .NET 6 and later):

Usage Methods

  1. AddNamedLruMemoryStore<T, TK>
  2. AddNamedLruMemoryStoreManualCreate<T, TK>
  3. AddLruMemoryStore<T, TK>
  4. AddLruMemoryStoreManualCreate<T, TK>

Differences and How to Choose

  • Named vs. Non-Named Stores:

    • Named stores (AddNamedLruMemoryStore and AddNamedLruMemoryStoreManualCreate) allow you to create multiple isolated caches identified by unique names, suitable for scenarios where you need separate caches within the same application.
    • Non-named stores (AddLruMemoryStore and AddLruMemoryStoreManualCreate) are simpler and provide a single cache instance.
  • Automatic vs. Manual Key-Value Creation:

    • Automatic creation (AddLruMemoryStore and AddNamedLruMemoryStore) uses an onNotFound function to generate values for missing keys automatically.
    • Manual creation (AddLruMemoryStoreManualCreate and AddNamedLruMemoryStoreManualCreate) requires explicit value creation when adding items, providing greater control over how values are added to the cache.

Example Usages

1. Using AddNamedLruMemoryStore<T, TK>
var services = new ServiceCollection();
services.AddNamedLruMemoryStore<Player, Guid>(
    id => new Player(id, "GeneratedPlayer"),
    maxCachedItemsCount: 5);
var serviceProvider = services.BuildServiceProvider();
var namedProvider = serviceProvider.GetService<NamedLruMemoryStoreProvider<Player, Guid>>();
var store = namedProvider.GetStore("player-store");
var player = store.GetOrAdd(Guid.NewGuid());
2. Using AddNamedLruMemoryStoreManualCreate<T, TK>
var services = new ServiceCollection();
services.AddNamedLruMemoryStoreManualCreate<Player, Guid>(maxCachedItemsCount: 5);
var serviceProvider = services.BuildServiceProvider();
var namedProvider = serviceProvider.GetService<NamedLruMemoryStoreManualCreatedProvider<Player, Guid>>();
var store = namedProvider.GetStore("player-store");
var player = store.GetOrAdd(Guid.NewGuid(), id => new Player(id, "ManualPlayer"));
3. Using AddLruMemoryStore<T, TK>
var services = new ServiceCollection();
services.AddLruMemoryStore<Player, Guid>(
    id => new Player(id, "GeneratedPlayer"),
    maxCachedItemsCount: 3);
var serviceProvider = services.BuildServiceProvider();
var store = serviceProvider.GetService<LruMemoryStore<Player, Guid>>();
var player = store.GetOrAdd(Guid.NewGuid());
4. Using AddLruMemoryStoreManualCreate<T, TK>
var services = new ServiceCollection();
services.AddLruMemoryStoreManualCreate<Player, Guid>(maxCachedItemsCount: 3);
var serviceProvider = services.BuildServiceProvider();
var store = serviceProvider.GetService<LruMemoryStoreManualCreated<Player, Guid>>();
var player = store.GetOrAdd(Guid.NewGuid(), id => new Player(id, "ManualPlayer"));

Choose the appropriate method based on whether you need isolated named stores and whether you prefer automatic or manual value creation.

Contributing

Contributions are welcome! Please open an issue or submit a pull request for any feature requests, bug fixes, or other improvements.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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. 
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
1.0.6 199 11/11/2024
1.0.5 96 11/11/2024
1.0.4 93 11/11/2024
1.0.3 91 11/11/2024
1.0.2 90 11/11/2024
1.0.1 92 11/11/2024