汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪汪。 没保存啊,都是泪啊。 前言 心好累啊,又要写一遍。 从去年初次接触Zookeeper到现在,正好一年了,一直没总结,一方面也是因为自己对分布式系统理解很少,没有什么可说的,如果只是描述一下zk提供的几个原语实在没什么意义。(另一方面就是懒)。 感觉自己终于对分布式可以说是有一定的入门了,所以赶紧记录下自己的成长。 正文 我接触zk相对来说是挺缘分的,因为C++出身,对于Hadoop家族了解甚少,只是在项目中对于模糊的“分布式协同”而找到了zk。就像一场仓促的恋爱,摸不准对方的脾气, 闹出了很多尴尬(够了)。 明天继续。。。 什么是zk zk是hadoop全家桶的一员,后来独立为apache的顶级项目,是google的chubby的开源实现。 很高大对吧。。。但是说了好像没说。。。 通俗的理解,在一个分布式系统的开发中,我们会面对很多共同的问题,比如leader选举/分布式锁,集群管理等等等等,就像后台开发 继续阅读 >>


康艺杰 18/06/30 22:51:57
ArrayList源码分析 ArrayList简介 我们知道,ArrayList是基于数组实现的List类,完全支持List接口的全部功能,底层实质上就是一个Object[]数组。从源码注释的第一行“Resizable-array implementation of the List interface”中,可以看出ArrayList是List接口的可变长数组实现,即这是一个动态数组,与普通的数组相比,它可以实现容量的动态增长。至于其他的特征,我们可以从类的定义中得到: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 这是ArrayList的类结构层次图: 由以上信息,我们可以知道: ArrayList:表明ArrayList支持泛型 exten 继续阅读 >>


贺含悦 18/06/29 18:06:53
结构化与非结构化网络 非结构化的P2P网络是指网络节点之间不存在组织关系,节点之间完全是对等的,比如第一代P2P网络Napster。 结构化的P2P网络与非结构化恰好相反,我们认为网络在逻辑上存在一个人为设计的结构,比如Chord假定网络是一个环,Kadelima则假定为一颗二叉树。有了这些逻辑结构,就给我们资源查找引入了更多的算法和思路。 引言 我们在 计算机网络–详解P2P对等网络(一)—BitTorrent协议 这一篇博客中讲述了BT下载的过程:在对等用户拿到种子文件的时候,首先会联系tracker服务器,然后加入用户集群,并在用户集群中寻找自己所需的内容,最后与拥有内容的对等用户进行联系。 从BT下载的过程中引出本节所要讨论的问题:如何高效的从用户集群中找出哪些对等用户拥有你正在寻求的具体内容? 在历史中有三种比较典型的模型来解决这个问题: Napster:使用一个中心服务器接收所有的查询,服务器告知去哪下载其所需要的数据。存在的问题是中心服务器单点失效导致整个网络瘫痪。 继续阅读 >>


董恒毅 18/06/28 21:24:59
从键盘输入一系列字符(以回车结束),按数字,大小写字母分类计数,并在屏幕上打印出来。 DATA SEGMENT INFOR1 DB 0AH,0DH,"Please Press Any Key to input a letter:$" INFOR2 DB 0AH,0DH,"Lowercase Letter : $" INFOR3 DB 0AH,0DH,"Uppercase Letter : $" INFOR4 DB 0AH,0DH,"Digit : $" INFOR5 DB 0AH,0DH,"Other Letter : $" DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: PRINT MACRO STR,RHS ; MACRO 为宏 LEA DX,RHS MOV AH,09H INT 21H 继续阅读 >>


刘生玺 18/06/28 21:03:23
学习总结一下官方发布的C版本客户端 hiredis,了解hiredis 客户端大致实现细节。在理解代码之间需要了解通信协议的特点,我上一篇转载的文章已经有过介绍,大家可以去看一下。 hiredis 提供了同步、异步访问,异步 API 需要与一些事件库协同工作,主要看一下同步API的实现。 hiredis 与服务端通信的API比较简单,主要有这几个步骤: 建立连接 发送命令 等待结果并处理 释放连接 一、相关数据结构 redisContext 保存连接建立后的上下文。 err 保存错误码,如果为0表示没错,如果非0那么错误说明保存在 errstr 中;fd是连接建立后的套接字;flags表示连接的标识;obuf 保存要向 redis-server 发送的命令内容;reader 用来读取从服务端返回的消息,redisReader中的buf成员用来保存内容;connection_type 表示连接类型,有两种分别是REDIS_CONN_TCP 和 REDIS_CONN_UNIX;timeou 继续阅读 >>


杜肖孟 18/06/28 21:03:07
期末考试即将到来,赶在人机界面考试之前,先把 HTML 复习一下。 一、HTML 概述 1. HTML的基本概念 1.1 HTML 介绍 HTML是Hyper Text Markup Language(超文本标记语言)的缩写,是构成Web页面的基本元素,是一种规范,一种标准。 HTML不是一种编程语言,而是一种描述性的标记语言,通过标识符来标识网页中内容的显示方式,例如图片的显示尺寸、文字的大小、颜色、字体等。 浏览器能够对这些标记进行解释,按照要求显示出文字、图像、动画、媒体等网页内容。 HTML文件的后缀名是 .html 或 .htm ,由于HTML是一个纯文本格式的ASCII文件,可以用任何文本编辑器编写HTML网页文件。 主要功能: 格式化文本:设置文本字体、字号、颜色以及文本段落、对其方式等。 创建列表:把信息用一种易读的方式表现出来。 建立表格:表格为浏览者提供快速找到所需信息的显示方式,还可以用表格来布局网页。 插入图片:还可以设置图像的各种属性,如大小、边 继续阅读 >>


李猛 18/06/28 17:42:47
本文档翻译自: http://redis.io/topics/protocol 。 Redis 协议在以下三个目标之间进行折中: 易于实现 可以高效地被计算机分析(parse) 可以很容易地被人类读懂 网络层 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。 请求 Redis 服务器接受命令以及命令的参数。 服务器会在接到命令之后,对命令进行处理,并将命令的回复传送回客户端。 新版统一请求协议 新版统一请求协议在 Redis 1.2 版本中引入, 并最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式。 你的 Redis 客户端应该按照这个新版协议来进行实现。 在这个协议中, 所有发送至 Redis 服务器的参数都是二进制安全(binary safe)的。 以下是这个协议的一般形式: *<参数数量> CR LF $< 继续阅读 >>


杜肖孟 18/06/28 17:41:22
什么是string_view std::string_view是C++ 17标准中新加入的类,正如其名,它提供一个字符串的视图,即可以通过这个类以各种方法“观测”字符串,但不允许修改字符串。由于它只读的特性,它并不真正持有这个字符串的拷贝,而是与相对应的字符串共享这一空间。即——构造时不发生字符串的复制。同时,你也可以自由的移动这个视图,移动视图并不会移动原定的字符串。 正因这些特性,当你不需要改变字符串时,应当抛弃原来使用的const string而采用新的string_view,这样可以避免多余的字符串拷贝。 构造 std::string_view允许通过C风格的字符串、字符串字面量、std::string或者其他的string_view进行构造。在构造的同时允许指定“大小”。 const char *cstr_pointer = "pointer"; char cstr_array[] = "array"; std::string stdstr = "std::string"; s 继续阅读 >>


娄泽豪 18/06/26 21:55:29
注:本篇博客只是讲述了一致性哈希的思想,我们会在之后讲述分布式哈希表以及一致性哈希的一种实现(Chord算法)。 什么是一致性哈希算法? 引用自维基百科: 一致性哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位几乎需要对所有关键字进行重新映射。 总结:一致性哈希算法主要关注的是在分布式架构中,当节点数目发生变化的时候(增加/删除),怎样使再哈希的数据量最少。 一致性哈希的引出 在分布式系统中,节点的宕机、某个节点加入或者移出集群是常事。对于分布式存储而言,假设存储集群中有10台机器(node),如果采用传统Hash方式对数据分片(item)(即数据根据哈希函数映射到某台机器上存储),哈希函数应该是这样的:hash(item) % 10。根据上面的介绍,当node数发生变化(增加、移除)后,数据会被重新“打散”,导致大部分数据不能落到原 继续阅读 >>


董恒毅 18/06/26 21:06:58
C++ 17标准已经发布了有一段时间了(甚至于后一个版本C++ 20也在路上了),最近终于得空(懒癌治愈),查阅了相关资料,简单上手一下。感觉到,一个是“现代”C++和C语言确实已经是天差地别,另一个就是标准库中的东西以及新语法确实更加方便我们编程了。虽然这些特性也许很长一段时间内都不一定用得上,然而学习一下总是好的,并且,体验一下“更现代”的C++的感觉也不错。 带初始化的选择语句 这个特性用于if和switch语句中,现在允许在这两个选择语句中声明并初始化一个变量,该变量在整个选择语句中都可用。这个特性显然有助于代码的清晰性,现在你可以这样写了: if (int fd = open("filename", O_RDWR | O_CREAT); fd == -1) { perror("something"); } else { // 可以继续在这里使用fd } switch (int op = getOp(); op) { case xxx: ... case 继续阅读 >>


娄泽豪 18/06/26 19:24:43