滥用编程内存的现象为什么如此之多
author:一佰互联 2019-03-25   click:372

     今天再次双叒叕想把小圆,但这一次真的不是粉,但由于现场,非常典型的技术设计。小爆发稠密环春节后不久,然后遇到一些技术瓶颈和问题,吴先生带几个朋友去做技术顾问,帮助员工,我幸运的成为其中之一。第一次处理慢两个数据库查询的问题,证明了我对数据库索引的理解仍然有效,但它不是一个关键的问题,因为系统加载和瓶颈不在这里。

 

     互相合作,我们将加载程序进行采样分析,并将实施一些开销略大的脚本加载,通过性能分析工具拆除,然后注意到大多数的开销请求,页面的脚本用户输入一个特定的圈子,这里最昂贵的部分,是一个频繁请求内存。局限于信息安全考虑,技术描述太多细节,我很抱歉,我不会,我只是基于这种情况下,发展理论关于常见的设计错误,一些设计的思维方法。

 

     在这种情况下,我发现一个现象,事实上,很多小型创业公司可能面临的现象,一些技术人员,了解的开销并不完整,不够坚固,将会有一些简单的选项卡式的思考,例如,数据库往往是负载的性能瓶颈,并使用内存数据存储,可以避免数据库的瓶颈,从而实现促进性能和响应性。

 

     这个想法,没有错,因为当我们遇到数据库的瓶颈,通过内存数据存储优化,但不能简化问题。并不是说所有的场合,记忆存储比数据库。之前,我给一个我们自己的,我们商店用户会话,使用mysql堆类型数据表,这是一个内存表,表访问的频率非常高,但因为过于频繁,因此,锁表严重,经常堵塞,导致系统数据库等待整张卡片,当然,这可以被认为是一个新手,没有经验的结果innodb,行级锁,问题解决了。

 

     从表到物理内存表,性能下降,但由于行级锁锁表比水平更可靠,在频繁的写作,如果我/o(请注意这个前提哦),所以,实际上,可靠性更好。说,关系数据库中,我们经常使用数据库结构,其索引类型,几乎是btree,具体的,我不是很精通,在索引优化的情况下,其查询效率,往往是log2(N),但一些内存表结构,哈希索引,其查询效率,通常倾向于1,这是解决搜索,这为你清除键-值查询,是绝对有优势,(当然,根据一些信息披露的安全测试,在特殊情况下,可以查询效率下降,但关键的这不是今天要讲的,是列在这里,免得有人错了。

 

     )但有两个扩展问题1:哈希索引只适用于关键的价值这样一个简单的查询,查询和关系数据库可以使更多的条件。实际上是哈希索引应用空间是非常有限的。它也不支持排序操作,etc.Question2:并不是所有的内存数据表结构都是散列索引,如前面提到的mysql堆表结构,实际上也是一个关系数据库,btree类型的索引。

 

     另一个特别的,复述是一种常见的结构,有序集合,因为这种结构支持排序,支持快速排名统计,因此,应用范围也很宽,但是被指定否则,表结构,成本远远大于散列结构的访问。有序集是一个很好的替代关系数据库的应用场景,场景的排名,风前丹尼尔提到技术是典型的云,一个糟糕的游戏,排名数据库挂死,其中一个很常见的问题。

 

     通常使用数据库来排名,随便写一个,理解SQL可以理解它。Selectcountfromgamepointswherepoints(*)在mypoints美元。+1的统计数据,是我的排名。但是SQL的成本如何,这是一个非常经典的数据库负载测试,在您使用点作为索引的前提下,与秩线性负载相关的成本,也就是说,如果你排名,负载几乎可以忽略,如果你排名,负载增加。

 

     无论任何数据引擎、myisam或innodb,是否mysql或使用。如果技术架构,不要改变产品设计,纯SQL优化,一个字,不。这种情况下,使用复述,zrank处理,引导的解决方案,没有压力。这是这个结构是最有价值的地方。但一切都是有条件的,插入、更新、修改系统开销远远高于其他复述,数据结构。和它的价值,在这种情况下,只有绝对的优势。

 

     说,席子,回到今天的场景,一个小圆的圆的主页,究竟出了什么问题。圆我做小秘密的研究和开发,数据库是不够自信的使用,大量使用内存数据存储和加载,为了某种需求,也大量的使用是一个有序集合的类型,说实话,这个内存处理,和数据库处理,同样的请求,性能已基本没有优势。

 

     但问题不在这里,但他们可能没有意识到,请求频率。打开主页的一个小秘密,去记忆阅读社区最新的帖子,这是一种常见的请求,可以理解,那么可怕的,基于每个帖子周期查询帖子的评论,所有的赞美,赞美,所有的文件,所有的图像;然后,根据每一个评论,然后查询相关的图片、文件u2026仅仅是,打开一个页面,几十甚至上百次查询请求的记忆,而这些成本,在我的理解,是毫无意义的。

 

     如果我写一个数据库查询,第一个SQL查询帖子,后面使用wherepostidin(u2026)。,四个SQL查询(查询评论,查询附件,图片)。的循环反复询问,很坏,系统负载的开销是没有意义的,一文不值。所以,暴露了这里的问题是什么?实际上,系统设计,应该有一个基本概念,是如何尽可能减少不必要的请求,减少不必要的成本。

 

     与数据库的内存,没有绝对的对或错,但应该基于一个原则,就是如何让系统更高效地运行。许多程序员面向对象编程之前,经常不注意的成本和细节,与数据库查询,也经常有类似的问题,例如,我读一本书名单,首先通过一个搜索条件搜索出这本书的id,这一步应该是够了,但因为面向对象啊,叫本id的书,作者的名字,页面的数量,介绍,是一个对象在某种程度上,然后变成一个循环不断向数据库请求,事实上,这些请求是没有意义的,第一个查询完全可以得到,一个接一个地请求是完全不必要的,但这种情况下,几乎每一次新技术,再次犯这样的错误。

 

          回到上面的问题,何时使用内存,使用数据库时,我们使用的内存,有他们的一些原则。首先,内存使用,根据你的业务场景,而不是基于数据结构。这是什么概念,记忆是加快对的,是正确的减少负载,内存的设计,是基于我的请求的业务场景设计的追求,而不是内存作为一个数据库。小环的情况下,如果我想用记忆,我有点极端,社区主页我想使用内存处理,应该出现,对不起,网络id作为键,首页应该出现的价值内容。

 

     这是一个请求,都赢得了龋齿(这不是最后的计划,将在下面继续说)所以如何处理数据发生变化时,所有空的。基本逻辑(不是最终的逻辑),所以所有数据更改更改数据库,并自动清除相应的内存。前端请求读取内存是否有这些信息的一部分,所以,直接显示,没有话说,从数据库生成内容和写作的内存,显示。

 

     频率比第二,阅读和写作是至关重要的,逻辑的设计,是基于阅读的频率通常写,写频率非常高,但是如果频率接近和阅读,即便如此,这个逻辑,是没有意义的。所以使用内存读写频率应该有清醒的认识,可能会使用内存效率降低。第三,基于写频率做繁忙的备用分裂是什么意思,如上述,我说所有堆一个值,在这个场景中,实际上是错误的,它只是意味着,商业设计理念的要求,为什么不呢?

 

     文章发表,一般来说,不是很多,经常对吧。评论,这些都是很好的照片,并不多。伸出大拇指非常频繁的操作是正确的。刚刚提到的,写的频率太高了,所以将这记忆产生额外的开销非常大,和不必要的,当时如何处理?伸出大拇指突显出来。

 

     每个帖子伸出大拇指,可以单独一个关键,哈希表的内存的值。那时,主页,首先通过内存访问一个大数组,包括所有的主页文章,评论,图片链接、作者信息、配件等等。然后,每个帖子的经验信息的循环。等待,只是说不环路增益?这是光你看到他们两人,和经验数据,是一种哈希索引,查询开销远低于有序的集合类型。

 

     因此,伸出大拇指,频繁操作,它不涉及其他主页数据更新、繁忙的闲置,减少负载高请求尽快。第四,请求合并,异步处理上述"基本逻辑(不是最终的逻辑),所有数据更改,更改数据库,并自动清除相应的内存。有一个洞,如果数据更改写入规模特别频繁,数据库仍不熬夜。请求合并,异步处理,例如,伸出大拇指尤其频繁操作,所以,这个请求,可以扔进一个内存队列,同时改变相应的键-值缓存、声纳、队列结构,它是一个特定的数据结构。

 

     然后在后台定时cron,读取内存数据队列,在那个时候,很多请求可以组合,和有很多SQLSQL的可能。我曾经有一个习惯,在cron将计算写整合速度,该指数也很重要。更典型的是,统计后多次访问,例如,如果你不做合并每个阅读一篇数+1操作,但在一个队列,时间背景合并,合并效应是非常重要的,往往可以超过70%。

 

     (热post占领大部分的交通)以上,一些思维方式和原则是我们使用过的记忆是经常使用,所以核心的负载,一个清晰的系统开销,请求的无谓,不必要的请求是敏感的,没有什么特别理解或高级技能,理解是基于一些简单的系统,做出判断和选择。我总是说我经济适用的建筑师,其实我不是一个训练,没有算法,和丹尼尔比angelazhu等算法,没有可比性,但面临很多的非常基本的技术,实际上是用最简单的思维去思考,去理解,系统开销集中在哪里,他们在哪里使用,这些成本是必要的,然后想想,如何减少请求,减少不必要的成本,不能减少,如何实现分布和扩展。

 

     (本文“滥用编程内存的现象为什么如此之多”责任编辑重庆网络营销)

转载请注明出处。