Using IMemoryCache in .NET

IMemoryCache provides an in-memory cache storage, allowing you to store and retrieve objects that can be shared across different parts of a application to improve performence and reduce repeated computations or database accesses.

ICacheService Interface

public interface ICacheService : IDisposable
{
    bool Exists(string key);

    void LPush(string key, string val);
    void RPush(string key, string val);

    object ListDequeue(string key);
    T ListDequeue<T>(string key) where T : class;

    void ListRemove(string key, int keepIndex);

    bool AddObject(string key, object value, int expireSeconds = -1, bool isSliding = false);
    bool Add(string key, string value, int expireSeconds = -1, bool isSliding = false);

    bool Remove(string key);
    void RemoveAll(IEnumerable<string> keys);

    T Get<T>(string key) where T : class;
    string Get(string key);
}

MemoryCacheService Implementation

public class MemoryCacheService : ICacheService
{
    protected IMemoryCache _cache;

    public MemoryCacheService(IMemoryCache cache)
    {
        _cache = cache;
    }

    public bool Exists(string key)
    {
        if (key == null)
        {
            throw new ArgumentNullException(nameof(key));
        }
        return _cache.Get(key) != null;
    }

    public bool Add(string key, object value)
    {
        if (key == null)
        {
            throw new ArgumentNullException(nameof(key));
        }
        if (value == null)
        {
            throw new ArgumentNullException(nameof(value));
        }
        _cache.Set(key, value);
        return Exists(key);
    }

    public bool AddObject(string key, object value, int expireSeconds = -1, bool isSliding = false)
    {
        if (expireSeconds != -1)
        {
            _cache.Set(key, value,
                new MemoryCacheEntryOptions()
                    .SetSlidingExpiration(new TimeSpan(0, 0, expireSeconds)));
        }
        else
        {
            _cache.Set(key, value);
        }
        return true;
    }

    public bool Add(string key, string value, int expireSeconds = -1, bool isSliding = false)
    {
        return AddObject(key, value, expireSeconds, isSliding);
    }

    public void LPush(string key, string val) { }
    public void RPush(string key, string val) { }

    public T ListDequeue<T>(string key) where T : class
    {
        return null;
    }

    public object ListDequeue(string key)
    {
        return null;
    }

    public void ListRemove(string key, int keepIndex) { }

    public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
    {
        _cache.Set(key, value,
            new MemoryCacheEntryOptions()
                .SetSlidingExpiration(expiresSliding)
                .SetAbsoluteExpiration(expiressAbsoulte));
        return Exists(key);
    }

    public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
    {
        if (isSliding)
            _cache.Set(key, value,
                new MemoryCacheEntryOptions()
                    .SetSlidingExpiration(expiresIn));
        else
            _cache.Set(key, value,
                new MemoryCacheEntryOptions()
                    .SetAbsoluteExpiration(expiresIn));
        return Exists(key);
    }

    public bool Remove(string key)
    {
        if (key == null)
        {
            throw new ArgumentNullException(nameof(key));
        }
        _cache.Remove(key);
        return !Exists(key);
    }

    public void RemoveAll(IEnumerable<string> keys)
    {
        if (keys == null)
        {
            throw new ArgumentNullException(nameof(keys));
        }
        keys.ToList().ForEach(item => _cache.Remove(item));
    }

    public string Get(string key)
    {
        return _cache.Get(key)?.ToString();
    }

    public T Get<T>(string key) where T : class
    {
        if (key == null)
        {
            throw new ArgumentNullException(nameof(key));
        }
        return _cache.Get(key) as T;
    }

    public void Dispose()
    {
        if (_cache != null)
            _cache.Dispose();
        GC.SuppressFinalize(this);
    }
}

Tags: IMemoryCache Caching .NET

Posted on Mon, 26 Oct 2026 16:22:44 +0000 by richardk1