dotnetcore / EasyCaching

:boom: EasyCaching is an open source caching library that contains basic usages and some advanced usages of caching which can help us to handle caching more easier!
MIT License
1.97k stars 325 forks source link

EasyCaching in Multitenant application #445

Open umar-ulabs opened 1 year ago

umar-ulabs commented 1 year ago

I been using EasyCaching by adding one global instance and passing tenant id as Key (to isolate data) to each caching method. If I add EasyCaching service per tenant scope. So each tenant will get full EasyCaching instance, will that be better or one global service is enough? Thanks for your insights.

catcherwong commented 1 year ago

@umar-ulabs Thanks for your interest in this project.

Based on your description, one global service is enough.

But if you want to separate them, you can use IEasyCachingFactory to get providers with different configuration.

Here is an example,

services.AddEasyCaching(option =>
{
    option..WithMessagePack("mymsgpack");
    option.UseRedis(config =>
    {
        config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379));
        config.SerializerName = "mymsgpack";
    }, "tenant-a");

    option.UseRedis(config =>
    {
        config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6380));
        config.SerializerName = "mymsgpack";
    }, "tenant-b");   
});

// get IEasyCachingProviderFactory
var factory = app.ApplicationServices.GetRequiredService<EasyCaching.Core.IEasyCachingProviderFactory>();
// get provider with different tenant
var provider = factory.GetCachingProvider("tenant-a");
// call methods
provider.xxxx
umar-ulabs commented 1 year ago

So essentially I can add easycache per tenant? thanks. I hesitated doing that because if I have 500 tenants it will add/maintain 500 instances of easycache. As long as its ok. I would love to add it, rather than passing tenant id for each methods.

JHeLiu commented 1 month ago

@umar-ulabs
You handle it better with the cache key Like key

${Tenant}:xxxx...