opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场

程序猿DD

一、Redis封装架构讲解

实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面。

这里可以打开看一下,NewLife.Core里面有一个NewLife.Caching的命名空间,里面有一个Redis类,里面实现了Redis的基本功能;另一个类是RedisClient是Redis的客户端。

Redis的核心功能就是有这两个类实现,RedisClient代表着Redis客户端对服务器的一个连接。Redis真正使用的时候有一个Redis连接池,里面存放着很多个RedisClient对象。

b69e64d7464638c18b0badf1f726b8b2.png

所以我们Redis的封装有两层,一层是NewLife.Core里面的Redis以及RedisClient;另一层就是NewLife.Redis。这里面的FullRedis是对Redis的实现了Redis的所有的高级功能。

这里你也可以认为NewLife.Redis是Redis的一个扩展。

二、Test实例讲解Redis的基本使用

1、实例

打开Program.cs看下代码:

e4dc53a4b440bebacb511daebc72b119.png

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

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

44aa4302164cc0d4d62b4e4e037ee81c.png

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

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

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

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

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

623c15b1620536fbf71dbde2e008fa43.png

字典的使用:对象的话,需要把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移除。

2、压力测试

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

9bdac914b9c1e3f4c604497c61561386.png

运行的结果如下图所示:

db984544c229ef34af93f4c086790d25.png

测试就是进行get,set remove,累加等的操作。大家可以看到在我本机上轻轻松松的到了六十万,多线程的时候甚至到了一百多万。

为什么会达到这么高的Ops呢?下面给大家说一下:

Bench会分根据线程数分多组进行添删改压力测试;

rand参数,是否随机产生key/value;

batch批大小,分批执行读写操作,借助GetAll/SetAll进行优化。

3、Redis中NB的函数来提升性能

上面的操作如果大家都掌握了就基本算Redis入门了,接下来进行进阶。如果能全然吃透,差不多就会比别人更胜一筹了。

GetAll()与SetAll()

GetAll:比方说我要取十个key,这个时候可以用getall。这时候Redis就执行了一次命令。比方说我要取10个key那么用get的话要取10次,如果用getall的话要用1次。1次getall时间大概是get的一点几倍,但是10次get的话就是10倍的时间,这个账你应该会算吧?强烈推荐大家用getall。

setall跟getall相似,批量设置K-V。

setall与getall性能很恐怖,官方公布的Ops也就10万左右,为什么我们的测试轻轻松松到五十万甚至上百万?因为我们就用了setall,getall。如果get,set两次以上,建议用getall,setall。

Redis管道Pipelin

比如执行10次命令会打包成一个包集体发过去执行,这里实现的方式是StartPipeline()开始,StopPipeline()结束中间的代码就会以管道的形式执行。

这里推荐使用更强的武器,AutoPipeline自动管道属性。管道操作到一定数量时,自动提交,默认0。使用了AutoPipeline,就不需要StartPipeline,StopPipeline指定管道的开始结束了。

Add与Replace

Add:Redis中没有这个Key就添加,有了就不要添加,返回false;

Replace:有则替换,还会返回原来的值,没有则不进行操作。

Add跟Replace就是实现Redis分布式锁的关键。

三、Redis使用技巧,经验分享

在项目的Readme中,这里摘录下:

1、特性

在ZTO大数据实时计算广泛应用,200多个Redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次;

低延迟,Get/Set操作平均耗时200~600us(含往返网络通信);

大吞吐,自带连接池,最大支持1000并发;

高性能,支持二进制序列化(默认用的json,json很低效,转成二进制性能会提升很多)。

2、Redis经验分享

在Linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆(比方说8核心处理器,那么就部署8个实例)。

把海量数据(10亿+)根据key哈希(Crc16/Crc32)存放在多个实例上,读写性能成倍增长。

采用二进制序列化,而非常见的Json序列化。

合理设计每一对Key的Value大小,包括但不限于使用批量获取,原则是让每次网络包控制在1.4k字节附近,减少通信次数(实际经验几十k,几百k也是没问题的)。

Redis客户端的Get/Set操作平均耗时200~600us(含往返网络通信),以此为参考评估网络环境和Redis客户端组件(达不到就看一下网络,序列化方式等等)。

使用管道Pipeline合并一批命令。

Redis的主要性能瓶颈是序列化、网络带宽和内存大小,滥用时处理器也会达到瓶颈。

在此我向大家推荐一个架构学习交流圈:681065582 帮助突破J瓶颈 提升思维能力

其它可查优化技巧。

以上经验,源自于300多个实例4T以上空间一年多稳定工作的经验,并按照重要程度排了先后顺序,可根据场景需要酌情采用。

3、缓存Redis的兄弟姐妹

Redis实现ICache接口,它的孪生兄弟MemoryCache,内存缓存,千万级吞吐率。

各应用强烈建议使用ICache接口编码设计,小数据时使用MemoryCache实现;数据增大(10万)以后,改用Redis实现,不需要修改业务代码。

四、关于一些疑问的回复

这一Part我们会来聊聊大数据中Redis使用的经验:

Q1:一条数据多个key怎么设置比较合理?

A1:如果对性能要求不是很高直接用json序列化实体就好,没必要使用字典进行存储。

Q2:队列跟List有什么区别?左进右出的话用List还是用队列比较好?

A2:队列其实就是用List实现的,也是基于List封装的。左进右出的话直接队列就好。Redis的List结构比较有意思,既可以左进右出,也能右进左出。所以它既可以实现列表结构,也能队列,还能实现栈。

Q3:存放多个字段的类性能一样吗?

A3:大部分场景都不会有偏差,可能对于大公司数据量比较大的场景会有些偏差。

Q4:大数据写入到数据库之后,比如数据到亿以上的时候,统计分析、查询这块,能不能分享些经验。

A4:分表分库,拆分到一千万以内。

Q5:CPU为何暴涨?

A5:程序员终极理念——CPU达到百分百,然后性能达到最优,尽量不要浪费。最痛恨的是——如果CPU不到百分百,性能没法提升了,说明代码有问题。

c9de2192cbf6418c9c7db55237457439.png

虽然Redis大家会用,但是我们可能平时不会有像这样的大数据使用场景。希望本文能够给大家一些值得借鉴的经验。

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

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

相关文章

MV-LDL论文修改20211115(B-Y Rong)

1、摘要 8-10句,每句话15-25个单词 (1)我们的研究领域。。。 (2)已有的工作。。。 (3)有什么缺点。。。(motivation) (4)In this paper … &#…

python数字类型floatcomplexint_浅谈python 四种数值类型(int,long,float,complex)

Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下。数字数据类型存储数值。他们是不可改变的数据类型,这意味着改变数字数据…

NSA-LDL论文修改建议20211116(R-T Bai)

1、每一个部分应该有引入 This section first reviews the definition of the rating system. Second, we present the problem statement for collaborative filtering (CF). Finally, we analyze existing approaches for estimating MGBR. 2、the basic statistics of the 1…

python urllib发送post请求_python爬虫 urllib模块发起post请求过程解析

urllib模块发起的POST请求案例:爬取百度翻译的翻译结果1.通过浏览器捉包工具,找到POST请求的url针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具。查看百度翻译针对某个字条发送ajax请求,所对应的url点击clear按钮可以…

通过一个例子来理解二维码纠错机制

1 例子 假设:原始数据为8位,纠错码为6位,原始信息由原始数据纠错码。 在传输过程中,由于信息干扰等原因,导致原始信息被污染,被污染后有两位数据被修改。 说明编码原始信息001010011011100被污染后的信息…

two sum python_Python | Leetcode 之 Two Sum

说来惭愧,到现在才开始刷Leetcode,但迟到总比不到好。题目:Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution,…

Data Poisoning Attacks to Deep Learning Based Recommender Systems论文解读

1 摘要 在这项工作中,作者对基于深度学习的推荐系统的数据中毒攻击进行了首次系统研究。攻击者的目标是操纵推荐系统,以便向许多用户推荐攻击者选择的目标项目。为了实现这一目标,作者将精心设计的评分注入到推荐系统中的假用户。具体来说&a…

python爬虫视频 下载 黑马_Python爬虫能爬视频么(python爬虫零基础视频教程)

Python爬虫能爬视频么他视频没有的,但是跑了之后你要处理这个视频,就是问题的?你只需要,得到视频的播放地址,还是要把视频完整的下载到本地的。如果只是爬那个视频的下载地址,很简单,如果要下载…

机器学习+深度学习相关课程地址总结

1 吴恩达老师 机器学习课程视频链接:https://www.bilibili.com/video/BV164411b7dx?fromsearch&seid8357728122787183773&spm_id_from333.337.0.0作业答案:https://github.com/Ayatans/Machine-Learning-homework深度学习课程:吴恩…

黑马商城项目源代码_Python学习路线图--Python框架与项目

Python学习路线图的Python框架部分主要有Django框架和Flask框架,学完这一部分就可以去找Web全栈工程师的工作了,独立开发前端和后端业务。Python学习路线图的Django框架部分需要掌握Web主流框架-Django的使用;可根据Web框架设计,开…

Membership Inference Attacks Against Recommender Systems论文解读

0 摘要 推荐系统通常针对高度敏感的用户数据进行训练,因此推荐系统潜在的数据泄露可能会导致严重的隐私问题。 本文首次尝试通过成员推理的角度来量化推荐系统的隐私泄漏。 与针对机器学习分类器的传统成员推理相比,本文的攻击面临两个主要差异。 首先&…

python分类预测降低准确率_十分钟掌握python机器学习特征选择

十分钟掌握python机器学习特征选择-1.jpg (33.2 KB, 下载次数: 0)2018-6-26 23:01 上传在机器学习中,特征选择是实践中的一步, 帮你在所有特征中选择对结果贡献最多的特征。 显然, 使用不相关数据会减少模型的精确性,尤其是线性算…

k近邻推荐用到的各种距离

1 kkk-近邻推荐原理 2 各种距离 2.1 欧几里得距离 d12(x1−x2)2(y1−y2)2d_{12} \sqrt{(x_{1} - x_{2})^2 (y_{1} - y_{2})^2}d12​(x1​−x2​)2(y1​−y2​)2​ 缺点:欧式距离是一种常用的距离度量,但它并不是尺度不变的,这意味着所计算…

python 分类变量回归_极简Python带你探索分类与回归的奥秘

为何使用人工智能和机器学习?地球的未来在于人工智能和机器学习。如果对这些技术一无所知,人们很快会发现自己落伍了。世界发展日新月异,每天都发生着不可思议的变化。在人工智能和机器学习中,有许多实现和技术能够解决实时问题。…

Fast Matrix Factorization for Online Recommendation with Implicit Feedback论文代码分析

1 数据结构 userCount&#xff1a;用户数 itemCount&#xff1a;项目数 user_ratings&#xff1a;ArrayList<ArrayList>&#xff0c; 问&#xff1a;此处为什么要用二维数组&#xff1f; 答&#xff1a;第1维是用户&#xff0c;第2维是用户对所有项目的评分。 testRatin…

stacking模型融合_【干货】比赛后期大招之stacking技术分享

各位同学大家好&#xff0c;我是本次参赛选手李博&#xff0c;比赛ID是深蓝&#xff08;DeePBluE&#xff09;。现在就读于北京邮电大学&#xff0c;是一名研一的在校生&#xff0c;研究方向是数据分析和机器学习。是的&#xff0c;我又来分&#xff08;na&#xff09;享&#…

多stream_基础之Lambda和Stream的邂逅

基础之Lambda和Stream的邂逅show me the code and take to me,做的出来更要说的明白GitHub项目JavaHouse同步收录喜欢就点个赞呗! 你的支持是我分享的动力&#xff01;引入是否有遇到看不懂身边同事代码的情况&#xff0c;是否有被面试官问到 Java 新特性不懂的情况。我掐指一算…

注意力机制--转载自我的学生隆兴写的博客

原文链接为&#xff1a;https://a-egoist.com/posts/a44b8419/&#xff0c;学生自己搭建的博客&#xff0c;点赞&#xff01; 1 Attention 1.1 什么是 Attention 灵长类动物的视觉系统中的视神经接受了大量的感官输入。在检查视觉场景时&#xff0c;我们的视觉神经系统大约每…

python正弦波和等腰三角波_正弦波脉宽调制(SPWM)原理

1、QPWM的概念 在进行脉宽调制时&#xff0c;使脉冲系列的占空比按正弦规律来安排。当正弦值为最大值时&#xff0c;脉冲的宽度也最大&#xff0c;而脉冲间的间隔则最小&#xff0c;反之&#xff0c;当正弦值较小时&#xff0c;脉冲的宽度也小&#xff0c;而脉冲间的间隔则较大…

推荐系统--矩阵分解(1)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 1 引入 一个矩阵可以分解为两个小矩阵的乘积&#xff0c;以音乐为例&#xff0c;利用潜在特征向量来给用户和音乐打上标签&#xff…