IdiotSky


  • Home

  • Categories

  • About

  • Archives

  • Tags

  • Books

  • Search

分布式事务概述

Posted on 27 Jun 18 | In 分布式

👿mark之

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍。

事务

什么是事务

数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务拥有以下四个特性,习惯上被称为ACID特性:

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个操作在被数据库所执行一样。
  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操作将不可逆转。
Read more »

HTTP 总结

Posted on 22 May 18 | In protocols

👿 mark ,很长 😄

HTTP 概述

Web 使用一种名为 HTTP (HyperText Transfer Protocol,超文本传输协议) 的协议作为规范的。

HTTP 更加严谨的译名应该是 超文本转移协议。

HTTP 于 1990 年问世。那时的 HTTP 并没有作为正式的标准,因为被称为 HTTP/0.9
HTTP 正式作为标准被公布是 1996 年 5 月,版本命名为 HTTP/1.0,记载于 RFC1945
HTTP 在 1997 年 1 月公布了当前最主流的版本,版本命名为 HTTP/1.1,记载于 RFC2616
HTTP/2 于 2015 年 5 月 14 日发布,引入了服务器推送等多种功能,是目前最新的版本。记载于 RFC7540
(它不叫 HTTP/2.0,是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3)

Read more »

Unicode和UTF-8

Posted on 19 Mar 18 | In 编码

这个很简单的说明了unicode和UTF-8的关系 👿

  • Unicode 是「字符集」
  • UTF-8 是「编码规则」

其中:

  • 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
  • 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
Read more »

linux的写时复制

Posted on 13 Mar 18 | In linux

前面一篇文章又给自己挖坑,所以必须再mark一篇,这篇文章很好的说了关于写时复制的原理。

当调用fork()系统调用创建一个子进程时,Linux并不会为子进程创建新的物理内存空间,而是公用父进程的物理内存。这是因为Linux的内核开发者觉得,调用者调用fork()系统调用后会立刻调用exec()系统调用执行新的程序,这样旧的物理内存内容就没有什么作用了(因为新的程序与旧的程序完全没有关联),所以为子进程复制父进程的物理内存内容是一件徒劳无功的事情。

所以Linux的做法就是:父子进程共用同一物理内存。如下图:


Read more »

linux的零拷贝技术

Posted on 13 Mar 18 | In linux

👿 linux内核里面为所有文件描述符建立缓存的,而用户层也有自己的缓存,那样每次read和write等相关系统调用,不但有可能上下文切换,而且还要不断从用户态拷贝到内核态或者从内核态拷贝到用户态。如果有些数据不用经过用户层的话(例如网络代理服务),可以不用这种拷贝来浪费资源,所以Linux的系统调用就有了几个零拷贝的函数来解决这种问题。(虽说零拷贝,但其实也只是减少了用户态拷贝,把所有拷贝都在内核里面处理了)

引文

在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。这时候服务端的任务是:将服务端主机磁盘中的文件不做修改地从已连接的socket发出去,我们通常用下面的代码完成:

1
2
while((n = read(diskfd, buf, BUF_SIZE)) > 0)
write(sockfd, buf , n);

基本操作就是循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到socket。但是由于Linux的I/O操作默认是缓冲I/O。这里面主要使用的也就是read和write两个系统调用,我们并不知道操作系统在其中做了什么。实际上在以上I/O操作中,发生了多次的数据拷贝。

Read more »

linux的阻塞和非阻塞socket的区别

Posted on 12 Mar 18 | In linux

在上一篇文章有提到非阻塞socket,所以这篇文章就看看这个是什么东东👿

读操作

对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返回。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。当sockt的接收缓冲区中的数据大于期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度。

对于非阻塞socket而言,socket的接收缓冲区中有没有数据,read调用都会立刻返回。接收缓冲区中有数据时,与阻塞socket有数据的情况是一样的,如果接收缓冲区中没有数据,则返回错误号为EWOULDBLOCK,表示该操作本来应该阻塞的,但是由于本socket为非阻塞的socket,因此立刻返回,遇到这样的情况,可以在下次接着去尝试读取。如果返回值是其它负值,则表明读取错误。

因此,非阻塞的rea调用一般这样写:

1
2
3
4
5
6
7
8
9
10
11
if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示没有读到数据
}
else
return -1; //表示读取失败
}
else
return nread;读到数据长度

Read more »

linux epoll通俗理解

Posted on 12 Mar 18 | In linux

一个epoll通俗简单理解的文章,mark👿

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。
不管是文件,还是套接字,还是管道,我们都可以把他们看作流。
之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办?

  • 阻塞。阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。
  • 非阻塞忙轮询。接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?”
Read more »

b树和b+树总结

Posted on 05 Mar 18 | In mysql

b树

b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。

Read more »

MySQL索引背后的数据结构及算法原理

Posted on 04 Mar 18 | In mysql

转一个不错的文章,里面的干货还是很多的,包括局部性,硬盘等数据库以外的东西,Mark之👿

数据结构及算法基础

索引的本质

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找树(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

看一个例子:

Read more »

linux的12个ip命令范例

Posted on 26 Jan 18 | In linux命令

一年又一年,我们一直在使用 ifconfig 命令来执行网络相关的任务,比如检查和配置网卡信息。但是 ifconfig 已经不再被维护,并且在最近版本的 Linux 中被废除了! ifconfig 命令已经被 ip 命令所替代了。

ip 命令跟 ifconfig 命令有些类似,但要强力的多,它有许多新功能。ip 命令完成很多 ifconfig 命令无法完成的任务。

案例 1:检查网卡信息

检查网卡的诸如 IP 地址,子网等网络信息,使用 ip addr show 命令:

1
2
3
$ ip addr show
或
$ ip a s

Read more »
1234…17
ejunjsh

ejunjsh

code freak

164 posts
25 categories
154 tags
RSS
GitHub Weibo Email FB Page
0%
© 2014 — 2019 ejunjsh
Powered by Hexo
|
Theme — NexT.Gemini