/// <summary> /// 使用 <see cref="RedisCacheValue" /> 包装 缓存值,并返回序列化后的结果。 /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <param name="absoluteExpiration"></param> /// <param name="slidingExpiration"></param> /// <returns></returns> protected virtual byte[] ParseValue(string key, object value, DateTime?absoluteExpiration, TimeSpan?slidingExpiration) { var cacheValue = new RedisCacheValue { Key = key, AbsoluteExpiration = absoluteExpiration, SlidingExpiration = slidingExpiration, Value = value }; return(Serialize(cacheValue)); }
/// <summary> /// 检查缓存值的过期时间,并做相应处理。 /// 实际上我们只需要处理 滑动过期,我们通过比较滑动过期时间与插入时间,过期了则移除缓存项,在滑动时间范围内则重新插入缓存。 /// </summary> /// <param name="value"></param> /// <returns></returns> protected virtual bool CheckCacheValue(RedisCacheValue value) { if (value.SlidingExpiration.HasValue) { // 通常情况下在 滑动时间到期时 RedisCache 会自动移除缓存项。 if (value.SlidingExpiration.Value < DateTime.Now - value.InsertTime) { Remove(value.Key); return(false); } Set(value.Key, value.Value, value.SlidingExpiration.Value); } return(true); }
/// <summary> /// 反序列化。 /// </summary> /// <param name="data"></param> /// <param name="object"></param> /// <returns></returns> protected virtual bool TryDeserialize(byte[] data, out RedisCacheValue @object) { @object = default(RedisCacheValue); if (data == null) { return(false); } try { var result = _serializableService.Deserialize(data); @object = (RedisCacheValue)result; if (!CheckCacheValue(@object)) { @object = null; return(false); } return(true); } catch { return(false); } }