leonibr / community-extensions-cache-postgres

A PostgreSQL Implementation of IDistributedCache interface. Using Postgresql as distributed cache in Asp.Net Core. NetStandard 2.0
50 stars 16 forks source link

# Community.Microsoft.Extensions.Caching.PostgreSQL Nuget

Description

This implemantation uses PostgreSQL 11+ as distributed cache. Version 4 and up.

For PostgreSQL <= 10

Use older versions of this packages (<= 3.1.2)

Getting Started

  1. Install the package into your project
dotnet add package Community.Microsoft.Extensions.Caching.PostgreSql
  1. Add the following line to the Startup Configure method.
services.AddDistributedPostgreSqlCache(setup =>
{
    setup.ConnectionString = configuration["ConnectionString"];
    setup.SchemaName = configuration["SchemaName"];
    setup.TableName = configuration["TableName"];
    setup.DisableRemoveExpired = configuration["DisableRemoveExpired"];
    // Optional - DisableRemoveExpired default is FALSE
    setup.CreateInfrastructure = configuration["CreateInfrastructure"];
    // CreateInfrastructure is optional, default is TRUE
    // This means que every time starts the application the
    // creation of table and database functions will be verified.
    setup.ExpiredItemsDeletionInterval = TimeSpan.FromMinutes(30)
    // ExpiredItemsDeletionInterval is optional
    // This is the periodic interval to scan and delete expired items in the cache. Default is 30 minutes.
    // Minimum allowed is 5 minutes. - If you need less than this please share your use case 😁, just for curiosity...
})

Configuring with IServiceProvider access

services.AddDistributedPostgreSqlCache((serviceProvider, setup) =>
{
    // IConfiguration is used as an example here
    var configuration = serviceProvider.GetRequiredService<IConfiguration>();
    setup.ConnectionString = configuration["ConnectionString"];
    ...
})

Configuring via IConfigureOptions<PostgreSqlCacheOptions>

use

services.AddDistributedPostgreSqlCache();

and implement and register

IConfigureOptions<PostgreSqlCacheOptions>

DisableRemoveExpired = True use case:

When you have 2 or more instances/microservices/processes and you just to leave one of them removing expired items.

  1. Then pull from DI like any other service
    /// this is extracted from the React+WebApi WebSample

    private readonly IDistributedCache _cache;

    public WeatherForecastController(IDistributedCache cache)
    {
        _cache = cache;
    }

UpdateOnGetCacheItem = false use case:

For read-only databases or if the database user does not have write permission you can set UpdateOnGetCacheItem = false

services.AddDistributedPostgreSqlCache((serviceProvider, setup) =>
{
    ...
    setup.UpdateOnGetCacheItem = false;
    // Or
    var configuration = serviceProvider.GetRequiredService<IConfiguration>();
    setup.UpdateOnGetCacheItem = configuration["UpdateOnGetCacheItem"];
    ...
})

What it does to my database 🐘:

It creates a table & schema for storing cache (names are configurable)

Runing the console sample

You will need a local postgresql server with this configuration:

  1. Server listening to port 5432 at localhost
  2. The password of your postgres account, if not attached already to your user.
  3. Clone this repo.
  4. Run the following commands inside PostgreSqlCacheSample:
dotnet restore
prepare-database.cmd -create
dotnet run

S

Runing the React+WebApi WebSample project

You will need a local postgresql server with this configuration:

  1. Server listening to port 5432 at localhost
  2. The password of your postgres account, if not attached already to your user.
  3. You also need npm and node installed on your dev machine
  4. Clone this repo.
  5. Run the following commands inside WebSample:
dotnet restore
prepare-database.cmd -create
dotnet run

It takes some time to npm retore the packages, grab a ☕ while waiting...

Then you can delete the database with:

prepare-database.cmd -erase

Change Log

  1. v4.0.1 - Add suport to .net 7
    1. [BREAKING CHANGE] - Drop suport to .net 5
    2. [BREAKING CHANGE] - Make use of procedures (won't work with PostgreSQL <= 10, use version 3)
  2. v3.1.2 - removed dependency for IHostApplicationLifetime if not supported on the platform: AWS for instance - issue #28
  3. v3.1.0 - Added log messages on Debug Level, multitarget .net5 and .net6, dropped support to netstandard2.0, fix sample to match multitarget and sample database.
  4. v3.0.2 - CreateInfrastructure also creates the schema issue #8
  5. v3.0.1 - DisableRemoveExpired configuration added; If TRUE the cache instance won`t delete expired items.
  6. v3.0
    1. [BREAKING CHANGE] - Direct instantiation not preferred
    2. Single thread loop remover
  7. v2.0.x - Update everything to net5.0, more detailed sample project.
  8. v1.0.8 - Update to latest dependencies -

License

This is a fork from repo