精华内容
下载资源
问答
  • 哪个选项能改变turtle画笔的运行方向?
    千次阅读
    2020-12-16 10:18:38

    【单选题】哪个选项是下面代码的输出结果? d= {'a': 1, 'b': 2, 'b': '3'} print(d['b'])

    【单选题】以下不是Python序列类型的是:

    【单选题】查看对象内存地址的Python内置函数是

    【单选题】下列Python赋值语句中不合法的是

    【单选题】若 k 为整数,下述 while 循环执行的次数为:____________ k=1000 while k>1: print(k) k=k//2

    【多选题】s="Python" 则下列不正确的为:

    【判断题】while循环只能实现无限循环的编程

    【填空题】表达式 'abcab'.replace('a','yy') 的值为 ___________ 。

    【填空题】已知列表对象 x = ['11', '2', '3'] ,则表达式 max(x) 的值为 ___________ ; 表达式 min(x) 的值为 _________________ 。

    【单选题】给定列表ls = [1, 2, 3, "1", "2", "3"],其元素包含2种数据类型,哪个选项是列表ls的数据组织维度?

    【填空题】表达式 'The first:{1}, the second is {0}'.format(65,97) 的值为 ______________________________ 。

    【单选题】下面程序的执行结果是 ______________ 。 s = 0 for i in range(1,101): s += i if i == 50: print(s) break else: print(1)

    【填

    更多相关内容
  • 分不清ARM和X86架构,别跟我说你懂CPU!

    万次阅读 多人点赞 2017-03-08 10:21:48
    随便逮住一个人问他知知道CPU,我想他的答案一定会是肯定的,但是如果你再问他知道ARM和X86架构么?这两者的区别又是什么?绝大多数的人肯定是一脸懵逼。今天小编就带你深入了解CPU的这两大架构:ARM和X86。以后...
    

    随便逮住一个人问他知不知道CPU,我想他的答案一定会是肯定的,但是如果你再问他知道ARM和X86架构么?这两者的区别又是什么?绝大多数的人肯定是一脸懵逼。今天小编就带你深入了解CPU的这两大架构:ARM和X86。以后出去装X就靠它了!


    重温下CPU是什么鬼

    中央处理单元(CPU)主要由运算器、控制器、寄存器三部分组成,从字面意思看运算器就是起着运算的作用,控制器就是负责发出CPU每条指令所需要的信息,寄存器就是保存运算或者指令的一些临时文件,这样可以保证更高的速度。

    CPU有着处理指令、执行操作、控制时间、处理数据四大作用,打个比喻来说,CPU就像我们的大脑,帮我们完成各种各样的生理活动。因此如果没有CPU,那么电脑就是一堆废物,无法工作。移动设备其实很复杂,这些CPU需要执行数以百万计的指示,才能使它向我们期待的方向运行,而CPU的速度和功率效率是至关重要的。速度影响用户体验,而效率影响电池寿命。最完美的移动设备是高性能和低功耗相结合。


    要了解X86和ARM,就得先了解复杂指令集(CISC)和精简指令集(RISC)

    从CPU发明到现在,有非常多种架构,从我们熟悉的X86,ARM,到不太熟悉的MIPS,IA64,它们之间的差距都非常大。但是如果从最基本的逻辑角度来分类的话,它们可以被分为两大类,即所谓的“复杂指令集”与“精简指令集”系统,也就是经常看到的“CISC”与“RISC”。 Intel和ARM处理器的第一个区别是,前者使用复杂指令集(CISC),而后者使用精简指令集(RISC)。属于这两种类中的各种架构之间最大的区别,在于它们的设计者考虑问题方式的不同。

    我们可以继续举个例子,比如说我们要命令一个人吃饭,那么我们应该怎么命令呢?我们可以直接对他下达“吃饭”的命令,也可以命令他“先拿勺子,然后舀起一勺饭,然后张嘴,然后送到嘴里,最后咽下去”。从这里可以看到,对于命令别人做事这样一件事情,不同的人有不同的理解,有人认为,如果我首先给接受命令的人以足够的训练,让他掌握各种复杂技能(即在硬件中实现对应的复杂功能),那么以后就可以用非常简单的命令让他去做很复杂的事情——比如只要说一句“吃饭”,他就会吃饭。但是也有人认为这样会让事情变的太复杂,毕竟接受命令的人要做的事情很复杂,如果你这时候想让他吃菜怎么办?难道继续训练他吃菜的方法?我们为什么不可以把事情分为许多非常基本的步骤,这样只需要接受命令的人懂得很少的基本技能,就可以完成同样的工作,无非是下达命令的人稍微累一点——比如现在我要他吃菜,只需要把刚刚吃饭命令里的“舀起一勺饭”改成“舀起一勺菜”,问题就解决了,多么简单。这就是“复杂指令集”和“精简指令集”的逻辑区别。

    从几个方面比较ARM与X86架构

    Intel和ARM的处理器除了最本质的复杂指令集(CISC)和精简指令集(RISC)的区别之外,下面我们再从以下几个方面对比下ARM和X86架构。


    一、制造工艺

    ARM和Intel处理器的一大区别是ARM从来只是设计低功耗处理器,Intel的强项是设计超高性能的台式机和服务器处理器。

    一直以来,Intel都是台式机的服务器行业的老大。然而进入移动行业时,Intel依然使用和台式机同样的复杂指令集架构,试图将其硬塞入给移动设备使用的体积较小的处理器中。但是Intel i7处理器平均发热率为45瓦。基于ARM的片上系统(其中包括图形处理器)的发热率最大瞬间峰值大约是3瓦,约为Intel i7处理器的1/15。其最新的Atom系列处理器采用了跟ARM处理器类似的温度控制设计,为此Intel必须使用最新的22纳米制造工艺。一般而言,制造工艺的纳米数越小,能量的使用效率越高。ARM处理器使用更低的制造工艺,拥有类似的温控效果。比如,高通晓龙805处理器使用28纳米制造工艺。

    二、64位计算

    对于64位计算,ARM和Intel也有一些显著区别。Intel并没有开发64位版本的x86指令集。64位的指令集名为x86-64(有时简称为x64),实际上是AMD设计开发的。Intel想做64位计算,它知道如果从自己的32位x86架构进化出64位架构,新架构效率会很低,于是它搞了一个新64位处理器项目名为IA64。由此制造出了Itanium系列处理器。

    同时AMD知道自己造不出能与IA64兼容的处理器,于是它把x86扩展一下,加入了64位寻址和64位寄存器。最终出来的架构,就是 AMD64,成为了64位版本的x86处理器的标准。IA64项目并不算得上成功,现如今基本被放弃了。Intel最终采用了AMD64。Intel当前给出的移动方案,是采用了AMD开发的64位指令集(有些许差别)的64位处理器。


    而ARM在看到移动设备对64位计算的需求后,于2011年发布了ARMv8 64位架构,这是为了下一代ARM指令集架构工作若干年后的结晶。为了基于原有的原则和指令集,开发一个简明的64位架构,ARMv8使用了两种执行模式,AArch32和AArch64。顾名思义,一个运行32位代码,一个运行64位代码。ARM设计的巧妙之处,是处理器在运行中可以无缝地在两种模式间切换。这意味着64位指令的解码器是全新设计的,不用兼顾32位指令,而处理器依然可以向后兼容。

    三、异构计算

    ARM的big.LITTLE架构是一项Intel一时无法复制的创新。在big.LITTLE架构里,处理器可以是不同类型的。传统的双核或者四核处理器中包含同样的2个核或者4个核。一个双核Atom处理器中有两个一模一样的核,提供一样的性能,拥有相同的功耗。ARM通过big.LITTLE向移动设备推出了异构计算。这意味着处理器中的核可以有不同的性能和功耗。当设备正常运行时,使用低功耗核,而当你运行一款复杂的游戏时,使用的是高性能的核。


    这是什么做到的呢?设计处理器的时候,要考虑大量的技术设计的采用与否,这些技术设计决定了处理器的性能以及功耗。在一条指令被解码并准备执行时,Intel和ARM的处理器都使用流水线,就是说解码的过程是并行的。

    为了更快地执行指令,这些流水线可以被设计成允许指令们不按照程序的顺序被执行(乱序执行)。一些巧妙的逻辑结构可以判断下一条指令是否依赖于当前的指令执行的结果。Intel和ARM都提供乱序执行逻辑结构,可想而知,这种结构十分的复杂,复杂意味着更多的功耗。

    Intel处理器由设计者们选择是否加入乱序逻辑结构。异构计算则没有这方便的问题。ARM Cortex-A53采用顺序执行,因此功耗低一些。而ARM Cortex-A57使用乱序执行,所以更快但更耗电。采用big.LITTLE架构的处理器可以同时拥有Cortex-A53和Cortex-A57核,根据具体的需要决定如何使用这些核。在后台同步邮件的时候,不需要高速的乱序执行,仅在玩复杂游戏的时候需要。在合适的时间使用合适的核。

    此外,ARM具有其与X86架构电脑不可对比的优势,该优势就是:功耗。

    其实它们的功耗主要是由这几点决定的。首先,功耗和工艺制程相关。ARM的处理器不管是哪家主要是靠台积电等专业制造商生产的,而Intel是由自己的工厂制造的。一般来说后者比前者的工艺领先一代,也就是2-3年。如果同样的设计,造出来的处理器应该是Intel的更紧凑,比如一个是22纳米,一个是28纳米,同样功能肯定是22纳米的耗电更少。

    那为什么反而ARM的比X86耗电少得多呢。这就和另外一个因素相关了,那就是设计。

    设计又分为前端和后端设计,前端设计体现了处理器的构架,精简指令集和复杂指令集的区别是通过前端设计体现的。后端设计处理电压,时钟等问题,是耗电的直接因素。先说下后端怎么影响耗电的。我们都学过,晶体管耗电主要两个原因,一个是动态功耗,一个是漏电功耗。动态功耗是指晶体管在输入电压切换的时候产生的耗电,而所有的逻辑功能的0/1切换,归根结底都是时钟信号的切换。如果时钟信号保持不变,那么这部分的功耗就为0。这就是所谓的门控时钟(Clock Gating)。而漏电功耗可以通过关掉某个模块的电源来控制(Power Gating)。当然,其中任何一项都会使得时钟和电源所控制的模块无法工作。他们的区别在于,门控时钟的恢复时间较短,而电源控制的时间较长。此外,如果条单条指令使用多个模块的功能,在恢复功能的时候,并不是最慢的那个模块的时间,而可能是几个模块时间相加,因为这牵涉到一个上电次序(Power Sequence)的问题,也就是恢复工作时候模块间是有先后次序的,不遵照这个次序,就无法恢复。而遵照这个次序,就会使得总恢复时间很长。所以在后端这块,可以得到一个结论,为了省电,可以关闭一些暂时不会用到的处理器模块。但是也不能轻易的关闭,否则一旦需要,恢复的话会让完成某个指令的时间会很长,总体性能显然降低。此外,子模块的门控时钟和电源开关通常是设计电路时就决定的,对于操作系统是透明的,无法通过软件来优化。

    再来看前端。ARM的处理器有个特点,就是乱序执行能力不如X86。换句话说,就是用户在使用电脑的时候,他的操作是随机的,无法预测的,造成了指令也无法预测。X86为了增强对这种情况下的处理能力,加强了乱序指令的执行。此外,X86还增强了单核的多线程能力。这样做的缺点就是,无法很有效的关闭和恢复处理器子模块,因为一旦关闭,恢复起来就很慢,从而造成低性能。为了保持高性能,就不得不让大部分的模块都保持开启,并且时钟也保持切换。这样做的直接后果就是耗电高。而ARM的指令强在确定次序的执行,并且依靠多核而不是单核多线程来执行。这样容易保持子模块和时钟信号的关闭,显然就更省电。

    此外,在操作系统这个级别,个人电脑上通常会开很多线程,而移动平台通常会做优化,只保持必要的线程。这样使得耗电差距进一步加大。当然,如果X86用在移动平台,肯定也会因为线程少而省电。凌动系列(ATOM)专门为这些特性做了优化,在一定程度上降低乱序执行和多线程的处理能力,从而达到省电。

    现在移动处理器都是片上系统(SoC)架构,也就是说,处理器之外,图形,视频,音频,网络等功能都在一个芯片里。这些模块的打开与关闭就容易预测的多,并且可以通过软件来控制。这样,整体功耗就更加取决于软件和制造工艺而不是处理机架构。在这点上,X86的处理器占优势,因为Intel的工艺有很大优势,而软件优化只要去做肯定就可以做到。

    ARM和X86现在发展如何?

    关于X86架构和ARM架构这两者谁将统一市场的争执一直都有,但是也有人说这两者根本不具备可比性,X86无法做到ARM的功耗,而ARM也无法做到X86的性能。现在ARM架构已经具备了进入服务器芯片的能力,众多芯片研发企业纷纷采用ARM架构研发服务器芯片无疑将促进其繁荣, 2015年一款采用ARM架构的Windows 10平板现身,这也是目前曝光的全球首款非X86架构、运行Windows系统的平板产品。

    同时,经过数年的努力,2016年AMD终于推出了首个基于ARM架构的处理器——Opteron A1100。AMD希望能够凭借这一处理器挑战Intel在数据中心服务器市场的霸主地位。

    这样看来,Intel在服务器芯片市场将会逐渐失去霸主地位,而且,Intel已然错过了移动 CPU 市场,现在它正试图跳进千万亿的物联网领域,具体表现如何,看时间的考验吧。

    展开全文
  • 在计算机视觉中,图像分割是个非常重要且基础的研究方向。简单来说,图像分割(image segmentation)就是根据某些规则把图片中的像素分成不同的部分(加不同的标签)。 图像分割中的一些常见的术语有:superpixels...

    在计算机视觉中,图像分割是个非常重要且基础的研究方向。简单来说,图像分割(image segmentation)就是根据某些规则把图片中的像素分成不同的部分(加不同的标签)。

    图像分割中的一些常见的术语有:superpixels(超像素)、Semantic Segmentation(语义分割)、Instance Segmentation(实例分割)、Panoptic Segmentation(全景分割)。他们之间到底有什么区别呢?如果你对这几个术语非常了解了,那么恭喜你!可以直接把文章拖到结尾,顺手点个广告,就可以返回了(笑)。

    不过很多刚接触这个领域的同学有点搞不太清楚上面的区别,那么跟我一起来学习一下吧!

    superpixels(超像素)

    第一次听说这个超像素很容易理解错误,以为是在普通的像素基础上继续像微观细分,如果这样理解就恰好理解反了,其实超像素是一系列像素的集合,这些像素具有类似的颜色、纹理等特征,距离也比较近。用超像素对一张图片进行分割的结果见下图,其中每个白色线条区域内的像素集合就是一个超像素。需要注意的是,超像素很可能把同一个物体的不同部分分成多个超像素。
    在这里插入图片描述

    超像素最早的定义来自2003年 Xiaofeng Ren等人的一篇论文《Learning a Classification Model for Segmentation》。

    其中超像素中比较常用的一种方法是SLIC(simple linear iterative clustering),是Achanta 等人2010年提出的一种思想简单、实现方便的算法,将彩色图像转化为CIELAB颜色空间和XY坐标下的5维特征向量,然后对5维特征向量构造距离度量标准,对图像像素进行局部聚类的过程。SLIC算法能生成紧凑、近似均匀的超像素,在运算速度,物体轮廓保持、超像素形状方面具有较高的综合评价,比较符合人们期望的分割效果。
    在这里插入图片描述

    Semantic Segmentation(语义分割)

    语义分割还是比较常见的,就是把图像中每个像素赋予一个类别标签(比如汽车、建筑、地面、天空等),比如下图就把图像分为了草地(浅绿)、人(红色)、树木(深绿)、天空(蓝色)等标签,用不同的颜色来表示。

    不过这种分割方式存在一些问题,比如如果一个像素被标记为红色,那就代表这个像素所在的位置是一个人,但是如果有两个都是红色的像素,这种方式无法判断它们是属于同一个人还是不同的人。也就是说语义分割只能判断类别,无法区分个体。
    在这里插入图片描述

    但很多时候我们更需要个体信息,想要区分出个体怎么办呢?继续往下看吧

    Instance Segmentation(实例分割)

    实例分割方式有点类似于物体检测,不过物体检测一般输出的是 bounding box,实例分割输出的是一个mask。

    实例分割和上面的语义分割也不同,它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行,比如下图中的人就是感兴趣的物体。该图的分割方法采用了一种称为Mask R-CNN的方法。我们可以看到每个人都是不同的颜色的轮廓,因此我们可以区分出单个个体。
    在这里插入图片描述

    Panoptic Segmentation(全景分割)

    最后说说全景分割,它是语义分割和实例分割的结合。如下图所示,每个像素都被分为一类,如果一种类别里有多个实例,会用不同的颜色进行区分,我们可以知道哪个像素属于哪个类中的哪个实例。比如下图中黄色和红色都属于人这一个类别里,但是分别属于不同的实例(人),因此我们可以通过mask的颜色很容易分辨出不同的实例。
    在这里插入图片描述

    现在是不是对这几个术语了然于胸了呢!

    展开全文
  • 为什么库分表?

    千次阅读 2021-11-23 22:37:08
    在高并发系统当中,库分表是必可少的技术手段之一,但为什么要做库分表吗? 这个问题要从两条线说起:垂直方向 和 水平方向。 先来个总结图: 1 垂直方向 垂直方向主要针对的是业务,下面聊聊业务的发展跟...

    MySQL分库分表相关系列目录:MySQL相关目录


    为什么要分库分表?

    在高并发系统当中,分库分表是必不可少的技术手段之一,但为什么要做分库分表吗?

    这个问题要从两条线说起:垂直方向水平方向

    先来个总结图:

    从分库、分表的维度看:

    • 分库:一般先选择读写分离(也是水平分库的一样);再垂直分库;如果真的出现垂直分库之后,并发量依然很大,那就水平分库分表,将单表中的数据分到多张结构一样的业务子表中,再将业务子表分散到n个业务子库中,通过路由来定位哪个库哪张表
    • 分表:垂直分表是单表中的字段实在是太多了,可以把核心字段和非核心字段分开存放,表的数据结构是不一样的;水平分表就是将单表中的数据分到多张结构一样的业务子表中,保证每个表不要存太多的数据

    1 垂直方向

    垂直方向主要针对的是业务,下面聊聊业务的发展跟分库分表有什么关系。

    1.1 单库

    在系统初期,业务功能相对来说比较简单,系统模块较少。

    为了快速满足迭代需求,减少一些不必要的依赖。更重要的是减少系统的复杂度,保证开发速度,我们通常会使用单库来保存数据。

    系统初期的数据库架构如下:

    此时,使用的数据库方案是:一个数据库包含多张业务表。用户读数据请求和写数据请求,都是操作的同一个数据库。

    1.2 分表

    系统上线之后,随着业务的发展,不断的添加新功能。导致单表中的字段越来越多,开始变得有点不太好维护了。

    一个用户表就包含了几十甚至上百个字段,管理起来有点混乱。

    这时候该怎么办呢?

    答:分表

    用户表拆分为:用户基本信息表用户扩展表

    用户基本信息表中存的是用户最主要的信息,比如:用户名、密码、别名、手机号、邮箱、年龄、性别等核心数据。

    这些信息跟用户息息相关,查询的频次非常高。

    而用户扩展表中存的是用户的扩展信息,比如:所属单位、户口所在地、所在城市等等,非核心数据。

    这些信息只有在特定的业务场景才需要查询,而绝大数业务场景是不需要的。

    所以通过分表把核心数据和非核心数据分开,让表的结构更清晰,职责更单一,更便于维护。

    除了按实际业务分表之外,我们还有一个常用的分表原则是:把调用频次高的放在一张表,调用频次低的放在另一张表。

    有个非常经典的例子就是:订单表和订单详情表。

    1.3 分库

    不知不觉,系统已经上线了一年多的时间了。经历了N个迭代的需求开发,功能已经非常完善。

    系统功能完善,意味着系统各种关联关系,错综复杂。

    此时,如果不赶快梳理业务逻辑,后面会带来很多隐藏问题,会把自己坑死。

    这就需要按业务功能,划分不同领域了。把相同领域的表放到同一个数据库,不同领域的表,放在另外的数据库。

    具体拆分过程如下:

    将用户、产品、物流、订单相关的表,从原来一个数据库中,拆分成单独的用户库、产品库、物流库和订单库,一共四个数据库。

    在这里为了看起来更直观,每个库我只画了一张表,实际场景可能有多张表。

    这样按领域拆分之后,每个领域只用关注自己相关的表,职责更单一了,一下子变得更好维护了。

    1.4 分库分表

    有时候按业务,只分库,或者只分表是不够的。比如:有些财务系统,需要按月份和年份汇总,所有用户的资金。

    这就需要做:分库分表了。

    每年都有个单独的数据库,每个数据库中,都有12张表,每张表存储一个月的用户资金数据。

    这样分库分表之后,就能非常高效的查询出某个用户每个月,或者每年的资金了。

    此外,还有些比较特殊的需求,比如需要按照地域分库,比如:华中、华北、华南等区,每个区都有一个单独的数据库。

    甚至有些游戏平台,按接入的游戏厂商来做分库分表。

    2 水平方向

    水分方向主要针对的是数据,下面聊聊数据跟分库分表又有什么关系。

    2.1 单库

    在系统初期,由于用户非常少,所以系统并发量很小。并且存在表中的数据量也非常少。

    这时的数据库架构如下:

    此时,使用的数据库方案同样是:一个master数据库包含多张业务表

    用户读数据请求和写数据请求,都是操作的同一个数据库,该方案比较适合于并发量很低的业务场景。

    2.2 主从读写分离

    系统上线一段时间后,用户数量增加了。

    此时,你会发现用户的请求当中,读数据的请求占据了大部分,真正写数据的请求占比很少。

    众所周知,数据库连接是有限的,它是非常宝贵的资源。而每次数据库的读或写请求,都需要占用至少一个数据库连接。

    如果写数据请求需要的数据库连接,被读数据请求占用完了,不就写不了数据了?

    这样问题就严重了。

    为了解决该问题,我们需要把读库写库分开。

    于是,就出现了主从读写分离架构:

    考虑刚开始用户量还没那么大,选择的是一主一从的架构,也就是常说的一个master一个slave。

    所有的写数据请求,都指向主库。一旦主库写完数据之后,立马异步同步给从库。这样所有的读数据请求,就能及时从从库中获取到数据了(除非网络有延迟)。

    读写分离方案可以解决上面提到的单节点问题,相对于单库的方案,能够更好的保证系统的稳定性。

    因为如果主库挂了,可以升级从库为主库,将所有读写请求都指向新主库,系统又能正常运行了。

    读写分离方案其实也是分库的一种,它相对于为数据做了备份,它已经成为了系统初期的首先方案。

    但这里有个问题就是:如果用户量确实有些大,如果master挂了,升级slave为master,将所有读写请求都指向新master。

    但此时,如果这个新master根本扛不住所有的读写请求,该怎么办?

    这就需要一主多从的架构了:

    上图中我列的是一主两从,如果master挂了,可以选择从库1或从库2中的一个,升级为新master。假如我们在这里升级从库1为新master,则原来的从库2就变成了新master的的slave了。

    调整之后的架构图如下:

    这样就能解决上面的问题了。

    除此之外,如果查询请求量再增大,我们还可以将架构升级为一主三从、一主四从…一主N从等。

    2.3 分库

    上面的读写分离方案确实可以解决读请求大于写请求时,导致master节点扛不住的问题。但如果某个领域,比如:用户库。如果注册用户的请求量非常大,即写请求本身的请求量就很大,一个master库根本无法承受住这么大的压力。

    这时该怎么办呢?

    答:建立多个用户库。

    用户库的拆分过程如下:

    在这里我将用户库拆分成了三个库(真实场景不一定是这样的),每个库的表结构是一模一样的,只有存储的数据不一样。

    2.4 分表

    用户请求量上来了,带来的势必是数据量的成本上升。即使做了分库,但有可能单个库,比如:用户库,出现了5000万的数据。

    根据经验值,单表的数据量应该尽量控制在1000万以内,性能是最佳的。如果有几千万级的数据量,用单表来存,性能会变得很差。

    如果数据量太大了,需要建立的索引也会很大,从小到大检索一次数据,会非常耗时,而且非常消耗cpu资源。

    这时该怎么办呢?

    答:分表,这样可以控制每张表的数据量,和索引大小。

    表拆分过程如下:

    我在这里将用户库中的用户表,拆分成了四张表(真实场景不一定是这样的),每张表的表结构是一模一样的,只是存储的数据不一样。

    如果以后用户数据量越来越大,只需再多分几张用户表即可。

    2.5 分库分表

    当系统发展到一定的阶段,用户并发量大,而且需要存储的数据量也很多。这时该怎么办呢?

    答:需要做分库分表

    如下图所示:

    图中将用户库拆分成了三个库,每个库都包含了四张用户表。

    如果有用户请求过来的时候,先根据用户id路由到其中一个用户库,然后再定位到某张表。

    路由的算法挺多的:

    • 根据id取模,比如:id=7,有4张表,则7%4=3,模为3,路由到用户表3。
    • 给id指定一个区间范围,比如:id的值是0-10万,则数据存在用户表0,id的值是10-20万,则数据存在用户表1。
    • 一致性hash算法

    具体后续

    3 真实案例

    3.1 分库

    一个团队是做游戏运营的,其所在公司提供平台,游戏厂商接入其平台,推广他们的游戏。

    游戏玩家通过我们平台登录,成功之后跳转到游戏厂商的指定游戏页面,该玩家就能正常玩游戏了,还可以充值游戏币。

    这就需要建立我们的账号体系和游戏厂商的账号的映射关系,游戏玩家通过登录我们平台的游戏账号,成功之后转换成游戏厂商自己平台的账号。

    这里有两个问题:

    1. 每个游戏厂商的接入方式可能都不一样,账号体系映射关系也有差异。
    2. 用户都从我们平台登录,成功之后跳转到游戏厂商的游戏页面。当时有N个游戏厂商接入了,活跃的游戏玩家比较多,登录接口的并发量不容小觑。

    为了解决这两个问题,我们当时采用的方案是:分库。即针对每一个游戏都单独建一个数据库,数据库中的表结构允许存在差异。

    我们当时没有进一步分表,是因为当时考虑每种游戏的用户量,还没到大到离谱的地步。不像王者荣耀这种现象级的游戏,有上亿的玩家。

    其中有个比较关键的地方是:登录接口中需要传入游戏id字段,通过该字段,系统就知道要操作哪个库,因为库名中就包含了游戏id的信息。

    3.2 分表

    还是在那家游戏平台公司,我们还有另外一个业务就是:金钻会员

    说白了就是打造了一套跟游戏相关的会员体系,为了保持用户的活跃度,开通会员有很多福利,比如:送游戏币、充值有折扣、积分兑换、抽奖、专属客服等等。

    在这套会员体系当中,有个非常重要的功能就是:积分

    用户有很多种途径可以获取积分,比如:签到、充值、玩游戏、抽奖、推广、参加活动等等。

    积分用什么用途呢?

    1. 退换实物礼物
    2. 兑换游戏币
    3. 抽奖

    说了这么多,其实就是想说,一个用户一天当中,获取积分或消费积分都可能有很多次,那么,一个用户一天就可能会产生几十条记录。

    如果用户多了的话,积分相关的数据量其实挺惊人的。

    我们当时考虑了,水平方向的数据量可能会很大,但是用户并发量并不大,不像登录接口那样。

    所以采用的方案是:分表

    当时使用一个积分数据库就够了,但是分了128张表。然后根据用户id,进行hash除以128取模。

    需要特别注意的是,分表的数量最好是2的幂次方,方便以后扩容。

    3.3 分库分表

    一家从事餐饮软件开发的公司。这个公司有个特点是在每天的中午和晚上的就餐高峰期,用户的并发量很大。

    用户吃饭前需要通过我们系统点餐,然后下单,然后结账。当时点餐和下单的并发量挺大的。

    餐厅可能会有很多人,每个人都可能下多个订单。这样就会导致用户的并发量高,并且数据量也很大。

    所以,综合考虑了一下,当时我们采用的技术方案是:分库分表

    经过调研之后,觉得使用了当当网开源的基于jdbc的中间件框架:sharding-jdbc

    当时分了4个库,每个库有32张表。

    4 总结【重点】

    上面主要从:垂直和水平,两个方向介绍了我们的系统为什么要分库分表。

    说实话垂直方向(即业务方向)更简单。

    在水平方向(即数据方向)上,分库分表的作用,其实是有区别的,不能混为一谈。

    • 分库:是为了解决数据库连接资源不足问题,和磁盘IO的性能瓶颈问题。
    • 分表:是为了解决单表数据量太大,sql语句查询数据时,即使走了索引也非常耗时问题。此外还可以解决消耗cpu资源问题。
    • 分库分表:可以解决 数据库连接资源不足、磁盘IO的性能瓶颈、检索数据耗时 和 消耗cpu资源等问题。

    如果在有些业务场景中,用户并发量很大,但是需要保存的数据量很少,这时可以只分库,不分表。

    如果在有些业务场景中,用户并发量不大,但是需要保存的数量很多,这时可以只分表,不分库。

    如果在有些业务场景中,用户并发量大,并且需要保存的数量也很多时,可以分库分表。

    该如何选择分库分表

    大型网站用户数和数据库规模急剧上升,关系型数据库常见的性能瓶颈主要体现在两点

    • 一是大量的并发读写操作,导致单库出现负载压力过大;(并发量大,数据库连接资源不足问题,磁盘IO的性能瓶颈问题)
    • 二是单表存储数据量过大,导致查询效率低下。(单表数据量太大,sql语句查询数据时,即使走了索引也非常耗时问题。此外还有消耗cpu资源问题)

    随着网站的业务不断扩展,数据不断增加,用户越来越多,数据库的压力越来越大。

    数据库层面:

    第一步应该首先考虑:读写分离(属于水平分库),解决访问压力。

    • 在大部分互联网业务场景中,读操作的比例远远大于写操作,而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。这时,数据库的读压力会首先成为数据库的瓶颈,而此时SQL的查询优化已很难达到要求了。在数据库层面,我们首先采用的是数据库读写分离技术,消除读写锁冲突,来提升业务系统的读性能。

    第二步:垂直分库(按业务来分),解决库中表太多,数据量太大

    • 数据量急剧快速增长,数据库会成为整个系统的瓶颈。这时可以考虑按照业务把不同的数据放到不同的库中。垂直切分后业务清晰,不同业务放在不同的库中,将原来所有压力由同一个库分散到不同的库中,提升了系统的吞吐量

    第三步:分表(水平方向),解决单表数据量太大

    • 水平分表主要用于业务架构无法继续细分、数据库中单张表数据量太大、查询性能下降的场景。
    • 一般用的是水平分表:根据id来,每个表的结构一样,只是存的数据不一样,保证每个表不要存太多的数据,如再将水平分表后的这些业务子表分散到n个业务子库中,这也就是水平分库了。
    • 也可以按照具体情况考虑垂直分表,即单表中的字段实在是太多了,可以把核心字段和非核心字段分开存放,表的数据结构是不一样的

    一个大致的分库分表方案如上(自己的见解,有错误请指正)。

    但是应该使用哪一种方式来实施数据库分库分表,还需要从数据库的瓶颈所在和项目的业务角度进行综合考虑。

    • 如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、耦合度较低,那么容易实施的垂直切分必是首选。
    • 如果数据库中的表并不多,但单表的数据量很大且数据热度很高,这种情况之下就应该选择水平切分, 水平切分比垂直切分要稍微复杂,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估外,还要考虑数据要如何均匀分散。

    在现实项目中,往往是这两种情况兼而有之,综合使用了垂直与水平切分,我们首先对数据库进行垂直切分(做垂直分库),然后针对一部分表(通常是用户数据表)进行水平切分(水平分表)。


    分库分表相关内容挺多的,如以下几个问题:(后续)

    1. 分库分表的具体实现方案有哪些?
    2. 分库分表后如何平滑扩容?
    3. 分库分表后带来了哪些问题?
    4. 如何在项目中实现分库分表功能?
    展开全文
  • 路由方向和数据方向

    2022-03-12 18:34:27
    如果有小伙伴分不清路由方向和数据方向的话,可以看这里。 以上图例,AR1上有一条路由(192.168.1.1),此时AR1将该路由给到AR3便是路由方向(绿色),AR3想要去访问该路由时便是数据方向(蓝色)。 ...
  • 单片机工程师有战力天花板上限?程序猿和单片机工程师你会分不清吗?解释如下文
  • 对账与清分、清算、结算

    千次阅读 2018-03-19 23:03:00
    清分:将全部的交易数据,按照各个成员之间的往来方向、金额、手续费等进行分类、整理。(即清算前的准备工作) 清算:根据清分的结果进行汇总、轧差、产生清算报表,然后根据轧差的净额填制清算的会计录,并据此...
  • 1.什么时磁密B,磁场强度H,磁通量Φ? 磁密也就是磁通密度,也称磁感应强度B 磁场强度H 磁通量Φ 2.磁感应线方向? 磁铁周围的磁感线都是从N极出来进入S极,在磁体内部磁感线从S极到N极。 3.线圈电动势 可以用...
  • python数据分析方向的第三方库是:1、Numpy;2、Pandas;3、SciPy;4、Matplotlib;5、Scikit-Learn;6、Keras;7、Gensim;8、Scrapy。本教程操作环境:windows7系统、Python3版、Dell G3电脑。Python是数据处理...
  • 百度百科对第四次工业革命的定义是,以互联网产业化,工业智能化,工业一体化代表,以人工智能,清洁能源,无人控制技术,量子信息技术,虚拟现实以及生物技术主的全新技术革命。hcie哪个方向比较吃香?映射到...
  • 观察过很多刚开始做技术 Leader ...本来,在没有介入管理职能之前,每个人管理好自己就可以了,需要考虑的都是围绕自己的事情,方向和维度都比较垂直。角色转变后,从解决自己的问题变为要解决团队的问题,要解决的问题
  • 你们口中的交大材料博士在读,转行预备役。害怕被认出来打死,就匿名了。 话说混的好的。我去拿行业顶尖大牛,比如1 sigma的幸存者举例,比如李开复应该算是神人了吧,但是这就属于欺负人了。...首先是转行的。 第一
  • CDMA 、CSMA 、CSMA/CD、CSMA/CA傻傻分不清

    千次阅读 多人点赞 2019-12-16 15:36:02
    为什么要冲突避免呢? 在无线局域网中,每个移动的站点发送的范围可以看成是一个以本身为圆心的圆。这有可能会出现两个问题: 隐蔽站问题 A站点和C站点都想发送数据给B站点,但是A和C相距较远,都认为到B的...
  • 原标题:为什么孩子总是会把字母...pqdb不分,这在我们大人眼里一目了然的事情,怎么到了小孩子眼里就分不清了呢? 原因我们来看下面的一张图: 这四把椅子,大人见的多了,自然能分清是四把不同方位的椅子。而对于...
  • 导数、方向导数与梯度

    千次阅读 2021-01-17 18:29:03
    导数,方向导数,切线、梯度是从高中就开始接触的概念,然而对这几个概念的认识不清,困惑了我很长时间,下面我将以图文并茂的形式,对这几个概念做详细的解释。1, 导数定义:设函数y=f(x)在点x0的某个邻域内有定义...
  • 诸多关于人工智能的流行词汇萦绕在我们耳边,比如深度学习 (Deep Learning)、强化学习 (Reinforcement Learning)、迁移学习 (Transfer Learning),不少人对这些高频词汇的含义及其背后的关系感到困惑,今天就大家...
  • 方向盘】蚂蚁金服上市了,我想努力了

    万次阅读 多人点赞 2020-07-21 20:46:02
    网瘾失足、考、延期毕业、房产中介、保险销售、送外卖…是我可抹灭的黑标签 2013.07 考、毕业答辩3次未通过、延期毕业 2013.08-2014.07 宁夏中介公司卖二手房1年,毕业后第1份工作 ️️2014.07-2015.05 荆州/...
  • 数据库为什么库分表

    万次阅读 2017-08-16 16:40:27
    2 基本思想之为什么库分表? 数据库中的数据量一定是可控的,在未进行库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越...
  • 然而不容忽视的是,这类机构普遍存在“平台统一收款+向下‘二次清分’”的结算模式,平台型机构的资金账户上沉淀了巨额客户结算资金,随之伴生了维护客户资金安全的道德风险,而潜在的交易信息篡改、资金挪用风险并...
  • 职业方向定位 首先,只有确定好自己的职业方向,才能做好职业规划。 (1)资深WEB前端工程师 这个方向算是一个WEB前端最基本的选择了,在国外,很多老外都能够把自己的专业做到极致,能一辈子就在一个专业领域不断...
  • 空调滤方向到底是什么,air flow

    千次阅读 2020-12-19 23:21:13
    空调滤芯外面的塑bai料框上标du有方向的箭头,另外这个塑zhi料dao框上的一边有密封的版海绵条,空调滤权芯安装时,要将这个塑料框中间折断,空调滤芯弯一个角度,才能安进去,一般装反,只能向一个方向弯曲。...
  • OpenCV-识别图中目标点和方向

    千次阅读 2016-09-04 23:17:17
    这个图形如下所示,要定位到图中的6个黑点和判断他们的方向,如图的方向为指向左边! 分析: 1、定位到目标点(图中那6个) 怎么定位到图中的6个小黑点捏?我的方法是二值化后寻找图形的外部连通域,很显然利用此...
  • 为什么有的人没有方向感?

    千次阅读 2013-10-10 15:23:31
    你可能有过这样的经历:每到一个陌生的地方,总是分不清方向,“东西南北”的指路反而让你更加迷惑。 这的确是个令人烦恼的问题,我们时常需要独自出行,为了尽快到达目的地,我们需要时刻辨认清楚方向,并且找到...
  • 这三个概念到底是什么关系?人工智能、机器学习、深度学习,这三个概念非常相似,也常常媒体所混用。但其实它们并难区分,诞生于不同的科技水平和时代背景下,三个概念的依次包含关系,反映出了人类在人工智能...
  • Word 节符的删除(改变文章格式)

    万次阅读 2018-03-22 22:57:24
    我就知道天杀的微软为什么要将WORD中分节符前面的文字合并到后面的节中,明明节符前后的页面设置可以设置为相同的格式,我一删除节符,节符 前面的文字格式(包括页面设置、分栏、行距等)就变成了节符...
  • 片规则概述在数据切分处理中,特别是水平切分中,中间件最终要的两个处理过程就是数据的切分、数据的聚合。选择合适的切分规则,至关重要,因为它决定了后续数据聚合的难易程度,甚至可以避免跨库的数据聚合处理。...
  • 数据挖掘近年来的研究方向、方法总结 一、研究方向 数据挖掘作为一个跨学科主题,它是用人工智能、机器学习、统计学和数据库交叉的方法在相对较大型的数据集中发现模式的计算过程。其目标是从数据集中提取信息并将其...
  • 很多人对二很困惑,可能二的边界很难掌握,也许是判断条件难写... 很幸运,你找到了这篇文章,仔细看下去,这篇文章将带你**学透二**!!!
  • 算法工程师当前选哪个方向好?

    千次阅读 2020-08-20 08:30:00
     看了很多回答,模棱两可、模糊不清,给岀一番没有意乂的解释,最终也没有给岀自己的意见。 我首先给出自己明确的答案:选择推荐系统。 不要说什么“根据不同岗位、不同公司、不同能力而定",我所说的都是针对普遍的大众...
  • 1 研究背景 人工智能是研究开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的一门新的技术科学,研究目的是促使智能机器会...通过查阅资料将人工智能的发展历程划分以下6个阶段: 一是起步发展期:19

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,493
精华内容 74,597
关键字:

为什么总是分不清方向