当前位置: 首页 > 网络应用技术

建筑知识干货:带您了解高含量对象处理!

时间:2023-03-06 22:21:01 网络应用技术

  全年全年渗透互联网的学生在编写代码时会有一些规则:我宁愿将请求分为10和1秒,而不会提出5秒的请求;我宁愿将对象删除到5秒的请求中; 1000 10KB,尽量避免生成1MB的对象。

  为什么?这是对“大”的恐惧。

  “大对象”是一个广义概念。它可以存储在JVM中,可以在网络上传输,也可以存在于数据库中。

  为什么大对象会影响我们的应用程序性能?有三个原因。

  接下来,XJJDOG将逐步研究一些使对象变小的策略,并专注于数据结构的操作。

  我们都知道,绳子在Java中是不变的。如果更改内容,它将生成一个新字符串。

  如果我们想在字符串中使用一部分数据,则可以使用子字符串方法。

  如图所示,当我们需要sub -string.substring会生成一个新字符串时,该字符串是通过构造函数的函数来构建的。

  在JDK7之后,此功能没有问题,但是在JDK6中,它具有内存泄漏的风险。我们可以学习这种情况并查看大对象可能存在的问题。

  这是我从jdk的官方屏幕截图。可以看出,当它创建子弦时,它不仅复制了所需的对象,而且引用了整个值。如果原始字符串相对较大,则不会释放内存如果不再使用。

  例如,可能有一些文章的MB。我们只需要抽象信息,我们不得维护整个大对象。

  这对于我们的参考很重要。如果您创建一个较大的对象并基于此对象生成其他信息。这次,请确保删除与此大对象的参考关系。

  对象的扩展在Java中很普遍。例如,StringBuilder,StringBuffer,Hashmap,ArrayList等。在摘要中,Java的集合,包括列表,SET,SET,排队,MAP等,数据不可控制。容量不足,将进行扩展操作。

  让我们首先看一下StringBuilder的扩展代码。

  如果容量不够,则将加倍内存,并使用复制源数据。

  下面是哈希图的扩展代码,容量的大小加倍。它的扩展运动要复杂得多。除了负载因子的效果外,它还需要恢复原始数据。由于不可用,因此速度会很慢。

  可以自己查看列表代码,这也是阻碍的。容量扩展策略是原始长度的1.5倍。

  因为代码中使用的频率非常高,所以如果您知道特定的数据项限制,则设置合理的初始化大小。例如,哈希图需要1024个元素和7个扩展,这将影响应用程序的性能。

  但是,应注意的是,负载因子(0.75)的集合(0.75),例如哈希姆普,初始化所需的数字/负载因子+1 =所需的数字/负载因子 +1.如果您对基础的底层不太清楚结构,您可能希望保留默认值。

  一旦遇到了非常高的业务系统,就需要经常使用用户的基本数据。由于用户的基本信息存储在另一个服务中,因此用户的基本信息每次都需要进行网络交互。更不可接受的是,即使仅需要用户的性别属性,所有用户信息查询都需要再次提取。

  为了加快数据查询速度,数据最初被缓存并放入重新介绍。查询性能得到了极大的改进,但是每次您仍然需要查询大量冗余数据时。

  原始的Redis键是这样设计的。

  这样的设计有两个问题:(1)查询其中一个字段的值,您需要查询所有JSON数据并单独进行分析。(2)更新其中一个字段的值,整个JSON的值字符串需要更新,成本更高。

  对于此大型JSON信息,可以通过分散方式来优化它,以便每个更新和查询都有一个焦点目标。

  接下来,设计了REDIS中的数据,而不是JSON结构的哈希结构:

  这样,我们使用HGET命令或HMGET命令来获取所需的数据并加快信息传输。

  您能得到更优化吗?例如,我们经常在系统中使用用户的性别数据分发一些礼物,向一些异性推荐一些朋友,并定期分发用户做一些清洁操作。或者,存储一些用户状态信息,例如在线,是否登录,是否最近发送信息等,计算活跃用户。

  是的,或者不是这两个值的操作,您可以使用位图结构来压缩。

  如代码中所示,通过判断int中的每一个,它可以节省32个布尔值!

  位图是使用位用于记录的数据结构。存储在其中的数据为0或1。Java中的相关结构类是。使用长数组实现了BITSet的底层,因此其最小容量为64。

  10亿个布尔值只需要128MB的内存。BELOW不仅是256MB的性别的判断逻辑,该逻辑可以覆盖具有10亿的ID。

  这些数据在堆中的内存中仍然太大。不幸的是,Redis还支持位图结构。如果记忆被迫,我们可以将此结构放在redis中,判断的逻辑相似。

  有许多这样的问题:给1GB存储器并提供60亿个INT数据。如何快速确定重复哪些数据?每个人都可以考虑一下。

  位图是一个相对较低的结构,在其上,还有一个称为Bloom Filter的Bloom过滤器。Buron滤波器可以确定值不存在或可能存在。

  与位图相比,它具有Hash算法的一层。因为它是一种哈希算法,将会发生冲突,因此多个值可能会落在同一位上。

  Guava中有一个Bloomfilter类,可以轻松实现相关的功能。

  上述优化方法也是将大对象变成小物体的方法。软件设计中有许多类似的想法。例如,经常使用摘要数据,并且整个文章的内容不需要查询;用户信息只需要确保信息的速度,并且完整的信息存储在一个大型大型大型大型大型大型大型大型大型大型大型大型大型式存储中。

  除了数据的水平结构外,数据还具有垂直时间维度。优化时间维度的最有效方法是热和冷的分离。

  SO称为热数据靠近用户,经常使用的数据,冷数据是访问且年龄非常长的数据。相同的复杂SQL,在数千万的数据表上运行,并在数百万个数据表上运行,前者的效果必须非常差。因此,尽管您首次在线启动时的系统会很快,但随着时间的流逝,数据量会逐渐变得慢。

  冷和冷的分离是将数据分为两部分。

  让我们简要介绍寒冷分离的三个方案。

  (1)双数据。在统一交易中输入热和冷库的插入,更新和删除。成为分布式交易。在项目的早期阶段,该方法是可行的,但是如果将其转换为某些保留系统,则基本上是不可能的。我通常直接放弃该解决方案。

  (2)编写MQ Distribution。通过MQ的发布函数,当执行数据操作时,它将无法解决,但已发送到MQ。单独启动消费过程,并将数据放入MQ中存储和热库分别。通过此方法进行的业务非常清晰,结构相对优雅。对于具有清晰结构和较低顺序要求的系统,可以采用MQ分布。但是,如果您的数据库的实体很大,则必须考虑考虑以这种方式的程序的复杂性。

  (3)与MySQL的Binlog同步,您可以使用Binlog同步。使用运河组件来维持最新的Binlog数据。与MQ结合使用,可以将数据同步到其他数据源。

  对于大对象,我们可以提供两个示例。

  像我们常用的数据库索引一样,它也是数据的重组和加速度。它可以有效地减少与磁盘的数据库相互作用的数量。它通过相似的数据结构发送最常用的数据,并存储有限的存储空间。

  RPC中通常使用的序列化。有些服务是Web服务,它采用了SOAP协议,该协议是基于XML的协议。内容很慢,效率很低。当前的大多数Web服务都使用JSON数据进行互动,JSON的效率高于肥皂。此外,每个人都应该听到Google的Protobuf。因为它是二进制协议并压缩了数据,所以性能非常出色。在数据被数据压缩后,尺寸仅为JSON的1/10,XML的1/20,但性能增加了5-100Proteobuf的设计值得一试。它通过三个段落非常紧凑地处理了数据,分析和传输速度特别快。

  对于大对象,我们有两种方法:结构纬度的优化和时间维的优化。从结构纬度的视角,通过将对象切成合适的粒度,可以将操作集中在小数据结构上以减少时间处理成本;通过压缩,转换或提取热数据,它可以避免存储大型对象。传输成本。从时间纬度的角度来看,可以通过热和冷的方式将常用的数据存储在高速设备中分离以减少数据处理和加快处理速度的收集。

  关于作者:姐妹口味小姐(xjjdog),一个公共帐户,不允许程序员绕行。基础设施和Linux的焦点。TEN的建筑学年,每天数千亿美元的交通,请与您讨论高度补偿世界,并给您不同的品味。我的个人微信XJJDOG0,欢迎加入朋友并进一步沟通。