我们接下来主要讨论一下我们经常会用到的一些对象:VO、DTO、DO 和
PO。
由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念:
VO(View Object):
视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object): 数据传输对象,这个概念来源于 J2EE
的设计模式,原来的目的是为了 EJB
的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object):
领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO(Persistent Object):
持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应
PO 的一个(或若干个)属性。
模型
下面以一个时序图建立简单模型来描述上述对象在三层架构应用中的位置
...
随着互联网时代,特别是移动互联网的到来,形形色色的企业都在将自己的系统平台快速升级迭代,以此作为向互联网转型的一部分。
在此背景下,这类应用平台所依赖的数据库系统就需要支持突然增加的巨量交易数据,但是在这种情况下单体的数据库往往会很快过载,而用于扩展数据库最常见的技术手段就是“数据分片”。
因此这一讲,我将为你介绍什么是分片,以及如何将其用于扩展数据库。同时,我还会回顾常见分片架构的优缺点,以使用
TiDB 为例,和你探讨如何在分布式数据库中实现分片。
数据分片概论
分片是将大数据表分解为较小的表(称为分片)的过程,这些分片分布在多个数据库集群节点上。分片本质上可以被看作传统数据库中的分区表,是一种水平扩展手段。每个分片上包含原有总数据集的一个子集,从而可以将总负载分散在各个分区之上。
数据分片的方式一般有两种。
水平分片:在不同的数据库节点中存储同一表的不同行。
垂直分片:在不同的数据库节点中存储表不同的表列。
如下图所示,水平和垂直这两个概念来自原关系型数据库表模式的可视化直观视图。
分片理念其实来源于经济学的边际收益理论:如果投资持续增加,但收益的增幅开始下降时,被称为边际 ...
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。
最直观的区别就是GET把参数包含在URL中,POST通过request
body传递参数。
你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。
当你在面试中被问到这个问题,你的内心充满了自信和喜悦。
你可能会给出以下“标准答案”
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request bo ...
TCP 和 UDP
是今天应用最广泛的传输层协议,拥有最核心的垄断地位。今天互联网的整个传输层,几乎都是基于这两个协议打造的。无论是应用开发、框架设计选型、做底层和优化,还是定位线上问题,只要碰到网络,就逃不开
TCP 协议相关的知识。在面试中 TCP 一直是一个高频考察内容,外加 TCP
关联的知识比较多,因此面试题五花八门。
TCP 协议
TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host
数据的可靠传输,支持全双工,是一个连接导向的协议。
这里面牵涉很多概念,比如主机到主机、连接、会话、双工/单工及可靠性等,接下来我会为你逐一解释。
主机到主机(Host-To-Host)
TCP 提供的是 Host-To-Host 传输,一台主机通过 TCP
发送数据给另一台主机。这里的主机(Host)是一个抽象的概念,可以是手机、平板、手表等。收发数据的设备都是主机,所以双方是平等的。
TCP
协议往上是应用到应用(Application-To-Application)的协议。什么是应用到应用的协议呢?比如你用微信发信息给张三,你的 ...
从 DataReportal 2021 年 1 月的统计数据来看,全球 78 亿人口中,有 52
亿手机用户,46 亿互联网用户。
能够接入网络的设备越来越多,体量越来越大,不知道你有没有好奇过,这样一个庞大的世界是如何被构造出来的?思科(Cisco,世界
500 强通信设备提供商)在一篇报告中曾指出,2016 年年底全球 IP 流量超过 1
个 Zettabyte,也就是 1021 个字节,相当于一万亿
GB。那么如此庞大的流量体系,又需要何种结构去承接?
接下来我们会学习网络协议,比如 TCP/IP 协议、HTTP
协议,还会学习算法,比如时间窗口算法、校验和算法。这些协议和算法,只是整个互联网的一角,而整个互联网的全貌,我将借这次机会带你做一次漫游。
网络的组成
我们习惯称今天的时代为云时代,整个世界可以看作一张巨大的、立体的网。在这个时代里产生的各种服务,就好像水和电一样,打开即用。透过这张巨大的网去观察,里面还会有一个个小型的网络。你可以想象,用无数个节点构成一个个小型网络,再用小型网络组成中型网络,再组成大型网络,以此类推,最后组成完整的一个如星河般的世界。
公司内网
如果 ...
在讲解之前,我简短地与身边同僚、朋友交流了内容的大纲。当时,大家都表示出了浓厚的兴趣,并且不约而同地问了我这样一个问题:啥是分布式数据库?更有“爱好学习”的朋友希望借此展现出“勤学好问”的品德,进而补充道:“这是哪个大厂出的产品?”
好吧,我的朋友,你们真的戳中了我的笑点。但笑一笑后,我不禁陷入了思考:为什么分布式数据库在大众,甚至专业领域内认知如此之低呢?
原因我大概可以总结为两点:数据库产品特点与商业氛围。
首先,数据库产品的特点是抽象度高。用户一般仅仅从使用层面接触数据库,知道数据库能实现哪些功能,而不关心或者很难关心其内部原理。而一些类型的分布式数据库的卖点正是这种抽象能力,从而使用户觉得应用这种分布式化的数据库与传统单机数据库没有明显的差别,甚至更加简单。
其次,数据库的商业氛围一直很浓厚。数据库产品高度抽象且位置关键,这就天然成为资本追逐的领地。而商业化产品和服务的卖点就是其包含支撑服务,而且许多商业数据库最赚钱的部分就是提供该服务。因此这些产品有意无意地对终端用户掩盖了数据库的技术细节,而用户有了这层商业保障,也很难有动力去主动了解内部原理。
这就造成即使你工作中接触了分 ...
在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?我们就来分析这个问题,探讨一下内部的原因。
MySQL 和程序实例
要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机
key
作为主键,其它我们完全保持不变.根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样,然后测试一下表的插入速度和查询速度:
注:这里的随机key其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串
18 位长度的long值
id 自动生成表:``` CREATE TABLE user_key_auto (
user_id int unsigned NOT NULL AUTO_INCREMENT,
user_name varchar(64) CHARACTER SET ut ...
他们本质都是TCP连接,并无区别,但是由于http的规定以及浏览器和服务器的限制,导致他们在应用过程中可能有所不同
get方法的特点
请求数据会附在URL之后(放在请求行中,以
?分割URL和传输数据,多个参数用 & 连接)
get是会被浏览器主动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,可以更快的展示数据
get方法的UR一般都有长度限制,但是需要注意的是http协议中并未规定get请求的长度。这个长度限制主要是由浏览器和web服务器决定的,并且各个浏览器对长度限制各不相同
get方法只产生一个TCP数据包,浏览器会把请求头和请求数据一并发送出去,服务器响应200
ok(返回数据)
post方法的特点
根据http规范,post可能改变服务器上的资源的请求(点赞就是post请求),因为有可能修改服务器上的资源,所以不符合安全性和幂等性
因为post方法是放在请求数据的,所以它的请求信息是没有长度限制的
post方法会产生两个TCP数据包,浏览器会先将请求头发送给服务器,待服务器返回100
continue,浏览器再发送请求数据,服务器响应 200
...
首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法
浏览器先查看浏览器缓存——系统缓存——路由器缓存,如果缓存中有,直接在屏幕上显示内容,如果没有,到第三步
在发送http请求前,需要域名解析(DNS解析),获取相应的IP地址
浏览器向服务器发起TCP连接,与浏览器建立三次握手
握手成功后,浏览器向服务器发送http请求,请求数据包
服务器处理收到的请求,将数据返回至浏览器
四次挥手释放TCP连接
浏览器收到http响应
浏览器解析响应,如果响应可以缓存,则存入缓存
浏览器发送请求获取嵌入在HTML的资源(对于未知类型,会弹出对话框)
浏览器发送异步请求
页面渲染全部结束
**浏览器缓存:**浏览器会记录DNS一段时间,因此只有第一个地方解析DNS请求
操作系统缓存:如果在浏览器中不包含这个记录,则会使用系统调用操作系统,获取操作系统记录(保存最近的DNS查询缓存)
**路由器缓存:**如果上述两个步骤均不能获取DNS记录,继续搜索路由器缓存
客户端向服务端发送断开连接请求FIN
服务端响应客户端的断开连接请求,发送ACK响应包给客户端
服务端向客户端发送断开连接请求FIN
客户端响应服务端的断开连接请求,发送ACK响应给客户端
客户端主动调用close时,向服务端发送结束报文段FIN报,同时进入FIN_WAIT1状态;服务器会收到结束报文段FIN报,服务器返回确认报文段ACK并进入CLOSE_WAIT状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段;服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待最后一个ACK的带来;客户端收到服务器发来的结束报文段,
进入TIME_WAIT,
并发出送确认报文段ACK;服务器收到了对结束报文段确认的ACK,进入CLOSED状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态
为什么握手是三次,而挥手需要四次呢
?
第二步属于系统自动响应数据包
第三步是程序手动调用clos ...