自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [Erlang]节点互联以及Erlang节点间ping失败原因

epmd(Erlang Port Mapper Daemon)是Erlang的端口映射守护进程,文档:Erlang – epmd当erlang的节点启动时,会将节点名称和地址发送给epmdepmd会记录当前机器下节点的信息,主机间可以通过epmd交换双方主机下的节点信息并进行连接。

2024-01-11 14:13:51 937

原创 Erlang 行为模式gen_fsm状态机 分析

有限状态机这名词听起来好像很高大上,其实本质上是对象(actor)在不同状态下收到信息有不同的行为(处理方式)和状态转换,有点类似设计模式中的状态模式。以一个简单的游戏场景为案例,在rpg游戏地图中常常会出现一些怪物,怪物站在地图里的初始状态是游荡状态,如果玩家出现在他的实现范围内,那么他的状态就会变成追击状态,离开怪物视野后又变为游荡状态,当人物打死怪物就会变成死亡,类似这种其状态会因为触发事件而导致的状态转换就有限状态机。

2024-01-11 11:04:23 524

原创 erlang 安装

-修改CFLAG= -DOPENSSL_THREADS 修改成 CFLAG= -fPIC -DOPENSSL_THREADS。文件末尾添加 export PATH=$PATH:/usr/local/erlang/bin。--创建Erlang安装目录。--配置Erlang环境变量。验证erlang是否安装成功。--也就是添加 -fPIC。ErLang安装依赖。

2024-01-09 19:33:21 455

原创 redis哨兵机制

当有个哨兵标记主节点为「客观下线」后,就会进行选举 Leader 的过程,因为此时哨兵集群还剩下 3 个哨兵,那么还是可以拿到半数以上(5/2+1=3)的票,而且也达到了 quorum 值,满足了选举 Leader 的两个条件, 所以就能选举成功,因此哨兵集群可以完成主从切换。这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis 主节点的客户端,将其配置中的主节点 IP 地址更新为「新主节点」的 IP 地址。

2023-10-20 16:51:39 157

原创 redis 数据结构(二)

整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不时,就会使用整数集这个数据结构作为底层实现。

2023-09-04 18:55:10 1129

原创 redis 数据结构(一)

redis是一种内存数据库,所有的操作都是在内存中进行的,还有一种重要原因是:它的数据结构的设计对数据进行增删查改操作很高效。redis的数据结构是什么redis数据结构是对redis键值对值的数据类型的底层的实现,注意不是。

2023-08-12 11:56:10 634

原创 MySQL中,当update修改数据与原数据相同时会再次执行吗?

在binlog_format=statement和binlog_row_image=FULL时,InnoDB内部认真执行了update语句,即“把这个值修改成 (1,999)“这个操作,该加锁的加锁,该更新的更新。在binlog_format=row和binlog_row_image=FULL时,由于MySQL 需要在 binlog 里面记录所有的字段,所以在读数据的时候就会把所有数据都读出来,那么。

2023-07-22 15:00:00 240

原创 redis 三种缓存更新策略

今天聊聊redis 三种缓存更新策略分别是:Cache Aside(旁路缓存)策略;Read/Write Through(读穿 / 写穿)策略;Write Back(写回)策略;其中 Cache Aside策略是redis和Mysql使用的更新策略,另外两种策略主要使用在计算机系统上。

2023-07-09 19:11:30 1691

原创 缓存雪崩、击穿、穿透

我们都知道,用户数据一般都是存储在数据库中,而数据库的数据是落地于磁盘的,如果我们读取数据库的数据那是很慢的。一旦,用户访问量上来,就很容易引起数据库崩溃。所以,我们一般会加入一层缓存避免直接访问数据库,而redis就是不错的缓存层。因为redis是内存数据库,所以存放redis中的数据跟存放在内存中的数据差不多。这也是我们今天要解决的问题,要知道它们怎么发生的,然后该怎么解决。

2023-04-02 11:42:06 2977

原创 redis 主从复制

在文章中,我们知道如果redis宕机了,我们可以通过AOF 和 RDB 文件的方式恢复数据,从而保证数据的丢失(或少量损失)从而提高稳定性。但是,如果我们数据只存在一台redis服务器中,那么在恢复期间我们无法提供服务的,这不符合服务器的高可靠性。如果更加严重的话,这台服务器的硬盘出现了故障,那么数据是不是全部丢失了吗?这也是无法接受的。那么为了避免这种单点故障,我们有什么办法呢?有同学可以会想到的机制。那就恭喜你了,你想的答案是对的。在redis中也提供来解决这样的问题。

2023-02-14 18:45:00 446 1

原创 redis的持久化RDB与AOF详解

Redis读写速度快、性能优越是因为它将所有数据存在了内存中,然而,当Redis进程退出或重启后,所有数据就会丢失。所以我们希望Redis能保存数据到硬盘中,在Redis服务重启之后,原来的数据能够恢复,这个过程就叫持久化。

2023-02-07 20:26:05 500

原创 缓存(redis)与数据库(MYSQL)数据一致性问题

在文章中,仔细的学习了一些MYSQL数据库的知识。但是,随着我们的业务越来越好,那么我们不可能直接去操作MYSQL数据库。因为直接去操作MYSQL终究会有比较多的I/O操作,而使整个系统的性能最终受到数据库I/O的制约而无法承载。所以,我们一般会给服务器加入缓存,这样客户端的操作可以直接操作缓存,从而减轻数据库的压力。而NOSQL中的redis比较常用的场景就是作为缓存。当我们引入缓存之后,怎么样去更新缓存和数据库的数据呢?

2023-01-12 16:31:00 1452

原创 MYSQL之两阶段提交和组提交(数据一致性)

3. 到了InnoDB中,会先开启事务,并在InnoDB 层更新记录前,首先会在undo log中做相应的记录,即通过生产一条undo log把更新的列的旧值记下来,undo log 会写入 Buffer Pool 中的 Undo 页面,不过在修改该 Undo 页面前需要先记录对应的 redo log,所以。,修改数据页面的过程是修改 Buffer Pool 中数据所在的页,然后将其页设置为脏页,为了减少磁盘I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。

2023-01-03 17:38:20 1566 1

原创 MySQL中Innodb 存储引擎的Buffer Pool详解

Buffer Pool即缓冲池(简称BP),BP以Page页为单位,缓存最热的数据页(data page)与索引页(index page),Page页默认大小16K,BP的底层采用链表数据结构管理Page。InnoDB 会把存储数据划分为若干个页,磁盘与内存交互是以页为基本单位,一页默认为16kB。因此,Buffer Pool 是以页为划分的。在MYSQL 启动时,

2022-12-26 21:52:48 1050

原创 MYSQL 主从复制 --- binlog

在谈主从复制之前,应该都会有一个疑问,那么就是一个MYSQL数据库存在的问题呢?1. 读和写所有压力都由一台数据库承担,压力大2. 数据库服务器磁盘损坏则数据丢失,单点故障为了解决我们可以使用MYSQL的主从复制处理,那么什么是主从复制呢?

2022-12-15 20:00:00 2706

原创 MySQL 的日志(undo log、redo log、binlog)

WAL(Write Ahead Log)预写日志,指的是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。也是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。

2022-12-08 19:00:00 1074

原创 LINUX防火墙开放端口,查看状态,查看开放端口

移除指定端口:firewall-cmd --permanent --remove-port=3306/tcp。查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0。查看所有打开的端口: firewall-cmd --zone=public --list-ports。查看区域信息: firewall-cmd --get-active-zones。查看是否拒绝: firewall-cmd --query-panic。

2022-12-05 20:15:00 12851

原创 MYSQL 事务、事务隔离级别和MVCC,幻读

事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。事务实现的主要两种方式:自动提交和手动提交, mysql默认是自动提交的。这两个方式实现如下:在MYSQL中事务是由引擎来实现的,因此并不是所有引擎都支持事务,如MYSQL的InnoDB 引擎是支持事务的,而 MyISAM 引擎是不支持事务的。事务看起来感觉简单,但必须遵守ACID 特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。这A

2022-12-01 19:15:00 980 2

原创 MYSQL索引数据结构----B+树

我们在考虑数据结构的时候,应该首先要知道数据存放在哪里?而MYSQL的数据是持久化的,所以其数据(数据记录+索引)应该是保存在磁盘里面的。因此当我们要查询某条数据记录时,就会先从磁盘中读取索引到内存中,然后再通过内存索引数据找到该条记录在磁盘的某个位置上,最后将其读到内存中。所以查询过程中会发生多次磁盘I/O,而I/O越多耗时越长。所以,我们索引数据结构应该要尽可能少的磁盘的 I/O 操作就能完成查询工作。另外,MySQL 是支持范围查找的,所以索引的数据结构不仅要能高效地查询某一个记录,而且也要能高效地执

2022-11-24 19:45:00 1420

原创 解决哈希冲突的方案

当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。

2022-11-21 18:00:00 592

原创 MYSQL索引详解和优化

索引的定义 索引分类 数据结构分类 B+tree索引 Hash索引 Full-text索引 物理存储分类 聚簇索引(主键索引)二级索引(辅助索引) 字段特性分类 主键索引 唯一索引 普通索引 前缀索引 字段个数分类 单列索引 联合索引 创建索引的条件 索引优化方法 索引操作 创建索引 查看索引 删除索引

2022-11-17 18:30:00 797

原创 MYSQL查询执行过程

MySQL逻辑架构整体分为三层,分别是客户端层,核心服务层,存储引擎层:客户端层:客户端层是最上层,主要处理连接处理、授权认证、安全等功能,并非MYSQL特有核心服务层:核心服务层主要处理查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)、存储过程、触发器、视图等存储引擎层:负责MySQL中的数据存储和提取。核心服务层通过API与其通信。

2022-11-10 17:30:00 1789

原创 MYSQL的社死----死锁

在MySQL5.7版本中,也可以使用sys.innodb_lock_waits试图查看,但是在MySQL8.0中,该视图连接查询的表不同(把之前版本中使用的information_schema.innodb_locks表和information_schema.innodb_lock_waits)表替换为了performance_schema.data_locks和performance_schema.data_lock_waits)表。当然了,我们最好的策略那就是在自己的业务上预防死锁的出现。

2022-10-31 18:30:00 1404

原创 MYSQL锁的探索

更高版本的mysql,在范围查找,就会继续往后找存在的记录,也就是会找到 id = 16 这一行停下来,然后加 next-key lock (8, 16],但由于 id = 16 不满足 id < 9,所以会退化成间隙锁,加锁范围变为 (8, 16),所以会话 1 这时候主键索引的锁是记录锁 id=8 和间隙锁(8, 16)2.然后因为是非唯一索引,且查询的记录是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是(8,16)update ... set ....;

2022-10-24 17:17:29 1157

原创 MySQL数据库优化总结

索引的优化只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引尽量使用短索引,如果可以,应该制定一个前缀长度对于经常在where子句使用的列,最好设置索引,这样会加快查找速度对于有多个列where或者order by子句的,应该建立复合索引对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引尽量不要在列上进行运算(函数操作和表达式操作)尽量不要使用not in和操作sql语句的优化。

2022-10-18 19:00:00 623

转载 深入理解 Linux 的 TCP 三次握手

在后端相关岗位的入职面试中,三次握手的出场频率非常的高。其实在三次握手的过程中,不仅仅是一个握手包的发送 和 TCP 状态的流转。还包含了端口选择,连接队列创建与处理等很多关键技术点。通过今天一篇文章,我们深度去了解了三次握手过程中内核中的这些内部操作。全文洋洋洒洒上万字字,其实可以用一幅图总结起来。服务器 listen 时,计算了全/半连接队列的长度,还申请了相关内存并初始化。...

2022-10-10 19:15:00 284

转载 为什么服务端程序都需要先 listen 一下

icsk->icsk_accept_queue 定义在 inet_connection_sock 下,是一个 request_sock_queue 类型的对象。是内核用来接收客户端请求的主要数据结构。我们平时说的全连接队列、半连接队列全部都是在这个数据结构里实现的。我们来看具体的代码。*/......}我们再来查找到 request_sock_queue 的定义,如下。//全连接队列//半连接队列......};

2022-10-04 19:30:00 198

转载 TCP连接中客户端的端口号是如何确定的?

在 TCP 连接中,客户端在发起连接请求前会先确定一个客户端端口,然后用这个端口去和服务器端进行握手建立连接。那么在 Linux 上,客户端的端口到底是如何被确定下来的呢?事实上很多我们平时遇到的问题都和这个端口选择过程相关,如果能深度理解这个过程,将有助于我们对这些问题的深刻理解。Cannot assign requested address 报错是怎么回事?一个客户端端口可以同时用在两条 TCP 连接上吗?还是让我们借助一段简单到只有两句的代码,从这个来讲起!

2022-10-02 18:30:00 2548

原创 TCP协议的可靠传输原理

从上面的和中,我们都知道TCP是可靠的传输协议,那么TCP协议是怎么样保证可靠性呢?其实要实现可靠性就是要解决等问题?要解决这些基本问题主要是通过TCP协议的等机制实现。

2022-09-26 19:00:00 1107

原创 深入理解Linux IO复用之epoll

在linux中IO复用有select,poll, epoll,但epoll是性能最好的,支持的并发量也最大。所以我们就专门来聊聊它。

2022-09-20 19:00:00 345

转载 深入理解Linux 网络包发送过程

所以内核的做法就是每次调用网卡发送的时候,实际上传递出去的是 skb 的一个拷贝。对于上小节函数中,当满足真正发送条件的时候,无论调用的是 __tcp_push_pending_frames 还是 tcp_push_one 最终都实际会执行到 tcp_write_xmit。在上面 __igb_open 函数调用 igb_setup_all_tx_resources 分配所有的传输 RingBuffer, 调用 igb_setup_all_rx_resources 创建所有的接收 RingBuffer。...

2022-09-16 18:45:00 1634

转载 深入理解 epoll 的内核实现

回想上面第一节我们在 accept 函数创建 socket 流程里提到的 sock_init_data 函数,在这个函数里已经把 sk_data_ready 设置成 sock_def_readable 函数了。在前面 epoll_ctl 执行的时候,内核为每一个 socket 上都添加了一个等待队列项。当 socket 上数据就绪时候,内核将以 sock_def_readable 这个函数为入口,找到 epoll_ctl 添加 socket 时在其上设置的回调函数 ep_poll_callback。....

2022-09-12 19:00:00 543

转载 Linux网络包接收过程

网络模块是Linux内核中最复杂的模块了,看起来一个简简单单的收包过程就涉及到许多内核组件之间的交互,如网卡驱动、协议栈,内核ksoftirqd线程等。看起来很复杂,本文想通过图示的方式,尽量以容易理解的方式来将内核收包过程讲清楚。现在让我们再串一串整个收包过程。当用户执行完recvfrom调用后,用户进程就通过系统调用进行到内核态工作了。如果接收队列没有数据,进程就进入睡眠状态被操作系统挂起。这块相对比较简单,剩下大部分的戏份都是由Linux内核其它模块来表演了。......

2022-09-08 19:00:00 1197

转载 深入理解高性能网络开发路上的绊脚石 - 同步阻塞网络 IO

​在网络开发模型中,有一种非常易于开发同学使用的方式,那就是同步阻塞的网络 IO。例如我们想请求服务器上的一段数据,那么 C 语言的一段代码 demo 大概是下面这样:但是在高并发的服务器开发中,这种网络 IO 的性能奇差。因为如果用一句话来概括,那就是:同步阻塞网络 IO 是高性能网络开发路上的绊脚石!

2022-09-04 13:33:52 223

原创 深入理解TCP三次握手四次挥手

两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号「四次握手」:三次握手就是最少次数建立可靠连接,所以不需要使用更多的通信次数问题二SYN攻击的基础是依靠TCP建立连接时三次握手的设计。即攻击者短时间伪造不同 IP 地址的SYN报文,向服务端发送该SYN报文,是服务端进入到SYN_RECV状态,但服务端回应的SYN-ACK报文,无法发送到客户端(因为IP是未知的),而得不到ACK报文应答,慢慢的服务端的半连接队列就会给占满了,使其无法正常提供服务。查看SYN攻击。.....

2022-08-26 20:00:00 940 1

原创 OSI七层模型及TCP/IP四层模型详细分析

在计算机网络中有OSI七层模型及TCP/IP四层模型的说法,而且也是计算机很重要的知识。下面我们就来分析一下它们:OSI七层模型及TCP/IP四层模型的对比: 从上面两张图我们知道,每层之间是相互独立的,而且完全解耦,具有很大的灵活性。下面我们就详细的分析每层的作用。为操作系统或网络应用程序提供访问网络通信服务的,它以报文的形式进行数据传输。那么它主要包含的协议有哪些呢?域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务,它通常运行在UDP之上,默认端口53。它主要解决I

2022-08-19 18:00:00 979

转载 数据链路层详解

数据链路层: 网络层是进行地址管理和路由选择的,它是为数据报的转发找出一条路来,而数据链路层解决的是两个结点直接的数据交换,数接近于物理层的概念。

2022-08-17 21:30:00 2850

原创 TCP与UDP的区别

在计算机中有一个很重要的知识,即计算机网络,那计算机网络有哪些知识点呢?下面给出一个计算机网络神图如下:从图中我们看以看出,OSI的层级结构有七层:应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。但是如果从TCP/IP来看,它就是四层分别是:应用层,传输层,网络层,网络接口层,如下:那么TCP/IP四层模型与OSI体系结构的关系是怎么样的呢?如下:从网络层级关系中我们看到在TCP/IP四层模型的传输层中有两个很重要的协议就是TCP 和 UDP。......

2022-08-12 18:45:00 259

原创 python的进程、线程和协程

​我们在进程、线程和协程(基础篇) 和进程、线程和协程 中学习到了很多进程、线程和协程的知识,而且他们是高并发,高可用的基础。那么今天我们就学习学习在具体一门语言中的应用---python相对于所有语言来说的,Python的特殊之处在于Python有一把GIL锁,这把锁限制了同一时间内一个进程只能有一个线程能使用cpu线程threading模块在python中比较底层的模块是_thread模块,而threading模块就是对_thread模块进行了封装,使之使用起来更加方便,我也推荐使用......

2022-08-05 19:00:00 519

转载 linux进程间通信(IPC) -- 管道(pipe)源码分析

所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(即读进程),可从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故又称管道通信。为了协调双方的通信,管道通信机制必须提供以下3方面的协调能力。互斥。当一个进程正在对pipe进行读/写操作时,另一个进程必须等待。同步。httpshttpshttpshttpshttps。...

2022-07-29 17:39:55 1682

MyInjectCode

代码注入

2013-06-01

数据结构与算法分析

这是一本很好的资料,对数据结构和算法说的比较仔细。

2011-09-16

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

TA关注的人

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