- 博客(31)
- 收藏
- 关注
转载 redis总结(一)
签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位,根本不用太复杂的集合类型。所以,解锁的时候,我们要先判断锁的 unique_value 是否为加锁客户端,是的话,才将 lock_key 键删除。压缩列表的最大特点,就是它被设计成一种内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,这种方法可以有效地节省内存开销。
2024-09-12 22:51:43 127
转载 MySQL总结(三)
而普通的 select 是不会加行级锁的,普通的 select 语句是利用 MVCC 实现一致性读,是无锁的。那么有了意向锁,由于在对记录加独占锁前,先会加上表级别的意向独占锁,那么在加独占表锁时,直接查该表是否有意向独占锁,如果有就意味着表里已经有记录被加了独占锁,这样就不用去遍历表里的记录。那么在线程 C 阻塞后,后续有对该表的 select 语句,就都会被阻塞,如果此时有大量该表的 select 语句的请求到来,就会有大量的线程被阻塞住,这时数据库的线程很快就会爆满了。
2024-09-11 15:06:42 335
转载 MySQL总结(二)
这时候,事务 B 插入的记录,就会被事务 A 的第二条查询语句查询到(因为是当前读),这样就会出现前后两次查询的结果集合不一样,这就出现了幻读。假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取小林的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。读提交怎么实现的呢?串行化,就互斥锁,每次事务开启的时候,如果有其他事务开启,就不能开启。
2024-09-10 21:53:25 72
转载 MySQL总结(一)
NULL 值列表的空间不是固定 1 字节的。当一条记录有 9 个字段值都是 NULL,那么就会创建 2 字节空间的NULL 值列表,以此类推。
2024-09-10 16:18:51 142
原创 raft算法
raft协议中包含三个角色 :跟随者(follower)、领导者(leader)和候选者(candidate)。有三种消息:投票请求、心跳数据和日志复制,说到底,raft三种角色就是一台机器的三个状态,通过消息传递状态发生改变,从而维护数据的一致性以及对外服务的可用性。
2024-09-08 23:57:45 898
转载 分布式系统的一致性与共识算法
参考文献(文章内容几乎全部来自下面的参考文献,强烈建议看看原文)分布式系统的一致性与共识算法-基础理论分布式系统的一致性与共识算法-Paxos 定义:一致性为在分布式系统领域中对于多个服务节点,给定一系列操作,在约定协议的保障下,使得它们对处理结果达成某种程度的协同。 分布式系统中的节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会响应慢、被杀死或者重启
2024-09-08 20:06:11 71
原创 C++ 定时器
其实定时器结构到不是很难的结构,主要是想在设计的每一步都考虑如何应对并发的情况,毕竟,即使像产生唯一ID这种如果在并发压力下依然要小心设计。不过,定时器可以为分布式系统服务吗?每台电脑时间不一致,可能还会自动校准时间,不知道怎么应对.......
2024-09-08 16:44:35 815
原创 C++ 容器迭代器失效
迭代器失效很常见,无非是在迭代的上不要随意插入删除数据,然而,实际上迭代器失效反映的是一种现象,就是不要随意用容器的指针。这样使用有时候很常见,但是这是非常危险的行为。如果往v中加入元素,ptr就可能失效,产生段错误。这样的东西作为对象的指针随意传给别人,使用的时候需要考虑容器扩容带来的问题。花了将近一天在多线程中遇到这种迭代器失效的问题。实际上,当用容器管理对象的时候。
2024-09-02 23:07:45 221
原创 函数模板推导
而pa推导的类型是A*,func2参数a自身的类型是A*&,也就是对A*的引用。也就是原本的a和a的引用在模板函数中都被推倒成类型A,而ra的a的类型都是A。而对于pa,其推到的类型是A*,pa的类型也是A*。也就是说本身*pa表达式得到的是A&,在main中不是类,而是引用,用过函数func4传递到a上,形参a的语义就是A了。如果func1存在,而func2和func3不存在,执行expr1,expr2,expr3,最终输出是。a和ra都无法找到匹配的,而pa推倒的T是A,而func3本是是A*类型。
2024-08-25 20:50:04 214
原创 一个简单的C++ rpc代码
在客户端和服务端都使用了zeromq,但是这其实值提供了tcp连接和发送接收消息的功能,没用到什么深奥的方法,其实也可以手错一个简单的tcp客户服务器。客户端的代码,主要是连接服务端,然后调用方法,获取调用方法的返回值。client方法很简单。重点在服务端,服务端如何解码客户端的消息,服务端如何调用合适函数,如何将结果返回个客户端。,非常简单的rpc代码,总共就两个cpp文件,代码量只有3,4百行。接下来才是这个简单的rpc的定义和方法,对源码做了点修改,读起来更加方便一些。
2024-08-18 00:33:26 220
原创 pthread库和stl库
return:若线程创建成功,则返回0。若线程创建失败,则返回出错编号。返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。
2024-08-16 11:21:59 566
原创 leveldb源码分析(一)
leveldb的KV存储系统涉及skip list、内存KV table、LRU cache管理、table文件存储、operation log系统等。Leveldb的基本框架,几大关键组件,如图所示。leveldb是一种基于operation log的文件系统,是Log-Structured-Merge Tree的典型实现。LSM源自Ousterhout和Rosenblum在1991年发表的经典论文<<>>。由于采用了op log。
2024-07-29 17:09:15 872
原创 Linux中的时间函数
最后放上还是上面那个博客测试的上面的时间函数的性能(没办法,这个人太厉害了.....)return 0;fclose(fp);long loop;return 0;time函数最快,但是精度太低gettimeofday和clock_gettime虽然精度高,但是都比较慢rdtsc精度和速度都十分优秀另外需要注意一点的是,上述测试结果跟机器配置有很大关系。
2024-07-22 23:24:25 1060
原创 std的时间函数——chrono
/ 微微微// 飞秒// 皮秒// 纳秒// 微秒// 毫秒// centi:百分之一// deci:十分之一// deci:十倍// hecto:百倍// 千// 兆// 吉// 太// 拍// 百亿亿上述输出结果,在我的电脑上 system_clock和high_resolution_clock是相同的,都是从1970年1月1日0时0分0秒开始的,以纳秒为单位的结果。而steady_clock则是从上次开机到现在递增增加的时间结果(这里我的电脑是这样的,
2024-07-22 17:30:15 726
原创 dlsym在c++中的坑
对于运行期间undefined symbol错误,说明运行过程中没有找到符号,可能有可执行文件中rpath中根本没有需要链接的动态库,可以通过ldd查看可执行文件需要链接哪些动态库;通过LD_DEBUG=libs ./文件查看rpath以及在搜索库的时候为什么没有从路径中找到,通过-Wl,-rpath或者export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:解决;由于C和C++对于符号命名规则的不同,导致链接不到符号,通过nm命令查看共享库中的符号表对比可重定位文件的符号。
2024-06-06 11:36:57 472
原创 Poll原理
首先,在do_sys_poll函数中,会开辟内存用于存放pollfd,如左下角PAGE所示,所有的pollfd集合构成一个单向链表,一个PAGE包括一个链表头和一个连续存储的pollfd实体,PAGE之间通过链表指针相连,PAGE内通过连续的存储索引。然后,初始化poll_wqueue队列,在do_poll函数中遍历pollfd链表,通过pollfd中的文件描述符获得文件,调用文件系统的poll函数。
2024-05-30 10:55:52 1018
原创 select原理
select和poll几乎差不多,select底层也是通过文件系统的poll方法构建等待实体。首先调用core_sys_select,select会有三个文件集合,包括读集合、写集合和异常集合,select会先构建一个6集合的bitmap结构体,包括输入的三个集合和需要输出的三个集合。这个bitmap并没有限制在1024大小,struct结构体只是6个long long指针指向bitmap,而bitmap大小则是根据输入的文件数量开辟的bitmap。
2024-05-30 10:55:41 636
原创 select 1024限制
文章主要来自,原作者通过源码和实验解释select真的是受1024限制吗,但是原作者的代码似乎有些问题(好像跑不通,但是思想表达的很明晰),这篇文章主要是对那篇文章的一个简单的解释,以及遇到的奇怪问题的记录。
2024-05-28 22:20:20 1071
原创 CMake示例——muduo库的CMake、libco的CMake和marl的CMake
前面把CMake基本一些变量和语言简单的学了一下,但是,肯定很表面,学习语言嘛,就是学习语法,看别人的代码,最后自己写代码。所以,第二步,就是看别人的CMake怎么写的。选这几个库是因为后面想学习学习这几个库的源码,这三个库没什么逻辑关系,一个网络库,两个协程库。
2024-05-25 23:16:02 834
原创 CMake学习
camke是用来配置并产生makefile文件的(可与以提前看一下makefile语法,不过;makefile语法挺复杂的,而且不同的平台是有差异的),但是cmake语法相对简单,并且与平台无关。这些变量是CMake系统预定义的,不用set可以直接使用PROJECT_SOURCE_DIR 工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录PROJECT_BINARY_DIR 工程 BINARY_DIR, 也就是顶层 CMakeLists.txt 源码的 BINARY_DIR。
2024-05-24 23:30:24 911
原创 关于namespace中的奇怪错误
对于main.cpp,编译得到的.o文件符号表如下(通过nm .o文件就能查看重定位文件的符号表)符号的名命包括namespace t2,符号的名称可以和main.o的符号表对应因此能链接成功。也就是展开namespace t1,编译的得到的符号表并不包含namespace。对于编译失败的情况,a.cpp文件得到的a.o文件符号表是。而编译成功的情况符号表如下。
2024-05-17 23:23:12 206
原创 HEAD FIRST设计模式(二)———观察者模式
观察者模式似乎没有什么好说的,毕竟,我也没有工程经验,学习cpp的小白,所以,也说不出啥,倒是有对比观察者模式和发布-订阅模式对比,这个观察者模式 vs 发布订阅模式下面的评论讲的也挺好的,毕竟没实际使用过解决问题,确实只知道基本的东西,不过,最近开始看《linux多线程服务端编程:使用muduo C++网络库》,这本书是陈硕大佬写的,第一章在写多线程对象的生命期管理的时候用的示例恰好也是观察者的一个框架,这里挖个坑,有时间写个那本书的读书笔记。
2024-04-26 21:43:51 1106 1
原创 HEAD FIRST设计模式(一)————设计模式入门
最近开始看设计模式,找个一本入门的书,就是这本《HEAD FIRST设计模式》,这本书中的示例是用java写的,本以为没有任何java基础会看着相当费劲,但是这本书只用了很简单的java语言就将明白了,小白也能理解书中的代码。
2024-04-25 16:19:15 919 3
原创 “迷人”的多态
上述三个例子已经跑完了,那么关于多态为什么只能用指针实现?在c++中,指针存储一个对象的地址,同时指针还有指向的类型,但是如果我们从cpu执行的汇编指令来看,汇编中可以操作比特、一个字、两个字、四个字、甚至八个字,但是一个对象可能占用十几甚至更多的内存,cpu处理的时候依然是一个字节或者等等处理,指针的类型是编译器在将高级语言翻译成机器语言的时候判断要读取4字节还是8字节,类型是对编译器而言的。上面那个例子。
2024-04-23 21:52:09 986
原创 C++的public、protected、private和友元
结果如下: 如果把数据换成data3,data4,data5,data6会报错,所以在类外只能够访问public成员。对于类的成员函数 类外可以访问public成员函数,所以在类外只能够访问public成员。那么成员函数访问有权限吗?没有,成员函数可以访问类的任意数据。那么静态成员函数呢? 虽然static不属于任何一个类,但是对于protected和
2024-04-21 17:26:17 593
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人