Redis在大数据中的使用,Redis封装架构讲解

热场准备
熟悉的开场白,大家晚上好啊,今天给大家分享的是redis在大数据中的使用,可能真正讲的是一些redis的使用技巧,redis基本的一些东西。
首先给大家个地址,源码以及实例都在里面,当然今天的分享也是按照里面的实例来进行的,大家可以先进行下载。
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
开始
redis封装架构讲解
实际上newlife.redis是一个完整的redis协议的功能的实现,但是redis的核心功能并没有在这里面,redis的核心功能的实现是在newlife.core里面。这里可以打开看一下,newlife.core里面有一个newlife.caching的命名空间,里面有一个redis类里面实现了redis的基本功能,另一个类是redisclient是redis的客户端。redis的核心功能就是有这两个类实现。redisclient代表着redis客户端对服务器的一个连接。
redis真正使用的时候有一个redis连接池,里面存放着很多个redisclient对象。
所以我们redis的封装有两层,一层是newlife.core里面的redis以及redisclient。另一层就是newlife.redis。这里面的fullredis是对redis的实现了redis的所有的高级功能。这里你也可以认为newlife.redis是redis的一个扩展。
test实例讲解redis的基本使用
实例
打开program.cs看下代码
这里xtrace.useconsole();是向控制台输出日志,方便调试使用查看结果。
接下来看第一个例子test1。具体的我都在代码中进行了注释,大家可以看下
staticvoidtest1(){varic=redis.create(127.0.0.1:6379,3);//创建redis实例,得到fullredis对象//varic=newfullredis();//另一种实例化的方式//ic.server=127.0.0.1:6379;//ic.db=3;//redis中数据库ic.log=xtrace.log;//显示日志,进行redis操作把日志输出,生产环境不用输出日志//简单操作console.writeline(共有缓存对象{0}个,ic.count);//缓存对象数量ic.set(name,大石头);//setk-v结构,set第二个参数可以是任何类型console.writeline(ic.get(name));//get泛型,指定获取的类型ic.set(time,datetime.now,1);//过期时间秒console.writeline(ic.get(time).tofullstring());thread.sleep(1100);console.writeline(ic.get(time).tofullstring());//列表varlist=ic.getlist(list);list.add(datetime.now);list.add(datetime.now.date);list.removeat(1);console.writeline(list[list.count-1].tofullstring());//字典vardic=ic.getdictionary(dic);dic.add(xxx,datetime.now);console.writeline(dic[xxx].tofullstring());//队列varmq=ic.getqueue(queue);mq.add(new[]{abc,g,e,m});vararr=mq.take(3);console.writeline(arr.join(,));//集合varset=ic.getset(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);}
1、set的时候如果是字符串或者字符数据的话redis会直接保存起来(字符串内部机制也是保存二进制),如果是其他类型会默认进行json序列化然后再保存起来
2、get的时候如果是字符串或者字符数据会直接获取,如果是其他类型会进行json反序列化
3、set第三个参数过期时间单位是秒。
4、vs调试小技巧,按f5或者直接工具栏“启动”会编译整个解决方案会很慢(vs默认),可以选中项目然后右键菜单选择调试->启动新实例。会只编译将会用到的项目,这样对调试来说会快很多。
5、大家运行调试后可以看到控制台输出的内容:向右的箭头=》是ic.log=xtrace.log输出的日志
6、字典的使用:对象的话需要把json全部取出来然后转换成对象,而字典的话就可以直接取某个字段。
7、队列是list结构实现的,使用场景可以上游数据太多,下游处理不过来的时候,那么就可以使用这个队列。上游的数据发到队列,然后下游慢慢的消费。另一个应用,跨语言的协同工作,比方说其他语言实现的程序往队列里面塞数据,然后另一种语言来进行消费处理。哈,这种方式类似mq的概念,虽然有点low,但是也很好用。
8、集合,用的比较多的是用在一个需要精确判断的去重功能。像我们每天有三千万订单,这三千万订单可以有重复,这时候我想统计下一共有订单,这时候直接数据库group by是不大可能的,因为数据库中分了十几张表,这里分享个实战经验:比方说揽收,商家发货了,网点要把件收回来,但是收回来之前网点不知道自己有多少货啊,这时候我们做了一个功能,也就是订单会发送到我们公司来,我们会建一个time_site的key的集合,而且集合本身有去重的功能,而且我们可以很方便的通过set.count功能来统计数量,当件被揽收以后,我们后台把这个件从集合中remove掉.然后这个set中存在的就是网点还没有揽收的件,这时候通过count就会知道这个网点今天还有多少件没有揽收。实际使用中这个数量比较大,因为有几万个网点。
9、redis中布隆过滤器,去重的,面试的时候问的比较多
10、小经验分享:
数据库中不合法的时间处理:判断时间中的年份,是否大于2000年。如果小于2000就认为不合法。习惯大于小于号不习惯用等于号,这样可以处理很多意外的数据
set的时候最好指定过期时间防止有些需要删除的数据,我们忘记删了
redis异步尽量不用,因为redis延迟本身很小,大概在100us-200us,再一个就是redis本身是单线程的,异步任务切换的耗时比网络耗时还要大。list用法:物联网中数据上传,量比较大时,我们可以把这些数据先放在redis的list中,比如说一秒钟1万条,然后再批量取出来然后批量插入数据库中。这时候要设置好key,可以前缀+时间,对于已经处理的list可以进行remove移除。
压力测试
接下来看第四个例子,我们直接做压力测试,代码如下:
staticvoidmain(string[]args){xtrace.useconsole();//激活fullredis,否则redis.create会得到默认的redis对象fullredis.register();test4();console.readkey();}staticvoidtest4(){varic=redis.create(127.0.0.1:6379,5);//varic=newmemorycache();ic.bench();}
运行的结果如下图所示:
测试就是进行get,set remove,累加等的操作。大家可以看到在我本机上轻轻松松的到了六十万,多线程的时候甚至到了一百多万。为什么会达到这么高的ops呢,下面给大家说一下。
bench 会分根据线程数分多组进行添删改压力测试。
rand 参数,是否随机产生key/value。
batch 批大小,分批执行读写操作,借助getall/setall进行优化。
redis中nb的函数来提升性能
上面的操作如果大家都掌握的基本算redis入门了,接下来进行进阶。会了基本比别人更胜一筹了。
1、getall()与setall()
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
2、redis管道pipeline
比如执行10次命令会打包成一个包集体发过去执行,这里实现的方式是startpipeline()开始,stoppipeline()结束中间的代码就会以管道的形式执行。这里推荐使用我们的更强的武器,autopipeline自动管道属性。管道操作到一定数量时,自动提交,默认0。使用了autopipeline,就不需要startpipeline,stoppipeline指定管道的开始结束了!
3、add与replace
add:redis中没有这个key就添加,有了就不要添加,返回false
replace:有则替换,还会返回原来的值,没有则不进行操作
add跟replace就是实现redis分布式锁的关键
redis使用技巧,经验分享
在项目的readme中,这里摘录下:
特性
在zto大数据实时计算广泛应用,200多个redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次
低延迟,get/set操作平均耗时200~600us(含往返网络通信)
大吞吐,自带连接池,最大支持1000并发
高性能,支持二进制序列化(默认用的json,json很低效,转成二进制性能会提升很多)
redis经验分享
在linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆(比方说8核心处理器,那么就部署8个实例)
把海量数据(10亿+)根据key哈希(crc16/crc32)存放在多个实例上,读写性能成倍增长
采用二进制序列化,而非常见的json序列化
合理设计每一对key的value大小,包括但不限于使用批量获取,原则是让每次网络包控制在1.4k字节附近,减少通信次数(实际经验几十k,几百k也是没问题的)
redis客户端的get/set操作平均耗时200~600us(含往返网络通信),以此为参考评估网络环境和redis客户端组件(达不到就看一下网络,序列化方式等等)
使用管道pipeline合并一批命令
redis的主要性能瓶颈是序列化、网络带宽和内存大小,滥用时处理器也会达到瓶颈
其它可查优化技巧以上经验,源自于300多个实例4t以上空间一年多稳定工作的经验,并按照重要程度排了先后顺序,可根据场景需要酌情采用!
缓存redis的兄弟姐妹
redis实现icache接口,它的孪生兄弟memorycache,内存缓存,千万级吞吐率。各应用强烈建议使用icache接口编码设计,小数据时使用memorycache实现;数据增大(10万)以后,改用redis实现,不需要修改业务代码。
提问环节聊聊大数据中redis使用的经验,问题
1、一条数据多个key怎么设置比较合理?
如果对性能要求不是很高直接用json序列化实体就好,没必要使用字典进行存储。
2、队列跟list有什么区别?左进右出的话用list还是用队列比较好?
队列其实就是用list实现的,也是基于list封装的。左进右出的话直接队列就好。redis的list结构比较有意思,既可以左进右出,也能右进左出。所以它既可以实现列表结构,也能队列,也能实现栈
3、存放多个字段的类性能一样吗?
大部分场景都不会有偏差,可能对于大公司数据量比较大的场景会有些偏差
4、可否介绍一下使用redis进行数据计算、统计的场景?
略。自己看视频吧!o(∩_∩)o 哈哈!(因为我没听清!)
5、大数据写入到数据库之后 比如数据到亿以上的时候 统计分析这块 查询这块 能不能分享些经验。
分表分库,拆分到一千万以内。
6、cpu为何暴涨?
程序员终极理念:cpu达到百分百,然后性能达到最优,尽量不要浪费。最痛恨的是:如果cpu不到百分百,性能没法提升了,说明代码有问题!
视频地址
视频已经上传至百度云,大家可以自行下载观看链接:https://pan.baidu.com/s/1sow_pljxqe8c2msbdfizea提取码:c7dp观看指南(笑笑提供)
总结
虽然redis会用,但是没有像大石头这样的大数据使用场景。今天的视频收获颇丰,可能大部分人跟我一样,没有大石头的使用场景,但是值得借鉴的经验还是很丰富的!期待下一次的精彩分享。

电流感应提高了能源应用的效率
采用视频方式的点坐标测量方法
科大讯飞发布1024计划3.0,吸引160万生态伙伴入驻
飞兆推出采用mWSaver技术的FAN6756PWM控制器
运算放大器“真正 Vos”的错误理解
Redis在大数据中的使用,Redis封装架构讲解
DM642上5/3提升小波的优化
Microchip下一代SiC MOSFET和SiCSBD的特性优势及典型应用
华为P10闪存门事件最新消息:余承东终于发声!欢迎大家带着放大镜和显微镜来看华为
一台概念8曲面荣耀Magic,一台高性价比魅焰红荣耀V9,该如何选?
微信小程序渗透测试之代理抓包
健康码测温扫码一体机赋能全国各地“科技战疫”
华为p10好还是mate9好?评测参数分析
三星的UFS4.0闪存芯片预计第三季度正式量产
干货|ECC内存为什么比普通内存更稳定?
瑞萨电子携手GE医疗(日本)日野工厂完成“AI单元解决方案”生产力优化测试
丰田不再死守“油电混动” 在新能源领域抱团加速追赶并博弈氢燃料车
赣锋锂业正在投资研发将固态锂电池商业化 并宣布成为全球锂电池回收行业领军企业之一的意向
磁浮子液位计的安装要求及安装方法
传苹果正在寻找其他的相机组件供应商