using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; namespace WIDESEA_Core.CacheManager { public class MemoryCacheService : ICacheService { protected IMemoryCache _cache; public MemoryCacheService(IMemoryCache cache) { _cache = cache; } /// <summary> /// 验è¯ç¼“å˜é¡¹æ˜¯å¦å˜åœ¨ /// </summary> /// <param name="key">缓å˜Key</param> /// <returns></returns> public bool Exists(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } return _cache.Get(key) != null; } /// <summary> /// æ·»åŠ ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key</param> /// <param name="value">缓å˜Value</param> /// <returns></returns> 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) { } /// <summary> /// æ·»åŠ ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key</param> /// <param name="value">缓å˜Value</param> /// <param name="expiresSliding">滑动过期时长(如果在过期时间内有æ“ä½œï¼Œåˆ™ä»¥å½“å‰æ—¶é—´ç‚¹å»¶é•¿è¿‡æœŸæ—¶é—´ï¼‰</param> /// <param name="expiressAbsoulte">ç»å¯¹è¿‡æœŸæ—¶é•¿</param> /// <returns></returns> public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { _cache.Set(key, value, new MemoryCacheEntryOptions() .SetSlidingExpiration(expiresSliding) .SetAbsoluteExpiration(expiressAbsoulte) ); return Exists(key); } /// <summary> /// æ·»åŠ ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key</param> /// <param name="value">缓å˜Value</param> /// <param name="expiresIn">ç¼“å˜æ—¶é•¿</param> /// <param name="isSliding">æ˜¯å¦æ»‘动过期(如果在过期时间内有æ“ä½œï¼Œåˆ™ä»¥å½“å‰æ—¶é—´ç‚¹å»¶é•¿è¿‡æœŸæ—¶é—´ï¼‰</param> /// <returns></returns> 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); } /// <summary> /// åˆ é™¤ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key</param> /// <returns></returns> public bool Remove(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } _cache.Remove(key); return !Exists(key); } /// <summary> /// 批é‡åˆ é™¤ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key集åˆ</param> /// <returns></returns> 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(); } /// <summary> /// 获å–ç¼“å˜ /// </summary> /// <param name="key">缓å˜Key</param> /// <returns></returns> 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); } } }