270 lines
8.8 KiB
C#
270 lines
8.8 KiB
C#
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<T>
|
|
{
|
|
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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 连接超时设置
|
|
/// </summary>
|
|
public int TimeOut
|
|
{
|
|
get
|
|
{
|
|
return Default_Timeout;
|
|
}
|
|
set
|
|
{
|
|
Default_Timeout = value;
|
|
}
|
|
}
|
|
public object Get(string key)
|
|
{
|
|
return Get<object>(key);
|
|
}
|
|
|
|
public T Get<T>(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<CacheObject<T>>(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<T>(string key)
|
|
{
|
|
var cacheValue = database.StringGet(key);
|
|
var value = default(T);
|
|
if (!cacheValue.IsNull)
|
|
{
|
|
var cacheObject = JsonConvert.DeserializeObject<T>(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<T>(string key, T data)
|
|
{
|
|
var jsonData = GetJsonData<T>(data, TimeOut, false);
|
|
database.StringSet(key, jsonData);
|
|
}
|
|
|
|
public void Insert<T>(string key, T data, int cacheTime)
|
|
{
|
|
var timeSpan = TimeSpan.FromSeconds(cacheTime);
|
|
var jsonData = GetJsonData<T>(data, TimeOut, true);
|
|
database.StringSet(key, jsonData, timeSpan);
|
|
}
|
|
|
|
public void Insert<T>(string key, T data, DateTime cacheTime)
|
|
{
|
|
var timeSpan = cacheTime - DateTime.Now;
|
|
var jsonData = GetJsonData<T>(data, TimeOut, true);
|
|
database.StringSet(key, jsonData, timeSpan);
|
|
}
|
|
|
|
|
|
string GetJsonData(object data, int cacheTime, bool forceOutOfDate)
|
|
{
|
|
var cacheObject = new CacheObject<object>() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate };
|
|
return JsonConvert.SerializeObject(data, jsonConfig);//序列化对象
|
|
}
|
|
|
|
string GetJsonData<T>(T data, int cacheTime, bool forceOutOfDate)
|
|
{
|
|
var cacheObject = new CacheObject<T>() { Value = data, ExpireTime = cacheTime, ForceOutofDate = forceOutOfDate };
|
|
return JsonConvert.SerializeObject(data, jsonConfig);//序列化对象
|
|
}
|
|
/// <summary>
|
|
/// 删除
|
|
/// </summary>
|
|
/// <param name="key"></param>
|
|
public void Remove(string key)
|
|
{
|
|
database.KeyDelete(key);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断key是否存在
|
|
/// </summary>
|
|
public bool Exists(string key)
|
|
{
|
|
return database.KeyExists(key);
|
|
}
|
|
/// <summary>
|
|
/// 判断该字段是否存在hash中
|
|
/// </summary>
|
|
/// <param name="key"></param>
|
|
/// <param name="field"></param>
|
|
/// <returns></returns>
|
|
public bool HashExists(string key, string field)
|
|
{
|
|
return database.HashExists(key, field);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从 hash 中移除指定字段
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <returns></returns>
|
|
public bool HashDelete(string redisKey, string hashField)
|
|
{
|
|
return database.HashDelete(redisKey, hashField);
|
|
}
|
|
/// <summary>
|
|
/// 从 hash 中移除指定字段
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <returns></returns>
|
|
public long HashDelete(string redisKey, IEnumerable<RedisValue> hashField)
|
|
{
|
|
return database.HashDelete(redisKey, hashField.ToArray());
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在 hash 设定值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <param name="value"></param>
|
|
/// <returns></returns>
|
|
public bool HashSet(string redisKey, string hashField, string value)
|
|
{
|
|
return database.HashSet(redisKey, hashField, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在 hash 中设定值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashFields"></param>
|
|
public void HashSet(string redisKey, IEnumerable<HashEntry> hashFields)
|
|
{
|
|
database.HashSet(redisKey, hashFields.ToArray());
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在 hash 中获取值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <returns></returns>
|
|
public RedisValue HashGet(string redisKey, string hashField)
|
|
{
|
|
return database.HashGet(redisKey, hashField);
|
|
}
|
|
/// <summary>
|
|
/// 在 hash 中获取值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <param name="value"></param>
|
|
/// <returns></returns>
|
|
public RedisValue[] HashGet(string redisKey, RedisValue[] hashField, string value)
|
|
{
|
|
return database.HashGet(redisKey, hashField);
|
|
}
|
|
/// <summary>
|
|
/// 从 hash 返回所有的字段值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <returns></returns>
|
|
public IEnumerable<RedisValue> HashKeys(string redisKey)
|
|
{
|
|
return database.HashKeys(redisKey);
|
|
}
|
|
/// <summary>
|
|
/// 返回 hash 中的所有值
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <returns></returns>
|
|
public RedisValue[] HashValues(string redisKey)
|
|
{
|
|
return database.HashValues(redisKey);
|
|
}
|
|
/// <summary>
|
|
/// 在 hash 设定值(序列化)
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <param name="value"></param>
|
|
/// <returns></returns>
|
|
//public bool HashSet<T>(string redisKey, string hashField, T value)
|
|
//{
|
|
// var json = Serialize(value);
|
|
// return database.HashSet(redisKey, hashField, json);
|
|
//}
|
|
|
|
/// <summary>
|
|
/// 在 hash 中获取值(反序列化)
|
|
/// </summary>
|
|
/// <param name="redisKey"></param>
|
|
/// <param name="hashField"></param>
|
|
/// <returns></returns>
|
|
//public T HashGet<T>(string redisKey, string hashField)
|
|
//{
|
|
// return Deserialize<T>(database.HashGet(redisKey, hashField));
|
|
//}
|
|
}
|
|
}
|