标签:readwrite sys 文件中 else reac 数据操作 类库 settime ddr
接口:
using System; using System.Collections.Generic; using System.Text; namespace YesWay.Redis { /// <summary> /// NedisClient对外开放的方法 /// </summary> public interface ICache { #region 简单Key/Value存储操作 /// <summary> /// 字符串的新增或修改 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> bool Set(string key, string value); /// <summary> /// 如果key不存在,则设置 /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> bool SetNX(string key, string value); /// <summary> /// 字符串的新增或修改 并设置过期时间 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> bool Set(string key, string value, DateTime expireTime); /// <summary> /// 设置redis 缓存过期时间 /// </summary> /// <param name="key">key</param> /// <param name="expireTime">时间</param> /// <returns></returns> bool SetTimeOut(string key, DateTime expireTime); /// <summary> /// 设置redis 缓存过期时间 /// </summary> /// <param name="key">key</param> /// <param name="expireTimeSpan">时间</param> /// <returns></returns> bool SetTimeOut(string key, TimeSpan expireTimeSpan); /// <summary> /// 根据输入的多个Key获取多个值,支持泛型 /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="keys">多个Key</param> /// <returns>多个值</returns> List<T> MGet<T>(List<string> keys); /// <summary> /// 输入一个字典集合批量插入数据 /// </summary> /// <typeparam name="T">T</typeparam> /// <param name="values">values</param> void MSet<T>(IDictionary<string, T> values); /// <summary> /// 根据输入的多个Key获取多个值,支持泛型 /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="keys">多个Key</param> /// <returns>字典集合</returns> IDictionary<string, T> MGetDictionary<T>(List<string> keys); /// <summary> /// 字符串的查询 /// </summary> /// <param name="key"></param> /// <returns>Value</returns> string Get(string key); ///// <summary> ///// 获取key对应的原始值(未经过JSON序列化处理) ///// </summary> ///// <param name="key"></param> ///// <returns></returns> //string GetOriginal(string key); ///// <summary> ///// 获取指定key的指定范围的字符串 ///// </summary> ///// <param name="key"></param> ///// <param name="start">如果是序列化为Json的字符串,则从1开始,否则从0开始</param> ///// <param name="end"></param> ///// <returns>Value</returns> //string GetRange(string key, int start, int end); /// <summary> /// 范型数据的新增或修改 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> bool Set<T>(string key, T value); /// <summary> /// 范型数据的查询 /// </summary> /// <param name="key"></param> /// <returns>value</returns> T Get<T>(string key); ///// <summary> ///// 删除 ///// </summary> ///// <param name="key">key</param> ///// <returns>true or false</returns> //bool Remove(string key); ///// <summary> ///// 验证Key是否存在 ///// </summary> ///// <param name="key"></param> ///// <returns>true or false</returns> //bool Exists(string key); ///// <summary> ///// 字符串的追加 ///// </summary> ///// <param name="key">key</param> ///// <param name="value">value</param> ///// <returns>true or false</returns> //long Append(string key, string value); ///// <summary> ///// 获取指定Key的过期时间 ///// </summary> ///// <param name="key"></param> ///// <returns></returns> //TimeSpan GetTimeToLive(string key); #endregion } }
实现:
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using Newtonsoft.Json; using StackExchange.Redis; namespace YesWay.Redis { /// <summary> /// NedisClient /// </summary> public class NedisClient : ICache { /// <summary> /// 默认超时时间(单位秒) /// </summary> //int Default_Timeout = 600; /// <summary> /// Redis数据服务器地址:ip:port,ip:port /// </summary> string address; JsonSerializerSettings jsonConfig = new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; /// <summary> /// StackExchange类库操作Redis数据库的类对象 /// </summary> ConnectionMultiplexer connectionMultiplexer; /// <summary> /// Redis数据库 /// </summary> IDatabase database; class CacheObject<T> { public int ExpireTime { get; set; } public bool ForceOutofDate { get; set; } public T Value { get; set; } } /// <summary> /// 无参构造方法 /// </summary> public NedisClient() { this.address = ConfigurationManager.AppSettings["RedisServer"]; if (this.address == null || string.IsNullOrWhiteSpace(this.address.ToString())) throw new ApplicationException("配置文件中未找到RedisServer的有效配置"); connectionMultiplexer = ConnectionMultiplexer.Connect(address); database = connectionMultiplexer.GetDatabase(); } #region 简单Key/Value存储操作 /// <summary> /// 字符串的新增或修改 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> public bool Set(string key, string value) { try { return database.StringSet(key, value); } catch (Exception ex) { throw ex; } } /// <summary> /// 如果key不存在,则设置 /// </summary> /// <param name="key"></param> /// <param name="value"></param> /// <returns></returns> public bool SetNX(string key, string value) { try { return database.StringSet(key, value,null, When.NotExists); } catch (Exception ex) { throw ex; } } /// <summary> /// 字符串的新增或修改 并设置过期时间 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> public bool Set(string key, string value, DateTime expireTime) { try { database.StringSet(key, value); database.KeyExpire(key, expireTime); return true; } catch (Exception ex) { throw ex; } } /// <summary> /// 设置redis 缓存过期时间 /// </summary> /// <param name="key">key</param> /// <param name="expireTime">时间</param> /// <returns></returns> public bool SetTimeOut(string key, DateTime expireTime) { try { database.KeyExpire(key, expireTime); return true; } catch (Exception ex) { throw ex; } } /// <summary> /// 设置redis 缓存过期时间 /// </summary> /// <param name="key">key</param> /// <param name="expireTimeSpan">时间</param> /// <returns></returns> public bool SetTimeOut(string key, TimeSpan expireTimeSpan) { try { database.KeyExpire(key, expireTimeSpan); return true; } catch (Exception ex) { throw ex; } } /// <summary> /// 根据输入的多个Key获取多个值,支持泛型 StackExchange版本T支持byte[],NserverKit版本报错 /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="keys">多个Key</param> /// <returns>多个值</returns> public List<T> MGet<T>(List<string> keys) { if (keys != null && keys.Count > 100) { throw new Exception("Key的个数不能大于100个"); } try { //if (redisConfig.ReadWriteSeparate) //{ // client = redisClientsManagers[index].GetReadOnlyClient(); //} //else //{ // client = redisClientsManagers[index].GetClient(); //} var bytesArray = database.StringGet(keys.Select(i => (RedisKey)i).ToArray()); var results = new List<T>(); var isBytes = typeof(T) == typeof(byte[]); foreach (var resultBytes in bytesArray) { if (resultBytes.IsNull) continue; if (isBytes) { var result=Encoding.Default.GetBytes(Encoding.UTF8.GetString(resultBytes)); results.Add((T)(object)result); } else { var resultString = Encoding.UTF8.GetString(resultBytes); if (typeof(T) == typeof(String) && !resultString.StartsWith("\"")) { resultString = "\"" + resultString + "\""; } var result = JsonConvert.DeserializeObject<T>(resultString); results.Add(result); } } return results; } catch (Exception ex) { throw ex; } } /// <summary> /// 根据输入的多个Key获取多个值,支持泛型 /// </summary> /// <typeparam name="T">泛型</typeparam> /// <param name="keys">多个Key</param> /// <returns>字典集合</returns> public IDictionary<string, T> MGetDictionary<T>(List<string> keys) { if (keys != null && keys.Count > 100) { throw new Exception("Key的个数不能大于100个"); } try { //if (redisConfig.ReadWriteSeparate) //{ // client = redisClientsManagers[index].GetReadOnlyClient(); //} //else //{ // client = redisClientsManagers[index].GetClient(); //} var keysArray = keys.ToArray(); var keyValues = database.StringGet(keys.Select(key => (RedisKey)key).ToArray()); var results = new Dictionary<string, T>(); var isBytes = typeof(T) == typeof(byte[]); var i = 0; foreach (var keyValue in keyValues) { var key = keysArray[i++]; if (keyValue.IsNull) { results[key] = default(T); continue; } if (isBytes) { results[key] = (T)(object)Encoding.Default.GetBytes(Encoding.UTF8.GetString(keyValue)); } else { var keyValueString = Encoding.UTF8.GetString(keyValue); if (typeof(T) == typeof(String) && !keyValueString.StartsWith("\"")) { keyValueString = "\"" + keyValueString + "\""; } results[key] = JsonConvert.DeserializeObject<T>(keyValueString); } } return results; } catch (Exception ex) { throw ex; } } /// <summary> /// 输入一个字典集合批量插入数据 /// </summary> /// <typeparam name="T">T</typeparam> /// <param name="values">values</param> public void MSet<T>(IDictionary<string, T> values) { if (values != null && values.Count > 100) { throw new Exception("Values的个数不能大于100个"); } try { //if (redisConfig.ReadWriteSeparate) //{ // client = redisClientsManagers[index].GetReadOnlyClient(); //} //else //{ // client = redisClientsManagers[index].GetClient(); //} foreach (var kvp in values) { Set<T>(kvp.Key,kvp.Value); } } catch (Exception ex) { throw ex; } } /// <summary> /// 字符串的查询 /// </summary> /// <param name="key"></param> /// <returns>Value</returns> public string Get(string key) { try { //if (redisConfig.ReadWriteSeparate) //{ // client = redisClientsManagers[index].GetReadOnlyClient(); //} //else //{ // client = redisClientsManagers[index].GetClient(); //} return Get<string>(key); } catch (Exception ex) { throw ex; } } /// <summary> /// 范型数据的新增或修改 /// </summary> /// <param name="key">key</param> /// <param name="value">value</param> /// <returns>true or false</returns> public bool Set<T>(string key, T value) { try { var bytesValue = value as byte[]; if (bytesValue != null) { database.StringSet(key, bytesValue); return true; } var valueString = JsonConvert.SerializeObject(value); database.StringSet(key, valueString); return true; } catch (Exception ex) { throw ex; } } /// <summary> /// 范型数据的查询 /// StackExchange版本可以查询byte[]类型数据 NserviceKit不能查询byte[]类型数据 死循环 /// NserviceKit:client.Get<string>("mset112");如果key不存在 报错 /// </summary> /// <param name="key"></param> /// <returns>value</returns> public T Get<T>(string key) { try { //if (redisConfig.ReadWriteSeparate) //{ // client = redisClientsManagers[index].GetReadOnlyClient(); //} //else //{ // client = redisClientsManagers[index].GetClient(); //} var result = database.StringGet(key); if (result.IsNull) { return default(T); } if (typeof(T) == typeof(byte[])) { return (T)(object)Encoding.Default.GetBytes(Encoding.UTF8.GetString(result)); } else { var keyValueString = Encoding.UTF8.GetString(result); if (typeof(T) == typeof(String) && !keyValueString.StartsWith("\"")) { keyValueString = "\"" + keyValueString + "\""; } if (!string.IsNullOrWhiteSpace(keyValueString)) { return JsonConvert.DeserializeObject<T>(keyValueString); } return default(T); } } catch (Exception ex) { throw ex; } } #endregion } }
测试:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace YesWay.RedisTest { class Program { static void Main(string[] args) { YesWay.Redis.NedisClient client = new YesWay.Redis.NedisClient(); #region 简单Key/Value存储操作 // 字符串的新增或修改 // public bool Set(string key, string value) //client.Set("liu", "liuqiyun"); // 如果key不存在,则设置 // bool SetNX(string key, string value); //client.SetNX("liu1", "11111111111"); // 字符串的新增或修改 并设置过期时间 // bool Set(string key, string value, DateTime expireTime); //client.Set("qq", "liuqiyun"+ DateTime.Now.ToString(), DateTime.Now.AddMinutes(1)); // 设置redis 缓存过期时间 // public bool SetTimeOut(string key, DateTime expireTime) //client.SetTimeOut("liu1", DateTime.Now.AddMinutes(1)); // 设置redis 缓存过期时间 // bool SetTimeOut(string key, TimeSpan expireTimeSpan); //client.SetTimeOut("liu", DateTime.Now.AddSeconds(30) - DateTime.Now); // 根据输入的多个Key获取多个值,支持泛型 // public List<T> MGet<T>(List<string> keys) //var listKey = new List<string>(); //listKey.Add("mset111"); //listKey.Add("mset222"); //listKey.Add("mset2221"); //var listPerson = client.MGet<Person>(listKey); //Console.WriteLine(listPerson.Count); //foreach (var person in listPerson) //{ // Console.WriteLine(person.UserName + person.PassWord); //} //var listKey = new List<string>(); //listKey.Add("mset1"); //listKey.Add("mset2"); //listKey.Add("mset2123123"); //var listString = client.MGet<string>(listKey); //Console.WriteLine(listString.Count); //foreach (var stringkey in listString) //{ // Console.WriteLine(stringkey); //} //var listKey = new List<string>(); //listKey.Add("mset11"); //listKey.Add("mset22"); //listKey.Add("mset2123123"); //var listByte = client.MGet<byte[]>(listKey); //Console.WriteLine(listByte.Count); //foreach (var bytekey in listByte) //{ // Console.WriteLine(Encoding.UTF8.GetString(bytekey)); //} //Console.ReadKey(); // 输入一个字典集合批量插入数据 // public void MSet<T>(IDictionary<string, T> values) //Dictionary<string, string> d1 = new Dictionary<string, string>(); //d1.Add("mset1", "mset1value"); //d1.Add("mset2", "mset1value2"); //client.MSet<string>(d1); //Dictionary<string, byte[]> d2 = new Dictionary<string, byte[]>(); //d2.Add("mset11", System.Text.Encoding.ASCII.GetBytes("mset1value")); //d2.Add("mset22", System.Text.Encoding.ASCII.GetBytes("mset1value2")); //client.MSet<byte[]>(d2); //Dictionary<string, Person> d3 = new Dictionary<string, Person>(); //d3.Add("mset111", new Person { UserName = "\"liu", PassWord = "1234" }); //d3.Add("mset222", new Person { UserName = "\"liu", PassWord = "abcs" }); //client.MSet<Person>(d3); // 根据输入的多个Key获取多个值,支持泛型 // public IDictionary<string, T> MGetDictionary<T>(List<string> keys) //var listKey = new List<string>(); //listKey.Add("mset11"); //listKey.Add("mset22"); //listKey.Add("mset2123123"); //var dcString = client.MGetDictionary<string>(listKey); //Console.WriteLine(dcString.Keys.Count); //foreach (var stringkey in dcString) //{ // //if (stringkey.Value != null) // Console.WriteLine(stringkey.Key + ":" + stringkey.Value); //} //var listKey = new List<string>(); //listKey.Add("mset111"); //listKey.Add("mset222"); //listKey.Add("mset2221"); //var dcPerson = client.MGetDictionary<Person>(listKey); //Console.WriteLine(dcPerson.Keys.Count); //foreach (var person in dcPerson) //{ // if (person.Value != null) // Console.WriteLine(person.Key + ":" + person.Value.UserName + person.Value.PassWord); //} //var listKey = new List<string>(); //listKey.Add("mset11"); //listKey.Add("mset22"); //listKey.Add("mset2123123"); //var dcByte = client.MGetDictionary<byte[]>(listKey); //Console.WriteLine(dcByte.Keys.Count); //foreach (var bytekey in dcByte) //{ // if (bytekey.Value != null) // Console.WriteLine(bytekey.Key + ":" + Encoding.UTF8.GetString(bytekey.Value)); //} //Console.ReadKey(); // 字符串的查询 范型数据的查询 // public string Get(string key) // public T Get<T>(string key) //Console.WriteLine(client.Get("mset11")); //Console.WriteLine(Encoding.UTF8.GetString(client.Get<byte[]>("mset11"))); //Console.WriteLine(client.Get("mset11")); //Console.WriteLine(Encoding.UTF8.GetString(client.Get<byte[]>("mset11"))); //var result = client.Get("mset1"); //Console.WriteLine(result); // 范型数据的新增或修改 // public bool Set<T>(string key, T value) //var key = "qaz"; //var value = new Person { UserName = "liu", PassWord = "1234" }; //client.Set<Person>(key, value); //var key1 = "byte1"; //byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(key1); //client.Set<byte[]>(key1, byteArray); //var key2 = "byteString"; //client.Set<string>(key2, key1); #endregion Console.ReadKey(); } } public class Person { public string UserName { get; set; } public string PassWord { get; set; } } }
StackExchange.Redis数据操作封装(简单Key/Value存储操作)(原创)
标签:readwrite sys 文件中 else reac 数据操作 类库 settime ddr
原文地址:https://www.cnblogs.com/liuqiyun/p/9037703.html