做者:依乐祝
原文地址:http://www.javashuo.com/article/p-btlvrxjc-do.htmlhtml
熟悉的开场白,你们晚上好啊,今天给你们分享的是Redis在大数据中的使用,可能真正讲的是一些redis的使用技巧,Redis基本的一些东西。git
首先给你们个地址,源码以及实例都在里面,固然今天的分享也是按照里面的实例来进行的,你们能够先进行下载。
http://git.newlifex.com/NewLife/NewLife.Redis
固然这里也附上Redis的下载地址:
windows:https://github.com/MicrosoftArchive/redis/releases
http://x.newlifex.com/Redis-x64-3.2.100.msi
Linux:https://redis.io/download程序员
实际上NewLife.Redis是一个完整的Redis协议的功能的实现,可是redis的核心功能并无在这里面,Redis的核心功能的实现是在NewLife.Core里面。这里能够打开看一下,NewLife.Core里面有一个NewLife.Caching的命名空间,里面有一个Redis类里面实现了Redis的基本功能,另外一个类是RedisClient是Redis的客户端。Redis的核心功能就是有这两个类实现。RedisClient表明着Redis客户端对服务器的一个链接。Redis真正使用的时候有一个Redis链接池,里面存放着不少个RedisClient对象。github
因此咱们Redis的封装有两层,一层是NewLife.Core里面的Redis以及RedisClient。另外一层就是NewLife.Redis。这里面的FullRedis是对Redis的实现了Redis的全部的高级功能。这里你也能够认为NewLife.Redis是Redis的一个扩展。面试
打开Program.cs看下代码redis
这里XTrace.UseConsole();
是向控制台输出日志,方便调试使用查看结果。数据库
接下来看第一个例子Test1。具体的我都在代码中进行了注释,你们能够看下json
static void Test1() { var ic = Redis.Create("127.0.0.1:6379", 3);//建立Redis实例,获得FullRedis对象 //var ic = new FullRedis();//另外一种实例化的方式 //ic.Server = "127.0.0.1:6379"; //ic.Db = 3;//Redis中数据库 ic.Log = XTrace.Log;//显示日志,进行Redis操做把日志输出,生产环境不用输出日志 // 简单操做 Console.WriteLine("共有缓存对象 {0} 个", ic.Count);//缓存对象数量 ic.Set("name", "大石头");//Set K-V结构,Set第二个参数能够是任何类型 Console.WriteLine(ic.Get<String>("name"));//Get泛型,指定获取的类型 ic.Set("time", DateTime.Now, 1);//过时时间秒 Console.WriteLine(ic.Get<DateTime>("time").ToFullString()); Thread.Sleep(1100); Console.WriteLine(ic.Get<DateTime>("time").ToFullString()); // 列表 var list = ic.GetList<DateTime>("list"); list.Add(DateTime.Now); list.Add(DateTime.Now.Date); list.RemoveAt(1); Console.WriteLine(list[list.Count - 1].ToFullString()); // 字典 var dic = ic.GetDictionary<DateTime>("dic"); dic.Add("xxx", DateTime.Now); Console.WriteLine(dic["xxx"].ToFullString()); // 队列 var mq = ic.GetQueue<String>("queue"); mq.Add(new[] { "abc", "g", "e", "m" }); var arr = mq.Take(3); Console.WriteLine(arr.Join(",")); // 集合 var set = ic.GetSet<String>("181110_1234"); set.Add("xx1"); set.Add("xx2"); set.Add("xx3"); Console.WriteLine(set.Count); Console.WriteLine(set.Contains("xx2")); Console.WriteLine("共有缓存对象 {0} 个", ic.Count); }
Set的时候若是是字符串或者字符数据的话Redis会直接保存起来(字符串内部机制也是保存二进制),若是是其余类型会默认进行json序列化而后再保存起来c#
Get的时候若是是字符串或者字符数据会直接获取,若是是其余类型会进行json反序列化windows
Set第三个参数过时时间单位是秒。
vs调试小技巧,按F5或者直接工具栏“启动”会编译整个解决方案会很慢(VS默认),能够选中项目而后右键菜单选择调试->启动新实例。会只编译将会用到的项目,这样对调试来讲会快不少。
你们运行调试后能够看到控制台输出的内容:向右的箭头=》是
ic.Log=XTrace.Log
输出的日志
字典的使用:对象的话须要把json所有取出来而后转换成对象,而字典的话就能够直接取某个字段。
队列是List结构实现的,使用场景能够上游数据太多,下游处理不过来的时候,那么就可使用这个队列。上游的数据发到队列,而后下游慢慢的消费。另外一个应用,跨语言的协同工做,比方说其余语言实现的程序往队列里面塞数据,而后另外一种语言来进行消费处理。哈,这种方式相似mq的概念,虽然有点low,可是也很好用。
集合,用的比较多的是用在一个须要精确判断的去重功能。像咱们天天有三千万订单,这三千万订单能够有重复,这时候我想统计下一共有订单,这时候直接数据库group by是不大可能的,由于数据库中分了十几张表,这里分享个实战经验:比方说揽收,商家发货了,网点要把件收回来,可是收回来以前网点不知道本身有多少货啊,这时候咱们作了一个功能,也就是订单会发送到咱们公司来,咱们会建一个time_site的key的集合,并且集合自己有去重的功能,并且咱们能够很方便的经过set.Count功能来统计数量,当件被揽收之后,咱们后台把这个件从集合中Remove掉.而后这个Set中存在的就是网点尚未揽收的件,这时候经过Count就会知道这个网点今天还有多少件没有揽收。实际使用中这个数量比较大,由于有几万个网点。
Redis中布隆过滤器,去重的,面试的时候问的比较多
小经验分享:
- 数据库中不合法的时间处理:判断时间中的年份,是否大于2000年。若是小于2000就认为不合法。习惯大于小于号不习惯用等于号,这样能够处理不少意外的数据
- Set的时候最好指定过时时间防止有些须要删除的数据,咱们忘记删了
- Redis异步尽可能不用,由于Redis延迟自己很小,大概在100us-200us,再一个就是Redis自己是单线程的,异步任务切换的耗时比网络耗时还要大。
- List用法:物联网中数据上传,量比较大时,咱们能够把这些数据先放在Redis的List中,好比说一秒钟1万条,而后再批量取出来而后批量插入数据库中。这时候要设置好key,能够前缀+时间,对于已经处理的List能够进行remove移除。
接下来看第四个例子,咱们直接作压力测试,代码以下:
static void Main(String[] args) { XTrace.UseConsole(); // 激活FullRedis,不然Redis.Create会获得默认的Redis对象 FullRedis.Register(); Test4(); Console.ReadKey(); } static void Test4() { var ic = Redis.Create("127.0.0.1:6379", 5); //var ic = new MemoryCache(); ic.Bench(); }
运行的结果以下图所示:
测试就是进行get,set remove,累加等的操做。你们能够看到在我本机上轻轻松松的到了六十万,多线程的时候甚至到了一百多万。为何会达到这么高的ops呢,下面给你们说一下。
上面的操做若是你们都掌握的基本算Redis入门了,接下来进行进阶。会了基本比别人更胜一筹了。
GetAll:比方说我要取十个key,这个时候能够用getall。这时候redis就执行了一次命令。比方说我要取10个key那么用get的话要取10次,若是用getall的话要用1次。一次getall时间大概是get的一点几倍,可是10次get的话就是10倍的时间,这个帐你应该会算吧。强烈推荐你们用getall。
setall 跟getall类似。批量设置K-V.
setall与getall性能很恐怖,官方公布的ops也就10万左右,为何咱们的测试轻轻松松到五十万甚至上百万,由于咱们就用了setall,getall。
若是get,set两次以上,建议用getall,setall
好比执行10次命令会打包成一个包集体发过去执行,这里实现的方式是StartPipeline()开始,StopPipeline()结束中间的代码就会以管道的形式执行。这里推荐使用咱们的更强的武器,AutoPipeline自动管道属性。管道操做到必定数量时,自动提交,默认0。使用了AutoPipeline,就不须要StartPipeline,StopPipeline指定管道的开始结束了!
Add跟Replace就是实现Redis分布式锁的关键
在项目的Readme中,这里摘录下:
Redis实现ICache接口,它的孪生兄弟MemoryCache,内存缓存,千万级吞吐率。
各应用强烈建议使用ICache接口编码设计,小数据时使用MemoryCache实现;
数据增大(10万)之后,改用Redis实现,不须要修改业务代码。
一条数据多个key怎么设置比较合理?
若是对性能要求不是很高直接用json序列化实体就好,不必使用字典进行存储。
队列跟List有什么区别?左进右出的话用List仍是用队列比较好?
队列其实就是用List实现的,也是基于List封装的。左进右出的话直接队列就好。Redis的List结构比较有意思,既能够左进右出,也能右进左出。因此它既能够实现列表结构,也能队列,也能实现栈
存放多个字段的类性能同样吗?
大部分场景都不会有误差,可能对于大公司数据量比较大的场景会有些误差
能否介绍一下使用Redis进行数据计算、统计的场景?
略。本身看视频吧!o(∩_∩)o 哈哈!(由于我没听清!)
大数据写入到数据库以后 好比数据到亿以上的时候 统计分析这块 查询这块 能不能分享些经验。
分表分库,拆分到一千万之内。
CPU为什么暴涨?
程序员终极理念:CPU达到百分百,而后性能达到最优,尽可能不要浪费。最痛恨的是:若是cpu不到百分百,性能无法提高了,说明代码有问题!
视频已经上传至百度云,你们能够自行下载观看
连接:https://pan.baidu.com/s/1sOW_PLjxQE8C2msbDfizeA
提取码:c7dp
观看指南(笑笑提供)
虽然Redis会用,可是没有像大石头这样的大数据使用场景。今天的视频收获颇丰,可能大部分人跟我同样,没有大石头的使用场景,可是值得借鉴的经验仍是很丰富的!期待下一次的精彩分享。同时附上QQ群:1600800。能够共同交流使用经验!