using System; using System.Configuration; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using StackExchange.Redis; namespace GPSBusiness.Redis { /// /// Redis 操作类 /// public class RedisHelper : IDisposable { /// /// 连接字符串 /// private static readonly string ConnectionString = ConfigurationManager.AppSettings["RedisConnectionString"]; private static readonly int RedisAnalysisDb = int.Parse(ConfigurationManager.AppSettings["RedisAnalysisDb"]); /// /// 锁 /// private readonly object _lock = new object(); /// /// 连接对象 /// private volatile IConnectionMultiplexer _connection; /// /// 数据库 /// private readonly IDatabase _db; public RedisHelper() { _connection = ConnectionMultiplexer.Connect(string.Format( "{0},allowAdmin=true,syncTimeout=60000,connectTimeout=30000", ConnectionString)); _db = GetDatabase(RedisAnalysisDb); } public RedisHelper(string connectStr,int dataDb) { _connection = ConnectionMultiplexer.Connect(string.Format( "{0},allowAdmin=true,syncTimeout=60000,connectTimeout=60000", connectStr)); _db = GetDatabase(dataDb); } /// /// 获取连接 /// /// protected IConnectionMultiplexer GetConnection() { if (_connection != null && _connection.IsConnected) { return _connection; } lock (_lock) { if (_connection != null && _connection.IsConnected) { return _connection; } if (_connection != null) { _connection.Dispose(); } _connection = ConnectionMultiplexer.Connect(ConnectionString); } return _connection; } /// /// 获取数据库 /// /// /// public IDatabase GetDatabase(int? db = null) { return GetConnection().GetDatabase(db ?? -1); } /// /// 设置 /// /// 键 /// 值 /// 时间-分钟 public virtual void SetOfBytes(string key, object data, int cacheTime) { if (data == null) { return; } var entryBytes = SerializeToBytes(data); TimeSpan? expiresIn = null; if(cacheTime != -1) expiresIn = TimeSpan.FromMinutes(cacheTime); _db.StringSet(key, entryBytes, expiresIn); } /// /// 设置 /// /// 键 /// 值 /// 时间-分钟 public virtual void SetOfJson(string key, object data, int cacheTime) { if (data == null) return; var serializedValue = SerializeToJson(data); TimeSpan? expiresIn = null; if(cacheTime != -1) expiresIn = TimeSpan.FromMinutes(cacheTime); _db.StringSet(key, serializedValue, expiresIn); } /// /// 根据键获取值 /// /// /// /// public virtual T GetFromBytes(string key) { var rValue = _db.StringGet(key); if (!rValue.HasValue) { return default(T); } var result = DeserializeBytes(rValue); return result; } /// /// 根据键获取值 /// /// /// /// public virtual T GetFromJson(string key) { var rValue = _db.StringGet(key); if (!rValue.HasValue) { return default(T); } var result = DeserializeJson(rValue); return result; } /// /// 根据键获取值 /// /// /// /// public virtual async Task GetFromJsonAsync(string key) { var rValue =await _db.StringGetAsync(key); if (!rValue.HasValue) { return default(T); } var result = DeserializeJson(rValue); return result; } /// /// 序列化 /// /// /// byte[] private byte[] SerializeToBytes(object data) { var json = JsonConvert.SerializeObject(data); return Encoding.UTF8.GetBytes(json); } /// /// 序列化 /// /// /// byte[] private string SerializeToJson(object data) { return JsonConvert.SerializeObject(data); } /// /// 反序列化 /// /// /// /// protected virtual T DeserializeBytes(byte[] serializedObject) { if (serializedObject == null) { return default(T); } var json = Encoding.UTF8.GetString(serializedObject); return JsonConvert.DeserializeObject(json); } /// /// 反序列化 /// /// /// /// protected virtual T DeserializeJson(string serializedObject) { if (serializedObject == null) { return default(T); } return JsonConvert.DeserializeObject(serializedObject); } /// /// 判断是否已经设置 /// /// /// public virtual bool IsSet(string key) { return _db.KeyExists(key); } /// /// 根据key删除 /// /// /// public virtual bool Remove(string key) { return _db.KeyDelete(key); } public void Dispose() { throw new NotImplementedException(); } /// /// 自增 /// /// /// public virtual long StringIncrement(string key) { return _db.StringIncrement(key); } } }