using System.Collections.Concurrent; namespace MesETL.App.Cache; public class MemoryCache : ICacher { private readonly ConcurrentDictionary _stringCache = new(); private readonly ConcurrentDictionary> _hashCache = new(); public static MemoryCache Instance { get; private set; } public MemoryCache() { Instance = this; } public Task GetStringAsync(string key) { return _stringCache.TryGetValue(key, out var value) ? Task.FromResult(value) : Task.FromResult((string?)null); } public Task SetStringAsync(string key, string value) { _stringCache[key] = value; return Task.CompletedTask; } public Task ExistsAsync(string key) { return Task.FromResult(_stringCache.ContainsKey(key)); } public Task SetHashAsync(string key, IReadOnlyDictionary hash) { _hashCache[key] = hash.ToDictionary(x => x.Key, x => x.Value); return Task.CompletedTask; } public Task> GetHashAsync(string key) { return Task.FromResult(_hashCache[key]); } public void Delete(Func keySelector) { foreach (var k in _stringCache.Keys.Where(keySelector)) { _stringCache.TryRemove(k, out _); } } }