- 博客(53)
- 收藏
- 关注
原创 用Go语言爬取基金数据(使用MySQL存储)
最近看到了一个Python爬取基金的实现,就心血来潮用Go语言实现了一个类似的版本:https://github.com/liu-jianhao/crawl_funds0. 准备工作选爬取的网站:https://danjuanfunds.com/funding/005827?channel=1300100141用Go语言的http包调用一下resp, err := http.Get(url)可以看到返回一个大JSON,然后挑选出里面我们需要的数据1. 爬取数据先读取fund
2021-08-14 21:00:24 608
原创 Talent Plan:实现一个 Mini 版本的分布式 Key-value 数据库(二)
第一篇:https://blog.csdn.net/westbrookliu/article/details/107451683project2 RaftKV——Leader election这次实现的是Raft算法,该算法分为三部分实现:Leader electionLog replicationRaw node interface预备知识什么是Raft算法?可以看看下面这篇文章了解一下https://blog.csdn.net/westbrookliu/article/detai
2020-07-25 17:35:44 1132 2
原创 Talent Plan:实现一个 Mini 版本的分布式 Key-value 数据库(一)
最近想做一做一些小项目巩固一下Go语言知识和分布式系统的知识,偶然看到PingCAP的一个课程:https://university.pingcap.com/talent-plan/。看上去挺不错,本来还想搞一搞Rust的,但半途而废了orz,写习惯了Go,结果Rust看得很不顺眼(还是太菜了)。因此开一个坑,从五个路径中选了路径二,做完路径二再看看有没空做下其它路径。。先贴上我的github的代码:https://github.com/liu-jianhao/tinykv,我的解决思路方案再my_so
2020-07-19 21:25:37 2042
原创 QT5实现TCP聊天室的客户端,Linux下实现C++实现服务器端(从零开始)
由于暑假没有什么计划,所以打算利用这段时间从零开始自己写一个小项目:聊天室。 暂定聊天室只实现一个聊天室,不支持动态增加聊天室或者添加好友之类的,而且界面要求不高,在功能上下功夫。聊天室采用C/S模型,我将自己编写的聊天室服务器端部署在阿里云服务器上,这样聊天室就不仅限于局域网。具体的源代码和完成这个项目的过程我都放在github上(如果喜欢的话,欢迎star):https://git...
2018-07-22 18:53:22 5035 1
原创 COS461-普林斯顿大学计算机网络课程-assignment1实现
COS461是普林斯顿大学的计算机网络课程:https://github.com/PrincetonUniversity/COS461-Public课程实现assignment1assignment1这次作业的任务大概分为两大部分:搭建环境和socket编程。搭建环境按照教程一步一步搭建即可,期间可能会有各种问题,这时候Google或者百度解决即可。socket编程编程部分分为两部分,c语言版本和python或者go版本的server和client,我这里使用go语言。建议先仔细看编程要求
2021-08-22 23:09:02 437
原创 Erlang程序设计(第2版)源代码和课后练习答案(第五章-第八章)
github地址ch05-记录与映射组记录:可以给元组里的各个元素关联一个名称映射组:哈希表rr(read records)映射组K => V 更新或者新增K := V 更新,新增会报错练习答案(1)需要用到第三方库parse_file(File) -> case file:read_file(File) of {ok, Content} -> case rfc4627:decode(Content) of
2021-08-20 21:25:32 385 2
原创 Erlang程序设计(第2版)源代码和课后练习答案(第一章-第四章)
github地址ch02-Erlang速览Hello Wrold$ erlEshell V12.0.3 (abort with ^G)1> c(hello). # 编译{ok,hello}2> hello:start().Hello worldok$ erlc hello.erl$ erl -noshell -s hello start -s init stopHello world文件服务进程Eshell V12.0.3 (abort with ^G)1&
2021-08-15 22:39:11 402
原创 Rust设计之形
Rust设计之形参考视频:https://www.bilibili.com/video/BV1564y1177ARust要解决的问题先看以下C语言的代码:typedef struct Dummy { int a; int b; } Dummy;void foo(void){ Dummy *ptr = (Dummy *)malloc(sizeof(struct Dummy)); Dummy *alias = ptr; free(ptr); int a = alias.a; // Use
2021-07-21 21:13:33 174
原创 redis深度历险学习笔记
Redis基础数据结构string字符数组listhash数组+链表set无序、唯一的zsetvalue是唯一的、每个value有一个score,代表value的排序权重内部用跳表实现过期时间Redis所有数据结构都可以设置过期时间,是以对象为单位...
2020-08-30 09:55:35 317
原创 只需十分钟,几十行代码实现令牌桶算法
令牌桶算法代码地址前言在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。本文围绕限流,讨论令牌桶相关算法。背景令牌桶算法最初来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。流程产生令牌:周期性的以一定速率往令牌桶中增加令牌。如果桶中的令牌数达到桶容量,丢弃多余令牌。消耗令牌:接受请求或输入数据时会消
2020-08-19 20:14:25 1929
原创 Vim 快捷键学习笔记
我用vim已经快三年多了,但是对于vim来说仍然是个初学者,因为自从入了门之后,一些不常用的命令老是记不住,在敲代码的时候也没有特意去找最方便的命令来使用,导致现在也只是记得最常用的几个命令。下面就记录了我在使用vim时最常用的一些命令。最常用(内功)变身i:进入插入模式<Esc>:进入普通模式v:进入可视模式:q:普通模式下退出,:wq(保存退出),q!(强制退出,修改不保存)招式入门这个需要慢慢适应,戒掉方向键k:上j:下h:左l:右单词瞬步这个也需要慢
2020-08-01 10:15:23 165
原创 Go语言学习笔记——方法
方法的声明方法的声明和普通函数类似,只是在函数名字前面多了一个参数,这个参数把这个方法绑定到这个参数对应的类型上,例:type Point struct{ X, Y float64 }func (p Point) Distance(q Point) float64 { return math.Hypot(q.X-p.X, q.Y-p.Y)}指针接收者的方法由于主调函数会复制...
2019-08-30 20:06:26 174 1
原创 Go语言学习笔记——函数
函数声明每个函数都包含一个名字、一个形参列表、一个可选的返回列表以及函数体:func name(parameter-list) (result-list) { body}当函数存在返回列表时,必须显示地以return语句结束,除非函数明确不会走完整个执行流程,比如在函数中抛出宕机异常挥着函数体内存在一个没有break退出条件的无限for循环函数的类型称为函数签名,当两个函数拥...
2019-08-29 09:58:41 144
原创 5分钟用Go语言实现一个协程池
近期在学习Go语言,自己实现了一个很简单的协程池,记录一下实现过程总体架构可以看到,架构很简单,就是客户通过Channel传一些任务给协程池,然后协程池里的worker就会执行Task结构体type Task struct { taskId int f func() error}Task结构体很简单,一个id,一个要执行的函数// Task的构造函数func NewTask...
2019-08-26 17:52:55 3413 3
原创 Go语言学习笔记——struct
结构体是将零个或这多个任意类型额命令变量组合在一起的聚合数据类型成员变量成员通过.号方式来访问结构体是一个变量,它的所有成员都是变量,因此可以给结构体的成员赋值。或者获取成员变量的地址,然后通过指针来访问它如果一个结构体变量名称是首字母大写的,那么这个变量是可导出的,这个是Go最主要的访问控制机制命令结构体类型S不可以定义一个拥有相同结构体类型S的成员变量,也就是一个聚合类型不可以包含...
2019-08-25 16:51:56 171
原创 Go语言学习笔记——map
map是散列表的引用,map的类型为map[K]V,K和V是字典的键和值对应的数据类型,map中所有的键都拥有相同的数据类型,同时所有的值都拥有相同的数据类型,但键的类型和值的类型不一定相同键的类型K必须是可以通过操作符==来进行比较的数据类型,所以map可以检测某一个键是否已经存在初始化内置函数make创建ages := make(map[string]int) // 创建一个...
2019-08-25 15:40:44 161
原创 Go语言学习笔记——数组、slice
数组数组是具有固定长度且拥有零个或多个相同数据类型元素的序列由于数组固定长度,因此用的比较少,slice的长度是动态的,用的更多初始化默认初始化为元素类型的零值var a [3]int省略号出现在数组长度的位置,那么数组的长度由初始化的元素个数决定q := [...]int{1, 2, 3}fmt.Println("%T\n", q) // "[3]int"通过指定...
2019-08-23 13:55:56 191
原创 半小时学会什么是分布式一致性算法——Paxos
Paxos目标:复制日志复制日志 => 复制状态机所有服务器按照相同的顺序执行相同的命令一致性模型确保正确的日志复制只要大部分服务器是运行的系统就能工作失败的模型:失败-停止(非拜占庭),延迟/丢失信息Basic PaxosProposers:活动的:提出特定的值被选中处理客户请求Acceptors:被动的:响应消息给proposers回应达成...
2019-08-19 09:38:35 27870 2
原创 半小时学会分布式一致性算法——Raft
Raft目标:日志复制日志复制 => 复制状态机所有服务器以一样的顺序执行一样的命令一致性模型确保合理的日志复制只要大多数服务器能运行,系统就能服务失败模型:失败-停止(非拜占庭)、延迟/丢失消息达成一致性的方法两种方法:对等的,leader-less:所有服务器扮演同样的角色客户可以与任意一个联系非对等的,leader-based:在任意给定...
2019-08-19 09:37:48 622
原创 Linux下kafka部署及简单测试
依赖kafka依赖zookeeper,而zookeeper又依赖JavaJava就不讲怎么安装了,应该都装过了,验证Java是否安装成功:$ java -versionopenjdk version "1.8.0_171"OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-2-b11)OpenJDK 64-Bit Server ...
2019-08-19 00:30:34 2280
原创 leveldb源码阅读(一)
include/leveldb/slice.hslice是leveldb内部使用的字符串类,代码很简单。该类只有两个数据成员: const char* data_; size_t size_;函数成员也很简单,如通过各种方式构造,比较,移除前缀等等。util/coding.hcoding这个类是用来类型转换和压缩空间的,比如声明一个uint32类型的变量,要分配4个字节的空间,如果...
2019-01-05 16:52:13 4947 2
原创 MIT6.824-2012——从零开始写一个分布式文件系统yfs
yfsCpp11yfs是一个分布式文件系统https://github.com/liu-jianhao/yfsCpp11https://pdos.csail.mit.edu/archive/6.824-2012/labs/index.htmllab1-lab7小结lab1:实现锁服务器Q&A锁服务器有什么用?yfs是一个分布式文件系统,客户端通过网络与服务器通信,那要怎么...
2019-01-02 23:52:02 1299
原创 Bitcask:A Log-Structured Hash Table for Fast Key/Value Data 阅读笔记
一个Bitcask实例就是一个目录,我们保证在一个时刻只有一个系统进程可以打开Bitcask进行写操作。在一个时刻,只有一个文件是“active”的。当文件达到一定的大小限制就会关闭,并创建一个新的“active”文件。一旦一个文件关闭了,就视为是不可变的,即不会再打开来进行写操作。“active”file是以追加的方式来进行写操作,意味着顺序写不会导致磁盘搜索。一个key-value ...
2018-12-28 12:26:12 868
原创 RabbitMQ入门
安装rabbitmq依赖于erlang,所以要先安装erlang:sudo apt-get install erlang然后安装rabbitmq:sudo apt-get install rabbitmq-server运行sudo rabbitmq-server -detached 查看状态:sudo rabbitmqctl status查看集群状态:sudo rabb...
2018-12-26 14:22:55 175
原创 分布式系统之CAP和BASE理论
CAP定理一致性(Consistency)在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致性的特性。可用性(Availability)可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。分区容错性(Partition tolerance)分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务...
2018-11-13 12:41:31 278
原创 C++设计模式
C++设计模式https://github.com/liu-jianhao/Cpp-Design-Patterns什么是设计模式“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。——Christopher Alexander如何解决复杂性?分解人们面对复杂性有一个常见的做法:即分而治之,将大问题分...
2018-11-10 10:32:56 6826 1
原创 CMU15-445数据库系统课程实验详解
CMU-15-445学完CMU15-445之后有很大的收获,特别做其中的实验,因此记录了一些笔记。课程地址CMU的数据库系统课程时间表实验代码课程简介该课程是CMU的数据库系统的基础课程,实验需要使用C++11,一共有四个实验:缓冲池管理器B+树并发控制记录和恢复实验代码在Lab目录下,如果想获得没完成实验前的代码,可以在github搜索,找找就有了。建议每次实验前都...
2018-11-10 10:31:17 8487
原创 实现一个简单的Web服务器(C语言)
Web服务器github地址该项目的第二部分是在第一部分的基础上继续完善Web服务器。第二部分主要是完成两个功能:记录日志和HTTP响应。记录日志该部分比较简单,只要简单地将一些服务器的信息添加到指定日志文件即可,也不需要完成很复杂的功能,有了日志功能也方便调试。由于要在启动服务器时将日志文件传给main函数,所以我将日志文件名声明为全局变量,方便在整个项目中往日志文件中添加日志信...
2018-11-10 10:26:13 8823 1
原创 C++原子操作
为什么要使用原子操作读和写不是atomic编译器生成的代码有可能改变操作次序使用mutex两个问题都可以解决,但代价比较昂贵,所以用atomic取代。用例#include <atomic> // for atomics#include <future> // for async() and futures#include <thread&...
2018-10-08 21:16:11 1208 1
原创 使用Hugo将个人博客搭建到Github上
刚开始搭建完大概长这样话不多说,现在开始搭建安装Hugo在Hugo里找到对应版本下载安装,我的主机是deepin,选择Linux64位的dep包查看版本信息,显示以下即安装成功:$ hugo versionHugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z创建新网站$ hugo ...
2018-09-27 13:22:45 736 1
原创 快速了解C++11新特性
C++11新特性nullptrnullptr用来表示一个指针指向所谓的no valueC++保证NULL其实就是0(其类型可以使int也可以是long)C语言中的NULL通常定义为(void*)0,这在C++中并不明确,NULL必须是个整数类型,否则你无法将NULL赋值给一个指针。这是因为C++中并没有定义从void*到任何其他类型的自动类型转换操作。从C++11开始应该使用nullp...
2018-09-25 19:46:41 180
原创 五分钟了解什么是Google文件系统(GFS)?
引子以前有人问过我C++的.h文件和.cpp文件的组织方式,当时很随口的回答,.h中是类的声明,.cpp中是类的实现。最近要实现简单二叉树结构,所以用到队列类,我以queue.h,queue.cpp,最后用main.cpp作为测试文件,queue.cpp中#include “queue.h”,并在main.cpp中#include “queue.h”,想来这是常规的文件组织方式,不会错的。结...
2018-09-18 13:02:45 7815
原创 《Linux高性能服务器》附带项目springsnil源码解析
源码地址安装及使用下载源码:git clone https://github.com/liu-jianhao/springsnail.git然后进入springsnil目录直接make即可生成可执行文件填写配置文件,我测试的是网站是网易云音乐,首先我先看看网易云音乐服务器的ip有哪几个:$ nslookup music.163.comServer: ...
2018-09-13 22:02:29 1244
原创 Google leveldb学习笔记一:基本架构与安装使用
简介LevelDB是一个Google编写的快速键值存储库,它提供从字符串键到字符串值的有序映射。基本架构LSM树存储引擎先说什么是存储引擎:存储引擎是存储系统的发动机,直接决定了存储系统能够提供的性能和功能存储系统的基本功能包括:增删读改,读取操作又可以分为随机读取和顺序扫描哈希存储引擎是哈希表的持久化表现,不支持顺序扫描,对应的存储系统为键值存储系统B-Tree...
2018-09-10 21:24:23 831
原创 什么是分布式存储系统?
分布式存储系统定义分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务特性可扩展低成本高性能易用挑战分布式存储系统的挑战主要在于数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。分布式存储涉及的技术主要来自两个领域:分布式系统以及数据库。 + 数据分布 + 一致性 + 容错 + 负载均衡...
2018-09-09 10:03:22 6571
原创 什么是数据库系统?
数据库系统数据库满足的五条规则允许用户使用专门的数据定义语言创建新的数据库并指定其模式给予用户使用适当的语言来查询数据和修改数据的能力支持非常大量的数据长期地进行存储,允许高效地存储数据以进行查询和数据库修改使数据具有持久性,即能从故障、多种类型的错误或者故意滥用中进行恢复控制多个用户同时对数据进行访问,不允许用户间有不恰当的相互影响(孤立性),并且不会发生在数据上进行了部分的而...
2018-09-08 23:51:22 3739
原创 分布式实时处理系统Hurricane的架构
Hurricane总体架构图各部件介绍Spout是消息源,拓扑结构中所有的数据都来自消息源,而消息源也是拓扑结构中消息流的源头。Bolt是消息处理单元,负责接收来自消息源或数据处理单元的数据 流,并对数据进行逻辑处理,然后转发到下一个消息处理单元,基本封装了所有的数据处理逻辑。SpoutExecutor是一个线程,是所有消息源的执行者,每一个SpoutExecutor负责执行一...
2018-09-08 21:20:07 1082
原创 《Redis 设计与实现》第二版读书笔记之压缩列表
简介压缩列表是列表键和哈希键的底层实现之一。压缩列表的构成压缩列表是Redis为了节约内存而开发,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值...
2018-09-08 21:09:07 160
原创 《Redis 设计与实现》第二版读书笔记之整数集合
简介整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现实现整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t、int64_t的整数值,并且保证集合中不会出现重复元素。 intset.h/intsettypedef struct intset {...
2018-09-03 20:42:34 203
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人