//
namespace SafeCampus.Cache;
///
/// 缓存服务
///
public partial interface ISimpleCacheService
{
#region 基础操作
/// 是否包含缓存项
///
///
bool ContainsKey(string key);
/// 设置缓存项
/// 键
/// 值
/// 过期时间,秒。小于0时采用默认缓存时间
///
bool Set(string key, T value, int expire = -1);
/// 设置缓存项
/// 键
/// 值
/// 过期时间
///
bool Set(string key, T value, TimeSpan expire);
/// 获取缓存项
/// 键
///
T Get(string key);
/// 批量移除缓存项
/// 键集合
///
int Remove(params string[] keys);
/// 清空所有缓存项
void Clear();
/// 设置缓存项有效期
/// 键
/// 过期时间
bool SetExpire(string key, TimeSpan expire);
/// 获取缓存项有效期
/// 键
///
TimeSpan GetExpire(string key);
///
/// 模糊删除
///
/// 匹配关键字
void DelByPattern(string pattern);
#endregion 基础操作
#region 集合操作
/// 批量获取缓存项
///
///
///
IDictionary GetAll(IEnumerable keys);
/// 批量设置缓存项
///
///
/// 过期时间,秒。小于0时采用默认缓存时间
void SetAll(IDictionary values, int expire = -1);
/// 获取列表
/// 元素类型
/// 键
///
IList GetList(string key);
/// 获取哈希
/// 元素类型
/// 键
///
IDictionary GetDictionary(string key);
/// 获取队列
/// 元素类型
/// 键
///
IProducerConsumer GetQueue(string key);
/// 获取栈
/// 元素类型
/// 键
///
IProducerConsumer GetStack(string key);
/// 获取Set
///
///
///
ICollection GetSet(string key);
#endregion 集合操作
#region 高级操作
/// 添加,已存在时不更新
/// 值类型
/// 键
/// 值
/// 过期时间,秒。小于0时采用默认缓存时间
///
bool Add(string key, T value, int expire = -1);
/// 设置新值并获取旧值,原子操作
///
/// 常常配合Increment使用,用于累加到一定数后重置归零,又避免多线程冲突。
///
/// 值类型
/// 键
/// 值
///
T Replace(string key, T value);
/// 尝试获取指定键,返回是否包含值。有可能缓存项刚好是默认值,或者只是反序列化失败,解决缓存穿透问题
/// 值类型
/// 键
/// 值。即使有值也不一定能够返回,可能缓存项刚好是默认值,或者只是反序列化失败
/// 返回是否包含值,即使反序列化失败
bool TryGetValue(string key, out T value);
/// 累加,原子操作
/// 键
/// 变化量
///
long Increment(string key, long value);
/// 累加,原子操作
/// 键
/// 变化量
///
double Increment(string key, double value);
/// 递减,原子操作
/// 键
/// 变化量
///
long Decrement(string key, long value);
/// 递减,原子操作
/// 键
/// 变化量
///
double Decrement(string key, double value);
#endregion 高级操作
#region 事务
/// 提交变更。部分提供者需要刷盘
///
int Commit();
/// 申请分布式锁
/// 要锁定的key
/// 锁等待时间,单位毫秒
///
IDisposable AcquireLock(string key, int msTimeout);
/// 申请分布式锁
/// 要锁定的key
/// 锁等待时间,申请加锁时如果遇到冲突则等待的最大时间,单位毫秒
/// 锁过期时间,超过该时间如果没有主动释放则自动释放锁,必须整数秒,单位毫秒
/// 失败时是否抛出异常,如果不抛出异常,可通过返回null得知申请锁失败
///
IDisposable AcquireLock(string key, int msTimeout, int msExpire,
bool throwOnFailure);
#endregion 事务
}