Redis基本使用及百亿数据量中的使用技巧分享

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html

  • 作者:大石头

  • 时间:2018-11-10 晚上20:00

  • 地点:钉钉群(组织代码BKMV7685)QQ群:1600800

  • 内容: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对象。

640?wx_fmt=png
所以我们Redis的封装有两层,一层是NewLife.Core里面的Redis以及RedisClient。另一层就是NewLife.Redis。这里面的FullRedis是对Redis的实现了Redis的所有的高级功能。这里你也可以认为NewLife.Redis是Redis的一个扩展。

Test实例讲解Redis的基本使用

实例

打开Program.cs看下代码

640?wx_fmt=png

这里XTrace.UseConsole();是向控制台输出日志,方便调试使用查看结果。

接下来看第一个例子Test1。具体的我都在代码中进行了注释,大家可以看下

640?wx_fmt=png

  1. Set的时候如果是字符串或者字符数据的话Redis会直接保存起来(字符串内部机制也是保存二进制),如果是其他类型会默认进行json序列化然后再保存起来

  2. Get的时候如果是字符串或者字符数据会直接获取,如果是其他类型会进行json反序列化

  3. Set第三个参数过期时间单位是秒。

  4. vs调试小技巧,按F5或者直接工具栏“启动”会编译整个解决方案会很慢(VS默认),可以选中项目然后右键菜单选择调试->启动新实例。会只编译将会用到的项目,这样对调试来说会快很多。

  5. 大家运行调试后可以看到控制台输出的内容:向右的箭头=》是ic.Log=XTrace.Log输出的日志

    640?wx_fmt=png

  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移除。

压力测试

接下来看第四个例子,我们直接做压力测试,代码如下:

640?wx_fmt=png

运行的结果如下图所示:

640?wx_fmt=png

测试就是进行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

  1. Redis管道Pipeline

比如执行10次命令会打包成一个包集体发过去执行,这里实现的方式是StartPipeline()开始,StopPipeline()结束中间的代码就会以管道的形式执行。这里推荐使用我们的更强的武器,AutoPipeline自动管道属性。管道操作到一定数量时,自动提交,默认0.使用了不需要使用AutoPipeline,就不需要StartPipeline,StopPipeline指定开始结束了!

  1. 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不到百分百,性能没法提升了,说明代码有问题!

总结

虽然Redis会用,但是没有像大石头这样的大数据使用场景。今天的视频收获颇丰,可能大部分人跟我一样,没有大石头的使用场景,但是值得借鉴的经验还是很丰富的!期待下一次的精彩分享。同时附上QQ群:1600800。可以共同交流使用经验!

原文地址: https://www.cnblogs.com/yilezhu/p/9941208.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Subsequence Pair

题目 题目描述 题意&#xff1a; X和Y两个字符串&#xff0c;两个字符串各取子序列X1和Y1&#xff0c;问X1<Y1的情况下X1和Y1的长度和最长是多少&#xff1f; 比如例子&#xff1a; zazxwabzczazazd abcaa 第一个字符串选取子序列为azxwabzczazazd 第二个为bcaa azxwabzc…

NOI.AC#2144-子串【SAM,倍增】

正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa。将字符串sss的所有本质不同子串降序排序后&#xff0c;求有多少个区间[l,r][l,r][l,r]使得子串sl,rs_{l,r}sl,r​排名等于al∼ra_{l\sim r}al∼r​的和。 1≤n≤21051\leq n\leq 2\times…

codeforces1481 E. Sorting Books(贪心+dp)

大佬题解1 大佬题解2 E. Sorting Books 首先每本书都移动&#xff0c;移动次数是n能够满足题意。如果某些书不用移动&#xff0c;说明把隔开他们中间的书全部抽走后自然成组。 对于每本书全部移动的情况&#xff0c;显然我们可以选择一种颜色的书全部不案&#xff0c;移动别…

【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)

本篇将介绍如何扩展Ocelot中间件实现自定义网关&#xff0c;并使用2种不同数据库来演示Ocelot配置信息存储和动态更新功能&#xff0c;内容也是从实际设计出发来编写我们自己的中间件&#xff0c;本文内容涵盖设计思想内容和代码内容&#xff0c;我希望园友们最好跟着我这个文章…

Manacher 例题讲解

文章目录HDU 4513 吉哥系列故事——完美队形II题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3613 Best Reward题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3068 最长回文题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 5371 Hotarus problem题意&…

NOI.AC#2139-选择【斜率优化dp,树状数组】

正题 题目链接:http://noi.ac/problem/2139 题目大意 给出nnn个数字的序列aia_iai​。然后选出一个不降子序列最大化子序列的aia_iai​和减去没有任何一个数被选中的区间数量。 1≤n≤106,1≤ai≤1081\leq n\leq 10^6,1\leq a_i\leq 10^81≤n≤106,1≤ai​≤108 解题思路 嗯…

codeforces1485 E. Move and Swap(dp)

E. Move and Swap Heltion 由于红色硬币向下一层走的时候只能走儿子&#xff0c;而蓝色无限制&#xff08;对后续操作无影响&#xff09;&#xff0c;于是考虑下面表示 状态表示&#xff1a;fuf_ufu​表示当前是红色硬币&#xff0c;向下一层走后的最大价值。 状态转移&#…

一个技术管理者的苦逼【技术管理漫谈】

希望给你3-5分钟的碎片化学习&#xff0c;可能是坐地铁、等公交&#xff0c;积少成多&#xff0c;水滴石穿&#xff0c;谢谢关注。角色转变 从工程师转技术管理这两年&#xff0c;好比头马变成车夫&#xff0c;除了角色认知的转变&#xff0c;还要看方向&#xff0c;定计划。不…

KMP Trie 例题讲解

文章目录HDU 4763 Theme Section题意&#xff1a;题解&#xff1a;代码&#xff1a;POJ 3630 Phone List题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 3746 Cyclic Nacklace题意&#xff1a;题解&#xff1a;代码&#xff1a;HDU 2087 剪花布条题意&#xff1a;题解&a…

P4640-[BJWC2008]王之财宝【OGF,Lucas定理】

正题 题目链接:https://www.luogu.com.cn/problem/P4640 题目大意 nnn种物品&#xff0c;其中ttt种物品是有个数限制的&#xff0c;第iii种限制为bib_ibi​&#xff0c;求选出mmm个物品的方案数%p\% p%p的值 1≤n,m,bi≤109,0≤t≤15,p∈[1,105]∩Pri1\leq n,m,b_i\leq 10^9,0…

[机器翻译]参与 Microsoft 开放源代码软件项目的方式

下面是一个事实&#xff1a;Microsoft 托管在 GitHub&#xff0c;包括.NET 编译器平台&#xff0c;也称为"Roslyn"具有多达 4 万行代码等一些相当大的大约 2,000 开放源代码软件 (OSS) 存储库。很多开发人员的代码将更改提交到数以百万计的计算机运行的项目可能会令人…

codeforces1485 F. Copy or Prefix Sum(dp)

F. Copy or Prefix Sum Venice technique简要就是懒标记思想。 由于前缀和数组和原数组一一对应&#xff0c;这里我们选择求aia_iai​的前缀和数组的方案数&#xff08;下面aia_iai​表示原题数组的前缀和&#xff09; 不难得知原题目的两个条件即 biai−ai−1→aibiai−1b_ia…

【蓝桥杯】 2018年国赛 矩阵求和

题目 题目&#xff1a; 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 n 行 n 列&#xff0c;行和列的编号都从1算起。 其中第 i 行第 j 个元素的值是 gcd(i, j)的平方&#xff0c; gcd 表示最大公…

F - GCD or MIN(数论)

F - GCD or MIN 首先gcd⁡(x,y)≤min⁡(x,y)\gcd(x,y)\leq \min(x,y)gcd(x,y)≤min(x,y) 数组中任意2个数的gcd可能是一种方案&#xff0c;任意3个数的gcd可能是一种方案… 如果我们能够把原数组任意个数的gcd全部列出来&#xff0c;能够满足题意的数一定在这些数之中&#…

P4199-万径人踪灭【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P4199 题目大意 给出一个只包含a,ba,ba,b的字符串 求有多少个不连续的回文子序列&#xff08;字母回文&#xff0c;位置对称&#xff09; 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 这个不连续一看就很nt&#xff0c;考…

被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾

前天, 2018年11月10日, 广州图书馆\微软云开发者社区\广东职业教育信息化研究会\珠三角技术沙龙在广州图书馆负一层1号报告厅搞了一场”微软最有价值专家(MVP)广州分享会 - MonkeyFest 2018广州分享会”. 这是在广州图书馆官方微信公众号上的活动报名链接: https://mp.weixin.q…

[蓝桥杯][2017年第八届真题]发现环

题目链接 题目描述 小明的实验室有N台电脑&#xff0c;编号1~N。原本这N台电脑之间有N-1条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时&#xff0c;管理员误操作使得某两台电脑之间增…

P7323-[WC2021]括号路径【并查集,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图。每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu->vu−>v有一个类型www的左括号边&#xff0c;v−>uv->uv−>u有一个类型www的右括号边。 求图中有多少点对满足它们之间…

P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

P3565 [POI2014]HOT-Hotels 参考题解 题目大意&#xff1a; 给定一棵树&#xff0c;在树上选 3 个点&#xff0c;要求两两距离相等&#xff0c;求方案数。 三个点树上两两距离为d存在下面两种情况 某个点三个子树&#xff08;保证该点是LCA&#xff09;中分别由三个点距离它为…

C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

差点造了一整个轮子.Net Framework 4.5 里面的RSA功能&#xff0c;并未提供简单对PEM密钥格式的支持&#xff08;.Net Core有咩&#xff1f;&#xff09;&#xff0c;差点&#xff08;还远着&#xff09;造了一整个轮子&#xff0c;就为了支持PEM PKCS#8、PKCS#1格式密钥对的导…