自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 redis hash的实现

1 HASH表的理论hash表通过hash函数可以快速的查找到所需要的数据,具有o(1)的时间复杂度,常用的hash函数有1 直接定址法:取关键字或关键字的某个线性函数值为散列地址。即{\displaystyle hash(k)=k}hash(k)=k或{\displaystyle hash(k)=a\cdot k+b}hash(k)=a\cdot k+b,其中{\displaystyle a,b}a,b为常数(这种散列函数叫做自身函数)2 数字分析法:假设关键字是以r为基的数,并且哈希表中可能出现的

2022-05-12 09:00:37 464

原创 redis字符串实现

redis高效的字符串设计

2022-05-10 08:35:54 318

原创 udp小实验

//client.h#include <string.h>#include <cstdlib>#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <arpa/inet.h>#include <signal.h>#include <error.h>#include <errno.h&g

2021-04-02 12:14:58 167

原创 验证网络send只到缓冲区的小实验

都说阻塞式的send只是发送到了缓冲区,但是不是真正的发送到了网络,做了个小实验,直接上代码//server.c 启动监听服务器#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <errno.h>#include <string.h>#include "read.h"void read

2021-04-01 13:08:40 108

原创 LINUX fork写时复制

先分配1G的内存空间,然后fork,睡眠5秒后父进程修改内存的数据,统计一下时间。#include <iostream>#include <unistd.h>#include <chrono>#include <iomanip>//父进程工作函数void parentProcessRun(void* data) { while (true) { sleep(5); auto start = std::chr

2021-03-03 19:57:34 91 2

原创 redis数据统计

Redis的集合类型的特点是一个键对应一系列值,非常适合用来存取统计的数据,比如:每天的新增用户数和第二天的留存用户数;统计评论列表的最新评论;一个月内连续打卡的用户数;UV量;先了解一下常用的集合统计模式:聚合统计,排序统计,二值状态统计,基数统计聚合统计聚合统计是指统计多个集合元素的聚合结果。包括:交集统计,差集统计,并集统计。Set类型非常适合用来做聚合统计。SINTER key [key ...] #返回指定所有的集合的成员的交集.时间复杂度O(N*M)SUNION key [

2021-02-02 20:29:57 3432

原创 redis源码学习---压缩列表

主要学习一下压缩列表的实现,压缩列表的结构: <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>其中entry的数据结构是:typedef struct zlentry { unsigned int prevrawlensize; //用多少位表示前面的entry长度 unsigned int prevrawlen; /

2021-02-02 19:14:36 77

原创 redis源码探讨--主从一致

Redis的高可靠性包含两方面:1 数据尽量少丢失:使用AOF或者RDB保障2 服务尽量少中断: 增加副本冗余Redis提供了主从模式来保障服务尽量少中断多个副本之间需要数据的一致性,Redis的主从采用读写分离的模式读操作:主库,从库都可以接收写操作:首先到主库执行,然后主库将数据操作同步给从库在serverCron中,每隔1秒会执行replicationCron这是主从复制的核心函数void replicationCron(void) { static long long re

2021-02-01 12:37:11 90

原创 redis源码分析--set命令

单值的情况下可以使用set命令。set key valueset命令在源码会直接调用setCommand//set命令 set key valuevoid setCommand(client *c) { .... //值的编码 c->argv[2] = tryObjectEncoding(c->argv[2]); setGenericCommand(c,flags,c->argv[1],c->argv[2],expire,unit,NULL,

2021-01-25 11:12:48 259

原创 redis 源码探讨--AOF实现

redis是内存型的数据库,当机器宕机以后,数据就会丢失。redis为了数据的持久化,提供了两种机制,AOF和RDB。下一篇分析RDB。打开AOF需要在配置文件里面打开appendonly yes会在配置文件的目录里面生成appendonly.aof文件AOF是以明文记录操作的,比如收到"set testkey testvalue",记录的明文是*3$3set$7testkey$9testvalue其中 *3 表示当前命令有三个部分,每个部分由“$+数字”开头,后面跟着的是具体

2021-01-06 14:40:14 142

原创 redis 源码探讨---网络处理流程

//server.cint main(int argc, char **argv) {//启动函数解析参数.....initServer();..... redisSetCpuAffinity(server.server_cpulist);//进入主循环aeMain(server.el);} //初始化服务器配置信息,创建新连接处理事件void initServer(void) { //初始化服务器配置 server.el = aeCreateEventLo

2021-01-04 19:09:26 164

原创 BASE理论总结

BASE 理论是 CAP 理论中的 AP 的延伸,是对互联网大规模分布式系统的实践总结,强调可用性。BASE理论的核心是基本可用和最终一致性。为什么不使用强一致性的分布式系统?由CAP理论可用知道强一致性必然会影响可用性。集群的可用性是每台机器的可用性的乘积:比如,假设 3 个节点的集群,每个节点的可用性为 99.9%,那么整个集群的可用性为 99.7%,也就是说,每个月约宕机 129.6 分钟。实现基本可用:1 流量削峰2 体验降级3 过载保护4 延迟响应最终一致性系统中所有的数据副本

2020-11-03 19:24:32 344

原创 分布式算法学习笔记---ACID

单机上实现ACID可以通过锁,时间序列等机制实现。分布式系统由于需要协调多个节点,单机的实现方案就不能保证多个节点之间的ACID特性。此时就需要分布式事务协议。比如二阶段提交,TCC。二阶段提交协议1 选举协调者2 客户端发消息给协调者3 协调者发消息给其他事务的参与者,进入提交请求阶段(投票阶段)4...

2020-08-12 23:48:00 235

原创 Mysql学习笔记--删除数据

首先 innodb_file_per_table 要设置为ONinnodb_file_per_table:1 这个参数设置为 OFF 表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起;2 这个参数设置为 ON 表示的是,每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中。如果设置为OFF,则drop table也是不会回收空间的。删除流程MYSQL的删除并不是真正的把数据删除,只是标志为删除。比如删除ID为300的行,则是把这个记录标记为删除。后续插入的时候是会复用

2020-08-12 13:55:38 237

原创 分布式算法学习---CAP理论

CAP理论也叫做CAP不可能三角,就是三种特性不可能同时满足。CAP分别指的是:C:一致性。就是当有客户端修改了数据以后,要同步到集群所有的机器,才会返回成功,这时,无论客户端往哪台机器去读取数据都是最新的数据。如果发生了网络问题,A:可用性。当客户端修改了数据,只要在一台机器修改成功了,就立即返回了,不保证其他机器上的数据都是最新的。当集群间的机器发生网络问题的时候,客户端去读取数据就会发生读取到的数据不是最新的,但...

2020-08-10 23:27:48 1749

原创 MYSQL学习笔记---抖动一下

有时在正常情况下,工作的很好的SQL语句,突然就变慢了一下。MYSQL发生了抖动,这是什么原因?首先从MYSQL的wal机制说起。INNODB在处理更新语句的时候,只是写了一次redo log就返回了。那么就会产生“胀页”。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。产生了胀页,就要找时间进行flush,把内存的数据刷入到磁盘里面,保持数据的一致。以赊账的例子来看:那么发生MYSQL抖动一下的情

2020-08-10 19:42:40 102

原创 MYSQL学习笔记---字符窜加索引

比如邮箱登陆的系统,有一张表:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64), ... )engine=innodb; 有一条SQL语句:mysql> select f1, f2 from SUser where email='xxx';不在email加索引的话,就会进行全盘扫描,效率比较低。MySQL 是支持前缀索引的,有两种加索引的方式:mysql> alter

2020-08-06 13:52:25 138

原创 分布式算法学习---拜占庭将军问题

拜占庭将军问题很好的抽象了分布式系统面临的共识问题。以六国与秦国作战作为类比,先做以下的假设:忠诚的将军,你可以理解为正常运行的计算机节点;叛变的将军,你可以理解为出现故障并会发送误导信息的计算机节点;信使被杀,可以理解为通讯故障、信息丢失;信使被间谍替换,可以理解为通讯被中间人攻击,攻击者在恶意伪造信息和劫持通讯。以三个国家攻打秦国为例,假设秦国很强大,需要半数以上的国家同时进攻才能打败秦国。统帅为苏秦。那么苏秦面临着怎么统一作战的问题。二忠一叛的难题按照少数服从多数的原则,只要大多数的

2020-08-06 00:02:23 671

原创 MYSQL学习笔记---选择索引

在不同的场景下,是选择普通索引还是唯一索引呢?假设有一个市民系统,业务层面已经保证了身份证号是唯一的,有下面的查询:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';这个SQL语句肯定要考虑建索引。由于身份证号字段比较大,所以考虑是普通索引或者唯一索引。从业务上已经保证身份证不会重复,所以从业务上来说都是正确的。从查询和更新的性能来说呢?查询过程比如有下面的语句:select id from T where k=5这

2020-08-05 00:37:00 141

原创 MYSQL学习笔记---值到底是多少

建表和插入语句如下:mysql> CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t(id, k) values(1,1),(2,2);启动的事务:A,B,C查到的值是?首先,两种启动事务的方式:1 begin/start transaction,没有直接启动事务,而是要到执行第一条快照读语句的

2020-08-04 20:18:37 135

原创 MYSQL学习笔记--行锁

MYISAM不支持行锁,INNODB支持行锁。从并法度来说INNODB要比MYISAM要大。这也是INNODB替代MYISAM的重要原因之一。从两阶段锁说起下面的情况会发生什么?事务 B 的 update 语句会被阻塞,直到事务 A 执行 commit 之后,事务 B 才能继续执行。那么就有一个结论:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。从这个可以得出:如果你的事务中需要锁多个行,要把最可能造成锁冲突、

2020-08-03 20:12:48 158

原创 MSQL学习笔记--锁

根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是把整个数据库的实例加锁。命令是 Flush tables with read lock (FTWRL)。数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句都会被阻塞。主要的作用就是做全库逻辑备份,也就是把整库每个表都 select 出来存成文本。会出现很危险的问题:1 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;2 如果你在从库上备份,那么

2020-08-03 19:43:08 164

原创 MYSQL学习笔记--索引

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。比如你突然想复习哪个知识点,翻一番目录就大概知道在哪个章节,然后翻倒那一个章节就很快就找到了你要的内容。常见的数据库索引模型三种简单也比较常见的模型:哈希表哈希表是key-value的存储数据的结构。通过哈希函数把key计算一个确定的位置,然后把key对应的value放在数组对应的位置里面。这种做法可能会产生冲突,解决方法就是在每个值的后面跟一个链表。哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL

2020-07-31 13:53:43 78

原创 MYSQL学习笔记--事务隔离

事务的属性包括ACID。Atomicity:原子性。一个事务的全部操作要么全部成功,要么全部失败回滚。比如转帐,从A扣100,B增加100,这两个操作要么全部成功,如果有一个失败就要回滚,不然就会出现A扣了100,B却没有加上100的情况。Consistency: 一致性。 即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。还是拿转账为例A 有 500 元,B 有 300 元,如果在一个事务里 A 成功转给 B50 元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后 A 账户一

2020-07-30 14:04:45 130

原创 MYSQL学习笔记--SQL更新语句的执行

MYSQL更新语句是这样子的:mysql> update T set c=c+1 where ID=2;更新语句跟查询语句走的流程是一样的:跟查询一样,连接器----》查询缓存—》分析器----》优化器—》执行器。与查询不同的地方,多了两个日志模块redolog和binlog.redo log由于每次操作如果每次对数据库的操作都写入磁盘进行持久化的,整个操作的IO成本,查找成本都很高。所以MYSQL设计者就用了WAL技术(Write-Ahead Logging).原理就是先写日志,在不

2020-07-29 20:02:18 135

原创 MYSQL学习笔记--SQL查询语句的执行

当我门在MYSQL执行:mysql> select * from T where ID=10;这条SQL语句从T表查询了ID=10的结果,但是具体MYSQL做了什么操作呢?首先是基础架构示意图:分为两个部分:1 SERVER层:包括MYSQL大多数核心服务功能,内置函数,跨存储引擎的功能,连接器、查询缓存、分析器、优化器、执行器等。2 存储引擎层:负责数据的存储和提取,插件式,默认INNODB整个SQL语句的执行流程:1 连接器...

2020-07-29 12:44:25 80

原创 LINUX调优---tcpdump,wireshark

tcpdump基本格式:时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息WiresharkWireshark 也是最流行的一个网络分析工具,它最大的好处就是提供了跨平台的图形界面。跟 tcpdump 类似,Wireshark 也提供了强大的过滤规则表达式,同时,还内置了一系列的汇总分析工具。...

2020-07-21 19:46:55 99

原创 LINUX性能调优--DNS

域名:网站的名字。全球唯一,需要通过专门的域名注册商才能注册。格式是以点分割开的字符串,名字越靠后,则层级越高。比如https://520github.com.cn/,其中cn是顶级域名,520github是三级域名。DNS是什么?比如我们要访问一个网站,最终是必须要使用IP地址,才能找到正确的服务器。但是呢,IP地址对于人类来说,真的不容易记住。为了更加方便记住自己想登陆的网站,就提出了一个从人类比较容易记住的名字(域名)出发可以转换到真实IP地址的协议—DNS。DNS工作原理:应用层协议,大部

2020-07-21 19:39:12 253

原创 C指针封装到C++的unique_ptr

有时会用到C语言的库,C语言返回了裸指针,但是现代C++推荐不要用裸指针,所以封装了一个从C语言裸指针到unique_ptr的转换模板函数://// Created by jaime on 2020/7/17.//封装了C语言到C++的智能指针转换//#ifndef ROBOT_MEM_H#define ROBOT_MEM_H#include <memory>#include <functional>using namespace std;//lua头文件

2020-07-21 15:14:13 252

原创 LINUX性能调优--评估系统的网络性能

网络基准测试基准测试之前,要清楚自己的应用程序处于网络的哪一层,比如:1 基于 HTTP 或者 HTTPS 的 Web 应用程序,显然属于应用层,需要我们测试 HTTP/HTTPS 的性能;2 大多数游戏服务器来说,为了支持更大的同时在线人数,通常会基于 TCP 或 UDP ,与客户端进行交互,这时就需要我们测试 TCP/UDP 的性能;3 还有一些场景,是把 Linux 作为一个软交换机或者路由器来用的。这种情况下,你更关注网络包的处理能力(即 PPS),重点关注网络层的转发性能。各协议层的性能

2020-07-17 13:55:19 249

原创 LINUX性能调优---C10K,C1000K

C10K1999年由Dan Kegel ,那时的服务器运行着LINUX2.2系统,32位系统,内存很少(2G),千兆网卡。怎么在这样的系统中支持并发 1 万的请求呢?先来计算一下:最大每个连接的内存:2GB / 10000 = 200kb最大每个连接的带宽: 1000Mbit/10000 = 100bit所以只要每个连接的内存不大于200KB,带宽不大于100bit,物理资源三足够的。剩下的就是软件问题:在 C10K 以前,Linux 中网络处理都用同步阻塞的方式,也就是每个请求都分配一个进

2020-07-16 13:54:27 505

原创 linux性能调优--网络概念

网络是很复杂的子系统。而且跟进程调度、中断处理、内存管理以及 I/O 等都密不可分。本质上网络是一种把不同计算机或网络设备连接到一起的技术,它是一种进程间通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行。模型OSI 网络模型(开放式系统互联通信参考模型)应用层,负责为应用程序提供统一的接口。表示层,负责把数据转换成兼容接收系统的格式。会话层,负责维护计算机之间的通信连接。传输层,负责为数据加上传输表头,形成数据包。网络层,负责数据的路由和转发。数据链路层,负责 MAC 寻址、错误

2020-07-15 13:33:13 173

原创 LINUX性能调优--IO总结

文件系统 I/O 性能指标1 存储空间的使用情况,包括容量、使用量以及剩余空间。但这并不是真实的用量,文件系统的元数据也会占用磁盘空间。如果使用了RAID10,看到的磁盘容量最多是真实磁盘容量的一半。2 除此之外,容易忽略的是索引节点的使用情况,它也包括容量、使用量以及剩余量等三个指标。如果文件系统中存储过多的小文件,就可能碰到索引节点容量已满的问题。3 缓存使用情况也要注意,包括页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如 ext4、XFS 等)的缓存。4 文件IO也是重要的指标,包括

2020-07-14 20:30:56 3046 1

原创 LINUX 性能调优--IO案例

操作系统 Ubuntu 18.04机器配置:2 CPU,4GB 内存

2020-07-09 00:45:02 243

原创 Linux性能调优--磁盘IO

磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。第一类,机械磁盘,也称为硬盘驱动器(Hard Disk Driver),通常缩写为 HDD。机械磁盘主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中。在读写数据前,需要移动读写磁头,定位到数据所在的磁道,然后才能访问数据。显然,如果 I/O 请求刚好连续,那就不需要磁道寻址,自然可以获得最佳性能。这其实就是我们熟悉的,连续 I/O 的工作原理。与之相对应的,当然就是随机 I/O,它需要不停地移动磁头,来定位数据

2020-07-08 23:32:10 756

原创 LINUX性能优化--IO工作原理

同 CPU、内存一样,磁盘和文件系统的管理,也是操作系统最核心的功能。有以下两个基本功能:1 磁盘为系统提供了最基本的持久化存储。2 文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。索引节点和目录项...

2020-07-08 23:31:38 222

原创 Linux性能调优--内存套路篇

总结一些解决内存问题,优化内存的一些思路1 内存性能指标系统内存使用情况已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存。共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存。可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存。缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存。缓冲区是对原始磁盘块的临时存储,用

2020-07-07 13:48:01 283

原创 Linux性能调优--Swap变高

上一篇总结了内存泄漏。那么当发生了内存泄漏时,或者运行了大内存的应用程序,导致系统的内存资源紧张时,系统会如何应对呢?会导致两种可能结果,内存回收和 OOM 杀死进程OOM指的是系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程。内存回收指的是系统释放掉可以回收的内存,比如我前面讲过的缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。没有被修改过的直接回收,以后从硬盘直接读取就可以了。而那些被应用程序修改过的脏页必须要刷回硬盘,

2020-07-06 12:42:34 429

原创 LINUX性能调优---内存(内存泄漏)

当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访问时,才通过缺页异常陷入内核中分配内存。为了协调 CPU 与磁盘间的性能差异,Linux 还会使用 Cache 和 Buffer ,分别把文件和磁盘读写的数据缓存到内存中。对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”,比如,没正确回收分配后的内存,导致了泄漏。访问的是已分配内存边界外的地址,导致程序异常退出,等等。特别是对于C语言这种

2020-07-02 19:35:09 425

原创 strace跟踪go读取文件函数

strace 是跟踪系统调用的工具,通过跟踪代码发现go语言的read函数是通过汇编函数实现的,所以用strace没有发现有系统调用。。。。

2020-07-02 13:05:51 621 1

测试用的代码

测试代码

2016-09-06

华为的面试题

关于华为的面试题,希望能帮助到需要的人!!!

2013-08-11

QT编程经典资料

QT编程的金典之作,供大家学习之用!!!

2013-08-07

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

TA关注的人

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