/*以字符串的格式缓存数据,用途最广*/ /// <summary> /// 通过键取缓存值 /// </summary> /// <param name="key"></param> /// <returns></returns> public object GetCache(string key) { object value = null; // 通过key以字符串格式取值 var redisValue = Db.StringGet(key); if (!redisValue.HasValue) { return(null); } // 执行JSON序列化 ValueInfoEntity valueInfo = JsonConvert.DeserializeObject <ValueInfoEntity>(redisValue.ToString()); // 判断值的类型,如果是字符串类型,直接调用value得到结果, 如果不是,接着使用它本身的类型序列化JSON if (valueInfo.TypeName == typeof(string).AssemblyQualifiedName) { value = valueInfo.Value; } else { value = JsonConvert.DeserializeObject(valueInfo.Value, Type.GetType(valueInfo.TypeName)); } // 过期时间的判断,如果是相对过期时间,需要再次保存到Redis,就可以延续缓存数据的过期时间 if (valueInfo.ExpireTime != null && valueInfo.ExpireType == ExpireType.Relative) { SetKeyExpire(key, valueInfo.ExpireTime.Value); } return(value); }
/// <summary> /// 写入缓存 /// </summary> /// <param name="key">键</param> /// <param name="value">值</param> /// <param name="tiemout">过期时间</param> /// <param name="expireType">过期时间类型</param> public void SetCache(string key, object value, TimeSpan?timeout, ExpireType?expireType) { // 由于此处使用的是字符串格式缓存,为了能构支持对象缓存,使用JSON序列化存储 string jsonStr = string.Empty; // 如果要缓存的值是string就直接缓存,如果不是则序列化JSON if (value is string) { jsonStr = value as string; } else { jsonStr = JsonConvert.SerializeObject(value); } // 初始化下面的对象,保存缓存值的状态 ValueInfoEntity valueInfo = new ValueInfoEntity { Value = jsonStr, TypeName = value.GetType().AssemblyQualifiedName, ExpireTime = timeout, ExpireType = expireType }; // 将上面的对象序列化,缓存到Redis string theValue = JsonConvert.SerializeObject(valueInfo); // 如果没有过期时间,直接缓存 if (timeout == null) { Db.StringSet(key, theValue); } else { Db.StringSet(key, theValue, timeout); } }