using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Nirvana.Common { public class Cache : ICache { int Default_Timeout = 600; //默认超时时间(秒) string address; JsonSerializerSettings jsonConfig = new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; ConnectionMultiplexer connectionMultiplexer; IDatabase database; class CacheObject { public int ExpireTime { get; set; } public bool ForceOutofDate { get; set; } public T Value { get; set; } } public Cache() { this.address = Configs.GetString("RedisServer"); if (this.address == null || string.IsNullOrWhiteSpace(this.address.ToString())) throw new ApplicationException("配置文件中未找到RedisServer的有效配置"); connectionMultiplexer = ConnectionMultiplexer.Connect(address); database = connectionMultiplexer.GetDatabase(); } /// /// 连接超时设置 /// public int TimeOut { get { return Default_Timeout; } set { Default_Timeout = value; } } public object Get(string key) { return Get(key); } public T Get(string key) { DateTime begin = DateTime.Now; var cacheValue = database.StringGet(key); DateTime endCache = DateTime.Now; var value = default(T); if (!cacheValue.IsNull) { var cacheObject = JsonConvert.DeserializeObject>(cacheValue, jsonConfig); if (!cacheObject.ForceOutofDate) database.KeyExpire(key, new TimeSpan(0, 0, cacheObject.ExpireTime)); value = cacheObject.Value; } DateTime endJson = DateTime.Now; return value; } public T stringGet(string key) { var cacheValue = database.StringGet(key); var value = default(T); if (!cacheValue.IsNull) { var cacheObject = JsonConvert.DeserializeObject(cacheValue, jsonConfig); value = cacheObject; } return value; } public void Insert(string key, object data) { var jsonData = GetJsonData(data, TimeOut, false); database.StringSet(key, jsonData); } public void Insert(string key, object data, int cacheTime) { var timeSpan = TimeSpan.FromSeconds(cacheTime); var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert(string key, object data, DateTime cacheTime) { var timeSpan = cacheTime - DateTime.Now; var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert(string key, T data) { var jsonData = GetJsonData(data, TimeOut, false); database.StringSet(key, jsonData); } public void Insert(string key, T data, int cacheTime) { var timeSpan = TimeSpan.FromSeconds(cacheTime); var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } public void Insert(string key, T data, DateTime cacheTime) { var timeSpan = cacheTime - DateTime.Now; var jsonData = GetJsonData(data, TimeOut, true); database.StringSet(key, jsonData, timeSpan); } string GetJsonData(object data, int cacheTime, bool forceOutOfDate) { var cacheObject = new CacheObject() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate }; return JsonConvert.SerializeObject(data, jsonConfig);//序列化对象 } string GetJsonData(T data, int cacheTime, bool forceOutOfDate) { var cacheObject = new CacheObject() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate }; return JsonConvert.SerializeObject(data, jsonConfig);//序列化对象 } /// /// 删除 /// /// public void Remove(string key) { database.KeyDelete(key); } /// /// 判断key是否存在 /// public bool Exists(string key) { return database.KeyExists(key); } /// /// 判断该字段是否存在hash中 /// /// /// /// public bool HashExists(string key, string field) { return database.HashExists(key, field); } /// /// 从 hash 中移除指定字段 /// /// /// /// public bool HashDelete(string redisKey, string hashField) { return database.HashDelete(redisKey, hashField); } /// /// 从 hash 中移除指定字段 /// /// /// /// public long HashDelete(string redisKey, IEnumerable hashField) { return database.HashDelete(redisKey, hashField.ToArray()); } /// /// 在 hash 设定值 /// /// /// /// /// public bool HashSet(string redisKey, string hashField, string value) { return database.HashSet(redisKey, hashField, value); } /// /// 在 hash 中设定值 /// /// /// public void HashSet(string redisKey, IEnumerable hashFields) { database.HashSet(redisKey, hashFields.ToArray()); } /// /// 在 hash 中获取值 /// /// /// /// public RedisValue HashGet(string redisKey, string hashField) { return database.HashGet(redisKey, hashField); } /// /// 在 hash 中获取值 /// /// /// /// /// public RedisValue[] HashGet(string redisKey, RedisValue[] hashField, string value) { return database.HashGet(redisKey, hashField); } /// /// 从 hash 返回所有的字段值 /// /// /// public IEnumerable HashKeys(string redisKey) { return database.HashKeys(redisKey); } /// /// 返回 hash 中的所有值 /// /// /// public RedisValue[] HashValues(string redisKey) { return database.HashValues(redisKey); } /// /// 在 hash 设定值(序列化) /// /// /// /// /// //public bool HashSet(string redisKey, string hashField, T value) //{ // var json = Serialize(value); // return database.HashSet(redisKey, hashField, json); //} /// /// 在 hash 中获取值(反序列化) /// /// /// /// //public T HashGet(string redisKey, string hashField) //{ // return Deserialize(database.HashGet(redisKey, hashField)); //} } }