public class RedisCacheService : IRedisCacheService
{
private readonly Lazy<ConnectionMultiplexer> lazyConnection;
private const string CacheUriKey = "Setting:RedisConnectionKeyVaultUri";
private ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
public RedisCacheService(IConfiguration config, IKeyVaultService keyVaultService)
{
string keyUri = config.GetValue<string>(CacheUriKey);
string connectionString = keyVaultService.GetSecret(keyUri);
lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(connectionString);
});
}
public void AddItem<T>(string key, T cacheObject)
{
IDatabase cache = Connection.GetDatabase();
cache.StringSet(key, JsonConvert.SerializeObject(cacheObject));
}
public void AddItems<T>(List<KeyValuePair<string, T>> items)
{
var keysAndValues = new List<KeyValuePair<RedisKey, RedisValue>>();
foreach(var item in items)
{
keysAndValues.Add(new KeyValuePair<RedisKey, RedisValue>(item.Key, JsonConvert.SerializeObject(item.Value)));
}
IDatabase cache = Connection.GetDatabase();
cache.StringSet(keysAndValues.ToArray());
}
public T GetItem<T>(string key)
{
IDatabase cache = Connection.GetDatabase();
return JsonConvert.DeserializeObject<T>(cache.StringGet(key));
}
public List<T> GetItems<T>(List<string> keys)
{
List<T> items = new List<T>();
RedisKey[] redisKeys = new RedisKey[keys.Count];
for(int i = 0; i < keys.Count; i++)
{
redisKeys[i] = keys[i];
}
IDatabase cache = Connection.GetDatabase();
RedisValue[] values = cache.StringGet(redisKeys);
foreach (var item in values)
{
items.Add(JsonConvert.DeserializeObject<T>(item));
}
return items;
}
public void RemoveItem(string key)
{
IDatabase cache = Connection.GetDatabase();
cache.KeyDelete(key);
}
public void RemoveItems(List<string> keys)
{
RedisKey[] redisKeys = new RedisKey[keys.Count];
for (int i = 0; i < keys.Count; i++)
{
redisKeys[i] = keys[i];
}
IDatabase cache = Connection.GetDatabase();
cache.KeyDelete(redisKeys);
}
}