using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TEAMModelOS.SDK.Module.Cache
{
public class MemoryCacheService : ICacheService ,IDisposable
{
protected IMemoryCache _cache;
public MemoryCacheService(IMemoryCache cache)
{
_cache = cache;
}///
/// 验证缓存项是否存在
///
/// 缓存Key
///
public bool Exists(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
object cached;
return _cache.TryGetValue(key, out cached);
}///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
///
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);
}
///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
/// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)
/// 绝对过期时长
///
public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
_cache.Set(key, value,
new MemoryCacheEntryOptions()
.SetSlidingExpiration(expiresSliding)
.SetAbsoluteExpiration(expiressAbsoulte)
);
return Exists(key);
}
///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
/// 缓存时长
/// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)
///
public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (isSliding)
_cache.Set(key, value,
new MemoryCacheEntryOptions()
.SetSlidingExpiration(expiresIn)
);
else
_cache.Set(key, value,
new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(expiresIn)
);
return Exists(key);
}///
/// 删除缓存
///
/// 缓存Key
///
public bool Remove(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
_cache.Remove(key);
return !Exists(key);
}
///
/// 批量删除缓存
///
/// 缓存Key集合
///
public void RemoveAll(IEnumerable keys)
{
if (keys == null)
{
throw new ArgumentNullException(nameof(keys));
}
keys.ToList().ForEach(item => _cache.Remove(item));
}///
/// 获取缓存
///
/// 缓存Key
///
public T Get(string key) where T : class
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.Get(key) as T;
}
///
/// 获取缓存
///
/// 缓存Key
///
public object Get(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.Get(key);
}
///
/// 获取缓存集合
///
/// 缓存Key集合
///
public IDictionary GetAll(IEnumerable keys)
{
if (keys == null)
{
throw new ArgumentNullException(nameof(keys));
}
var dict = new Dictionary();
keys.ToList().ForEach(item => dict.Add(item, _cache.Get(item)));
return dict;
}///
/// 修改缓存
///
/// 缓存Key
/// 新的缓存Value
///
public bool Replace(string key, object value)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (Exists(key))
if (!Remove(key)) return false;
return Add(key, value);
}
///
/// 修改缓存
///
/// 缓存Key
/// 新的缓存Value
/// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间)
/// 绝对过期时长
///
public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (Exists(key))
if (!Remove(key)) return false;
return Add(key, value, expiresSliding, expiressAbsoulte);
}
///
/// 修改缓存
///
/// 缓存Key
/// 新的缓存Value
/// 缓存时长
/// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间)
///
public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (Exists(key))
if (!Remove(key)) return false;
return Add(key, value, expiresIn, isSliding);
}
public void Dispose()
{
if (_cache != null)
_cache.Dispose();
GC.SuppressFinalize(this);
}
public async Task ExistsAsync(string key)
{
return await Task.Run(() => Exists(key));
}
public async Task AddAsync(string key, object value)
{
return await Task.Run(() => Add(key, value));
}
public async Task AddAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
{
return await Task.Run(() => Add(key, value, expiresSliding, expiressAbsoulte));
}
public async Task AddAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false)
{
return await Task.Run(() => Add(key, value, expiresIn, isSliding));
}
public async Task RemoveAsync(string key)
{
return await Task.Run(() => Remove(key));
}
public async Task RemoveAllAsync(IEnumerable keys)
{
await Task.Run(() => RemoveAll(keys));
}
public async Task GetAsync(string key) where T : class
{
return await Task.Run(() => Get(key));
}
public async Task