自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Erick Lv的笔记

所有的博客仅作为个人笔记

  • 博客(532)
  • 资源 (4)
  • 收藏
  • 关注

原创 github hexo搭建博客

参考资料https://github.com/limedroid/HexoLearning

2021-09-19 16:30:24 93

原创 线段树

#include <iostream>#include <cstring>using LL = long long;const int MAXN = 100000000;int arr[MAXN] = {0};int tree[MAXN] = {0};inline int LEFT(int n) { return 2 * n;}inline int RIGHT(int n) { return 2 * n + 1;}inline int M

2021-03-29 22:37:38 126

原创 mac安装gcc10

mac安装gcc-10gcc-10支持C++20的大部分特性,最近为了学习,记录了一下安装步骤。homebrew安装的版本,总存在链接问题,因此我们直接源码编译安装。xcode-select --installcd ~mkdir gcc_all && cd gcc_allcd ~/gcc_all/gcc-10.1.0mkdir build && cd build../configure --prefix=/usr/local/gcc-10.1.0 \

2021-03-13 00:42:04 665

原创 数据密集型应用系统设计--数据分区

数据分区与数据复制分区的目的一般是提高可扩展性、容错性和集群吞吐,同一个分区会在多个节点中都有副本。容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点可扩展性:新增节点时,会有多个节点把自己的部分数据给新的节点,这些节点传输的数据比较少提高集群吞吐:数据和查询复杂会均匀的分配在所有的节点上键-值数据的分区一般来说,数据分区都是通过特定的key来检索对应的value,因此k-v分区是最主流的方式。关键字区间分区每个分区负责一个或者多个关键字区间,一般根据关键

2021-02-23 23:31:04 272

原创 数据密集型应用系统设计--数据复制

简介引入数据复制的原因:数据距离用户更近,让用户访问延迟降低提高容错机制,某个节点坏掉后,其备份节点仍然能提供服务负载扩展到多台机器,提高吞吐量复制技术的真正难点在于如何处理持续变更的数据。主节点与从节点主从复制:指定某个副本作为主副本,客户端全部写入主副本,更新主副本本地存储。主副本把数据发送给从副本,从副本严格按照主副本发来的操作顺序,操作本地存储的数据客户端可以从所有的副本中读取数据同步复制: 主节点发送给从节点数据后,需要等从节点回复异步复制: 主节点发送给从节点数据

2021-02-20 00:23:44 191 1

原创 数据密集型应用系统设计--数据存储与检索

数据结构追加型数据库和哈希索引数据库最简单的形式,是追加型的方式:写入数据直接追加到文件尾部,O(1)复杂度读取数据从文件头遍历,获取最新的数据这种数据库,没有删除操作,所有的数据都是追加性质的,这也是日志形式的数据库。为了改善查询效率,我们需要给追加型数据库创建索引,一般来说是Hash索引。最基础的Hash索引:每个键值都有一个唯一的Hash值Hash值对应一个偏移量,用于映射数据在文件中的偏移位置内存够大的情况下,Hash表存储到内存中,先查询Hash表,如果Key存在,则根据

2021-02-18 23:38:24 301

原创 C++ .template 关键字

template 关键字除了用于作为模板声明之外,还有一个作用,显式说明模板成员函数,这一点类似于typename 显式说明成员类型。给出代码实例:#include <iostream>template<typename T, size_t N>class Collection {public: template<size_t I> void setValue(T &&t) { data[I] = t; }

2021-01-06 23:32:06 905

原创 SFINAE 应用1

简介Substitution Failed Is Not An Error,之前笔记介绍过。这里介绍一个拓展的应用,foo 函数传入可调用对象和对应的参数,之后会判定是否可以传入对应的参数,并返回函数的执行结果,具体参考代码。这是 SFINAE 一个经典应用#include <iostream>#include <type_traits>#include <utility>#include <string>// 获取 Fn 调用 Args 的结果

2021-01-05 13:37:33 104

原创 std::nullptr_t & std::void_t

std::nullptr_tstd::nullptr_t是nullptr的模板类型,用法如下:#include <iostream>#include <type_traits>void foo(int *) { std::cout << "int*\n";}void foo(double *) { std::cout << "double*\n";}void foo(std::nullptr_t) { std::c

2021-01-04 22:52:54 325

原创 RTTI & decltype & declval

ri# RTTIRun-Time Type Information,运行时类型信息。RTTI这种情况,一般是运行时的类型转换的,一般是和类型转换配合使用,给出代码实例:#include <iostream>class Base {public: virtual void foo() { std::cout << "base derived\n"; }};class Derived: public Base {public:

2021-01-01 14:22:24 160

原创 SNIFE 和 std::enable_if

类型基础在回顾模板之前,需要明确一个概念:模板编程是针对类型的计算。。这和我们平时的代码不同,我们平时写的程序都是针对数据的。在模板元编程中,typename 用于定义类型;using 用于给模板类型赋值,注意这里的赋值和变量的赋值意义不同。参考下面的代码:#include <iostream>using LL = long long;struct Foo { using T1 = int; using T2 = float;};int main() {

2020-12-31 01:09:34 376

原创 C++字节存储方式和reinterpret_cast

数据存储方式和数据类型变量变量可以认为是一个内存块,该内存块中存放了变量的二进制表示格式。其实,汇编语言中,没有变量类型的概念,而在C等静态高级语言中,都有变量类型的概念。1字节 = 1B = 8bit = 2^8 => 0-256所以ASCII标准字符有256个,sizeof(int) = 4,因此int最大是2(8×4−1)2^{(8 \times 4 - 1)}2(8×4−1),-1是因为有符号位可以这么理解,变量类型只是程序员告诉编译器变量的表示方式;而最终的汇编形式,仍然是没有数据

2020-10-27 13:51:30 496

原创 std::any

std::any可以认为,这是C语言void*的高阶版本,直接给出代码实例:#include <iostream>#include <any>#include <variant>#include <type_traits>#include <vector>struct Op1 {};struct Op2 {};void test(const std::vector<Op1>&) { std::cou

2020-08-17 14:16:18 181

原创 Java基础总结--1

基础部分Java的String是不可变对象,比如:public class Foo { public static void main(String arg[]) { String s = "hello world"; String s1 = s + " !"; // 追加字符 String s2 = s.s.substring(0, 5) + " foo"; }}s1和s2是会共享原来s的字符的。如果经常变化字符串,可以使用StringBuilder,可以与String互相转化

2020-07-23 21:44:17 107

原创 boost context上下文切换

上下文简介首先要理解boost::context的概念和应用场景。程序在执行的时候,当前的执行的代码环境和所处的状态,就是context。boost::context保留了当前程序执行时的寄存器等的状态,可以认为是一个上下文A;然后线程就可以去执行其他的代码,完成执行后,可以切回上下文A,并从当初切走的地方执行,而且当初的上下文的现场不变,这就是完成了一次真正意义上的上下文切换。上线文切换,在协程和用户态线程等有重要的意义(统称它们为routine),我们可以启动一定数量的操作系统的线程,然后让rout

2020-07-19 20:57:32 2383 1

原创 C++重载->和*运算符

->和*也可以用于重载,不过这种模式不太常见。最经典的例子是智能指针。直接给出一个简版的unique_ptr的代码示例,说明这两者的重载模式:#include <iostream>template <typename T>class UniquePointer {public: UniquePointer(T* val = nullptr) { m_val = val; } ~UniquePointer() { // 退出时

2020-07-14 00:17:14 307

原创 C++类型萃取 -- 1

std::enable_if_t#include <iostream>#include <type_traits>#include <string>template<typename T, typename = std::enable_if_t<(sizeof(T) > 2)>>void foo(const T&& val) { std::cout << val <&lt

2020-07-07 17:07:51 143

原创 C++ 可变索引模板 和 template template

代码实例:#include <iostream>#include <deque>template <typename T>class MyContainer {public: void push(T&& arg) { m_que.emplace_back(std::forward<T>(arg)); } T pop() { auto&& v = m_que.fr

2020-07-03 19:18:02 175

原创 C++模板元编程---折叠表达式

折叠表达式同样是运行在编译期间的,先给出基本的规则:注意,一元表达式只有&&、||或者,有缺省值,三者空包的默认值分别是:true、false和void()所有支持的运算符是:+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*给出一元折叠代码示例:#

2020-06-27 18:54:11 318

原创 C++模板元 -- 变长参数模板

变长参数模板边长参数模板的一般格式是:// 编译递归的终止位置template <T arg>void foo(T arg) { // do something with arg}// 展开编译表达式template <typename T, typename ...Args>void foo(T arg, Args... args) { foo(arg, args...);}给出代码示例,注意都是编译器展开的代码模板,而非运行期。#include

2020-06-27 18:26:25 383

原创 理解C++ Executor的设计理念

文章目录简介代码示例参考简介很多时候,我们的可调用对象需要某些非参数依赖的执行环境。可以这么理解,我们的任务是就绪的,不需要依赖外界传入参数了,只需要以某种方式控制方法的when 、where和how即可。三个分别是指:where:可调用对象的执行位置,比如可以在内部或者外部的处理器(线程)上执行,并从内部或者外部的处理器(线程)上获取结果when:可调用对象的执行时间,比如立刻执行或者被调度执行how:可调用对象的执行方式,比如在CPU或者GPU上执行,可以矢量化计算等举个例子:int

2020-06-25 19:59:55 3104 1

原创 Ubuntu18.04安装facebook folly库

安装步骤ubuntu18.04安装的boost有点陈旧,因此自行下载最新版本,执行安装即可:https://www.boost.org/具体步骤直接参考readme安装gtest:wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz && \tar zxf release-1.8.0.tar.gz && \rm -f release-1.8.0.tar.gz &&amp

2020-06-20 01:11:39 1142 1

原创 CMake总结笔记1

总结笔记

2020-06-20 01:09:28 103

原创 计算机网络总结

计算机网络基础TCP连接Unix中的EOF,可以参考这里:https://en.wikipedia.org/wiki/End-of-file总结为:读取数据时,数据流结束的标记。比如在读取标准输入的时候,我们输入EOF符号,来通知程序终端输入结束了,因为程序不知道标准输入什么时候为结束。同样的,TCP是面向流的,因此也需要EOF机制来通知通信的对方,自己的数据流结束了。3次握手的过程:...

2020-03-20 14:18:18 224

原创 Golang的GC和内存逃逸

简介每个版本的Golang的垃圾回收都在不断优化中,而且方法和策略都在变化,因此这里只是总结出以下几个关键点:什么样的数据需要GC触发GC的条件是什么GC时发生了什么能否从代码层面上提高GC的效率GC的基本流程Golang在确定的时间,或者内存分配到达一定程度时,进行GC。GC时,会停止STW(Stop The World),即对外的服务都会暂停,然后进行垃圾回收处理。Go1.1...

2020-03-01 22:35:58 1881

原创 Golang的协程调度

调度的基础,模型关系的映射GPM模型:G,Goroutinue被调度器管理的轻量级线程,goroutine使用go关键字创建调度系统的最基本单位goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等。默认的大小是2KB,根据需要逐步上涨。G绑定到P上执行P,Processor逻辑执行单元存储了M执行的上下...

2020-03-01 20:33:17 1056

原创 slice和map的高级主题

slice基础的内存模型:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4eCAPE8-1583047423727)(en-resource://database/904:1)]传入一个slice占用24字节,分别是ptr、len和cap,分别一个字节。append会再slice后面追加元素,具体参考代码1cap没满的情况下,直接在后面的内存上追加数...

2020-03-01 15:24:25 165

原创 一致性哈希

问题背景假设有N台redis作为缓存,传统的Hash算法是:ser = hash(k) % N,即对键值哈希,然后对服务器的个数取余,这样做简单、而且分布均匀,但是有两个问题:- 假设有服务器x发生了宕机,那么此时取余命中x是失效的,我们需要对键值进行相应的迁移,把服务器变成N-1台,但是这样面临服务器一定时间不可用的情况,造成redis雪崩- 假设容量不够,我们需要扩容,此时新加入服务器后...

2020-02-26 21:43:15 180

原创 redis缓存雪崩、缓存穿透和缓存击穿等总结

redis作为缓存互联网高并发请求数据的情况,可能出现频繁访问MySQL的情况,但是MySQL由于自身的特性,可能无法抗住这么大的压力,因此我们想利用redis存储一些MySQL中的数据,redis作为缓存时,一般有以下几个场景:数据的一致性不是强制的比如查询UV的次数,允许和数据库有一些不一致,更新redis是异步的。而像支付等,是强一致性的,则不能使用缓存(只是举个例子),redis更...

2020-02-23 22:49:07 482

原创 CMake构建工程

目标:使用CMake构建多级的目录的C++项目,包含动态库的引用。文件结构:.├── CMakeLists.txt # 1├── build├── lib # 这里存放动态库│ ├── CMakeLists.txt # 2│ ├── lib-bye │ │ ├── CMakeLists.txt # 3 │ │ └── bye.cc # 4│ └──...

2020-02-23 02:52:30 306

原创 编译过程、静态库和动态库

C/C++代码到可执行文件从代码到最终的程序,分为4个步骤,分别是:预编译:编译预处理,比如#define和#ifndef之类的,C++的inline也是在这期间处理的编译:把代码转换成汇编,包括词法分析、语法分析和语义分析等汇编:把汇编语言转换成机器码,输出的是目标文件。比如*.o的文件链接:把目标文件聚合成可执行文件链接:链接本质上是把多个ELF文件,按照符号符号等拼接成执行文...

2020-02-23 00:35:36 748

原创 boost.asio无锁异步并发

简介给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多个线程执行。那么boost::asio的基本代码框架如下,给出伪代码示例:var scoket; // 一个socketasync_read(socket, buf, [](){ // 处理一...

2020-02-21 17:11:27 1326

原创 boost.asio异步并发Tcp服务器

简介reactor模式proactor模式异步并发模型说明代码示例基于boost 1.70和C++14CMakeLists.txt# cmake_minimum_required(VERSION <specify CMake version here>)project(boost_asio)set(CMAKE_CXX_STANDARD 14)set(CMAKE_C...

2020-02-19 23:08:47 1124

原创 Reactor和Proactor模式

简介Reactor和Proactor都是基于事件的并发模型。除了基于事件外,还有基于线程的并发模型。这里先简单介绍下两种的特点以及区别。基于线程的模型主要有两种模型:每个客户端的连接分配一个线程,每个线程独立的处理连接。有一个线程池,每个客户端的生命周期都拥有一个线程。可以看出,这两种方式的核心思想都是,每个连接,都独立地拥有一个线程,这个线程伴随着该连接的整个生命周期。这种方式...

2020-02-19 22:51:55 107 1

原创 MySQl索引基础

基础的索引类型以及优缺点平衡树基础InnoDB引擎的平衡树采用B+Tree索引,先分析B-Tree和B+Tree的结构特点,以及为什么采用B+Tree结构。B-Tree结构:图中的数字都是键值,Data表示对应键值的数据,每个节点都有自己的键值和对应的数据,但是有对应的范围,介于[m2,m][\frac{m}{2}, m][2m​,m]之间。键值采用搜索平衡树的方式排列,而且中序遍历一...

2020-02-19 12:40:52 69

原创 TCP协议总结

TCP三次握手和4次挥手:四次挥手中,Server端发送FIN,是因为有些情况下,可能存在客户端发送完FIN之后,还存在一些未完成的数据,因此让服务器发送FIN表示数据已经发送完了。在建立完TCP链接之后,Server对client的每个数据都会发送一个ack验证,这保证了数据传输的可靠性。MSS:Max Segment Size 最大片段长度,TCP把数据封装成帧,这是只数据不会被IP层...

2020-02-18 00:05:41 292

原创 kafka保证数据可靠性的方式

可靠性保证和复制机制Kafka的以下几个基本特性保证了基本的可靠性:Kafka保证一个分区的消息是FIFO的只有消息写入了所有分区的同步副本时,才认为是已提交的只要有一个副本活跃,则消息就不会丢失消费者只能读取已提交的消息生产者可以进行有关配置,使得不一定等到数据认为是已提交的之后,才进行下一轮的投递,这是在可用性和一致性的之间的平衡分区副本复制方式和同步条件:每个分区所在的...

2020-02-17 16:56:11 207

原创 Kafka原理

Kafka的复制和备份关于分区的几个总结:一个分区a有一个首领broker A,且a是首领分区一个分区可以在多个broker中存在副本,此时这些副本都是复制的首领分区的内容,而且生产者和消费者操作分区时,必须是首领分区。如果一个broker失效,而且该broker中有一个或者多个首领分区,那么其余包含这些首领分区副本的broker,会重新选举并接替这个broker中首领分区的领导权。对应...

2020-02-16 21:34:43 121

原创 kafka基础笔记

基础概念kafka是一个消息队列系统,不同的生产者和消费者,可以向kafka写入自己的数据,实现数据的流动;kafka解耦了生产者和消费者,它的ack机制保证了消息传递的可靠性,借助zookeeper等实现了分布式的消息队列。生产者可以根据需要向不同的主题写入数据,为了减少累计的网络IO时间,可以把多个消息积累到一个批次中统一发送。消费者可以组成消费者组的概念,消费者组可以订阅主题,kafk...

2020-02-15 00:12:24 118

原创 Zookeeper启动和Leader选举机制

Zookeeper启动流程zookeeper服务器有4个状态:LOOKING:寻找LeaderFOLLOWING:作为FollowerLEADING:作为LeaderOBSERVING:作为Observer集群版zk服务器启动状态:初始化Leader选举,这期间包括给自己投一票注册JMX服务检测当前服务器的状态,初始化一般时LOOKINGLeader选举过程同步状态向...

2020-02-06 11:41:44 434

code reading

Coding Reading 英文原书,主要讲述了高效阅读源代码的方式。磨刀不误砍柴工,很有学习的价值

2018-06-07

BTree数据结构课程设计C++版

BTree数据结构课程设计C++版,完整的过程和C++源代码,包括算法的源代码等。C++代码可以直接运行。

2018-01-15

Effective Modern C++英文原书

Effective Modern C++英文原书,主要讲解了C++11/14的新特性,适合C++进阶阅读。英文资料,可以提高英文水平。Effective系列的经典书籍

2018-01-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除