/
ProductsRedisCache.cs
52 lines (43 loc) · 1.57 KB
/
ProductsRedisCache.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Threading.Tasks;
using Reusables.Storage.Entities;
using Reusables.Utils;
using StackExchange.Redis;
namespace Reusables.Caching.Redis
{
public class ProductsRedisCache : IProductsCache
{
private static readonly TimeSpan TTL = TimeSpan.FromSeconds(30);
private readonly ISerializer _serializer;
private readonly IRedisManager _redisManager;
public ProductsRedisCache(
ISerializer serializer,
IRedisManager redisManager
)
{
_serializer = serializer;
_redisManager = redisManager;
}
public async ValueTask Set(long productId, Product value)
{
var key = GetKey(productId);
var valueSerialized = _serializer.Serialize(value);
await _redisManager.SetValue(key, valueSerialized, TTL);
ProductsRedisCacheEventSource.Log.ItemAdded();
}
public async ValueTask<Product> TryGet(long productId)
{
ProductsRedisCacheEventSource.Log.ItemRequested();
var redisValue = await _redisManager.GetValue(GetKey(productId));
if (!redisValue.HasValue)
{
ProductsRedisCacheEventSource.Log.ItemNotFound();
return null;
}
var valueDeserialized = _serializer.Deserialize<Product>(redisValue);
ProductsRedisCacheEventSource.Log.ItemFetched();
return valueDeserialized;
}
private static RedisKey GetKey(long productId) => $"Product-{productId}";
}
}