using System;
using Newtonsoft.Json;
using OSS.Tools.Cache;
using StackExchange.Redis;
namespace OSS.Tools.RedisCache
{
///
/// redis缓存实现类
///
public class ToolStackRedis : IToolCache
{
//redis数据库连接字符串
private readonly string ConnectionStr = null;
// "mycache.redis.cache.windows.net,abortConnect=false, ssl=true,password=..."
private readonly int _db = 0;
// 静态变量 保证 sns_center模块 和 其他模块使用的是不同实例的相同链接
private static ConnectionMultiplexer connection;
///
/// 构造函数
///
///
///
public ToolStackRedis(int db, string connectStr)
{
ConnectionStr = connectStr;
this._db = db;
}
///
/// 缓存数据库
///
public ConnectionMultiplexer CacheConnection
{
get
{
if (connection == null || !connection.IsConnected)
{
connection = new Lazy(()=>ConnectionMultiplexer.Connect(ConnectionStr)).Value;
}
return connection;
}
}
///
/// 缓存数据库
///
public IDatabase CacheRedis => CacheConnection.GetDatabase(_db);
///
/// 添加缓存,已存在不更新
///
/// 添加缓存对象类型
/// 添加对象的key
/// 值
/// 缓存时间 (redis目前都用绝对的)
/// 绝对过期时间(此字段无用 redis目前都用绝对的)
/// 是否添加成功
public bool Add(string key, T obj, TimeSpan slidingExpiration, DateTime? absoluteExpiration)
{
if (slidingExpiration == TimeSpan.Zero && absoluteExpiration == null)
throw new ArgumentNullException(nameof(slidingExpiration), "缓存过期时间不正确,需要设置固定过期时间或者相对过期时间");
if (obj == null)
return false;
var jsonStr = JsonConvert.SerializeObject(obj);
if (slidingExpiration == TimeSpan.Zero)
{
slidingExpiration = new TimeSpan(Convert.ToDateTime(absoluteExpiration).Ticks) - new TimeSpan(DateTime.Now.Ticks);
}
return CacheRedis.StringSet(key, jsonStr, slidingExpiration);
}
///
/// 获取缓存
///
///
///
///
public T Get(string key)
{
string value = CacheRedis.StringGet(key);
if (string.IsNullOrEmpty(value))
return default(T);
T result = JsonConvert.DeserializeObject(value);
return result;
}
///
/// 移除缓存
///
///
///
public bool Remove(string key)
{
return CacheRedis.KeyDelete(key);
}
public bool Set(string key, T obj, TimeSpan slidingExpiration)
{
return Add(key, obj, slidingExpiration, null);
}
public bool Set(string key, T obj, DateTime absoluteExpiration)
{
return Add(key, obj, TimeSpan.Zero, absoluteExpiration);
}
[Obsolete]
public bool AddOrUpdate(string key, T obj, TimeSpan slidingExpiration, DateTime? absoluteExpiration = null)
{
return Add(key, obj, slidingExpiration, absoluteExpiration);
}
}
}