在我们的项目中,通常会把数据存储到关系型数据库中,比如Oracle,SQL Server,Mysql等,但是关系型数据库对于并发的支持并不是很强大,这样就会造成系统的性能不佳,而且存储的数据多为结构化数据,对于非结构数据(比如文本)和半结构化数据(比如JSon) 就显得不够灵活,而非关系型数据库则很好的弥补了这两点, 我们通常把读操作频繁的数据写入Redis中,以Key-value的方式存储来提高性能。
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。以下介绍了.net中操作redis五种数据类型的基本语法。
一、String数据类型的应用场景
1. 简介
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
2.使用场景
存储简单的键值对,比如我们需要统计某个网站的点击量,关注量、粉丝量等
3. C#使用操作举例
现在需要保存一个Webservice接口的参数,让其实现可配置,比如地址、用户名、密码、同步时间等信息,我们可以将它在前端页面格式化为JSon字符串,
然后通过Ajax传递到服务端保存到Redis中,代码如下:
1 /// <summary> 2 /// 保存数据到Redis缓存中 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">需要保存的键名称,默认保存到redis的第二个数据库中</param> 6 /// <param name="configInfo">需要保存的配置信息</param> 7 /// <returns>返回保存的结果</returns> 8 public string SaveConfigInfoToRedis(string KeyName, string configInfo) 9 {10 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))11 {12 if (client == null) return "保存失败!";13 if (client.ContainsKey(KeyName))14 client.Replace<string>(KeyName, configInfo);15 else16 client.Set<string>(KeyName, configInfo);17 return "保存成功!";18 }19 }
保存成功后,我们在redis可视化工具中可以看到我们保存的信息为:
如果下次加载数据的时候,我们可以根据Key来读取这个string字符串,然后格式化为Hashtable,再序列化为JOSN格式返回到前端,就可以以表单的形式展示,
在表单中可以修改保存等操作,实现了参数的可配置,这读取代码如下:
1 /// <summary> 2 /// 从redis缓存中获取数据,转化为相应格式后返回 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">缓存中的键名称</param> 6 /// <returns>输入键对应的值信息</returns> 7 public string LoadConfigFromRedis(string KeyName) 8 { 9 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))10 {11 if (client == null) return string.Empty;12 string configData = client.Get<string>(KeyName);13 if (string.IsNullOrWhiteSpace(configData))14 return string.Empty;15 Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData);16 return JsonConvert.SerializeObject(data);17 18 }19 }
二、hash(哈希)
1.简介
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
2.使用场景
我们需要灵活的保存一些信息,特别适合保存对象的信息,比如用户信息、配置信息等
3.C#使用操作举例
由于我们上面使用string类型的对象保存配置信息存在这样的问题,就是涉及到序列化和反序列化,如果信息量大的话将降低系统性能,
那么此处我们可以使用Hash数据结构来保存上面的信息,代码如下:
1 /// <summary> 2 /// 操作redis的hashtable类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateHash() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb",1)) 8 { 9 Dictionary<string, string> configDic = new Dictionary<string, string>();10 configDic.Add("config_IP", "localhost");11 configDic.Add("config_Port", "1521");12 configDic.Add("config_serviceName", "orcl");13 configDic.Add("config_userName", "DE_POWERPMS");14 configDic.Add("config_password", "cppepass");15 client.SetRangeInHash("config_info", configDic);16 Dictionary<string, string> testHash = client.GetAllEntriesFromHash("config_info");17 foreach (var item in testHash)18 {19 Console.WriteLine("Hash的key为:{0} 值为:{1}", item.Key, item.Value);20 }21 Console.ReadLine();22 }23 }
使用redis可视化工具我们可以刚才存储的数据如下:
三、List(列表)
1.简介
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),可以使用list的push操作将任务存到List,
然后使用pop操作将任务取出执行,在列表头部或者末尾操作数据非常高效,不受队列长度的影响。
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
2.使用场景
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
另外,因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”,获取钱N个用户列表等。
3.C#使用操作举例
对于队列的使用,在此处比如有多个客户端需要打印机打印任务,那么使用队列进行任务的排队,然后按照排队顺序开始打印
对于栈的使用,比如二叉树的遍历,括号的匹配等,我们可以进行先进后出的顺序完成,代码如下:
1 /// <summary> 2 /// 操作redis的List类型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateList() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region List队列操作10 client.EnqueueItemOnList("QueueList", "打印任务1"); //入队11 client.EnqueueItemOnList("QueueList", "打印任务2");12 client.EnqueueItemOnList("QueueList", "打印任务3");13 client.EnqueueItemOnList("QueueList", "打印任务4");14 long q = client.GetListCount("QueueList");15 Console.WriteLine("打印任务按照顺序打印开始");16 for (int i = 0; i < q; i++)17 {18 Console.WriteLine("QueueList出队值:{0}", client.DequeueItemFromList("QueueList"));19 }20 Console.WriteLine("打印任务按照顺序打印完成");21
没有评论:
发表评论