diff --git a/AskFm/AskFm.API/AskFm.API.csproj b/AskFm/AskFm.API/AskFm.API.csproj index 77d8e4c..59c3c20 100644 --- a/AskFm/AskFm.API/AskFm.API.csproj +++ b/AskFm/AskFm.API/AskFm.API.csproj @@ -18,7 +18,9 @@ + + diff --git a/AskFm/AskFm.API/Program.cs b/AskFm/AskFm.API/Program.cs index c06620b..efe32e8 100644 --- a/AskFm/AskFm.API/Program.cs +++ b/AskFm/AskFm.API/Program.cs @@ -150,6 +150,16 @@ public static void Main(string[] args) }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); + + + builder.Services.AddStackExchangeRedisCache(options => + { + options.Configuration = builder.Configuration.GetConnectionString("Redis"); + options.InstanceName = "AskFmCache"; + }); + + builder.Services.AddSingleton(); + var app = builder.Build(); diff --git a/AskFm/AskFm.API/appsettings.json b/AskFm/AskFm.API/appsettings.json index 779f8b0..0ea25cc 100644 --- a/AskFm/AskFm.API/appsettings.json +++ b/AskFm/AskFm.API/appsettings.json @@ -1,6 +1,7 @@ { "ConnectionStrings": { - "DefaultConnection": "CONNECTIONSTRING" + "DefaultConnection": "CONNECTIONSTRING", + "Redis": "localhost:6379" }, "Logging": { "LogLevel": { diff --git a/AskFm/AskFm.BLL/Services/IRedisService.cs b/AskFm/AskFm.BLL/Services/IRedisService.cs new file mode 100644 index 0000000..ae55879 --- /dev/null +++ b/AskFm/AskFm.BLL/Services/IRedisService.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.Caching.Distributed; +using System.Text.Json; + +namespace AskFm.BLL.Services; + +public interface IRedisService +{ + public Task SetCacheAsync(string key, T value, TimeSpan expirationTime); + + public Task GetCacheAsync(string key); + + public Task RemoveCacheAsync(string key); +} + diff --git a/AskFm/AskFm.BLL/Services/RedisCacheService.cs b/AskFm/AskFm.BLL/Services/RedisCacheService.cs new file mode 100644 index 0000000..0c95a83 --- /dev/null +++ b/AskFm/AskFm.BLL/Services/RedisCacheService.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Caching.Distributed; +using System.Text.Json; + +namespace AskFm.BLL.Services; + +public class RedisCacheService : IRedisService +{ + private readonly IDistributedCache _cache; + + public RedisCacheService(IDistributedCache cache) + { + _cache = cache; + } + + public async Task SetCacheAsync(string key, T value, TimeSpan expirationTime) + { + var options = new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = expirationTime + }; + + var jsonData = JsonSerializer.Serialize(value); + await _cache.SetStringAsync(key, jsonData, options); + } + + public async Task GetCacheAsync(string key) + { + var jsonData = await _cache.GetStringAsync(key); + return jsonData is null ? default : JsonSerializer.Deserialize(jsonData); + } + + public async Task RemoveCacheAsync(string key) + { + await _cache.RemoveAsync(key); + } +} +