
基础服务器框架
文章平均质量分 90
基础服务器框架
Yi Ian
这个作者很懒,什么都没留下…
展开
-
JavaScript 网页设计实例详解
JavaScript 在网页设计中扮演着不可或缺的核心角色。通过一系列丰富的实例,我们看到它在基础交互效果、表单验证、数据获取与展示、动画效果以及页面布局调整等诸多方面展现出的强大能力。合理运用 JavaScript,能够将静态的网页转化为充满活力、交互性强、信息实时更新且适配多元终端的优质用户界面。无论是打造引人入胜的导航体验、确保数据的准确。原创 2025-01-11 09:22:23 · 655 阅读 · 0 评论 -
Vue.js组件开发详解
在现代前端开发中,Vue.js 凭借其简洁、高效、灵活的特性,成为了众多开发者的首选框架之一,而组件化开发则是 Vue.js 的核心优势。组件可以将复杂的 UI 界面拆分成一个个独立的、可复用的小块,极大地提高了开发效率和代码的可维护性。原创 2025-01-11 09:07:49 · 748 阅读 · 0 评论 -
Redis 的大 Key 对持久化有什么影响
当 AOF 写回策略配置了 Always 策略,如果写入是一个大 Key,主线程在执行 fsync() 函数的时候,阻塞的时间会比较久,因为当写入的数据量很大的时候,数据同步到硬盘这个过程是很耗时的。AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过fork()函数创建一个子进程来处理任务。会有两个阶段会导致阻塞父进程(主线程):创建子进程的途中,由于要复制父进程的页表等数据结构,阻塞的时间跟页表的大小有关,页表越大,阻塞的时间也越长;原创 2025-01-11 08:49:35 · 935 阅读 · 0 评论 -
Redis 大 key 的四个问题
大 key 并不是指 key 的值很大,而是 key 对应的 value 很大。一般而言,下面这两种情况被称为大 key:String 类型的值大于 10 KB;Hash、List、Set、ZSet 类型的元素的个数超过 5000个;原创 2025-01-08 12:18:22 · 890 阅读 · 0 评论 -
Redis 实现分布式锁
今天跟大家聊聊两个问题:如何用 Redis 实现分布式锁?Redis 是如何解决集群情况下分布式锁的可靠性问题的?原创 2025-01-05 13:06:29 · 1150 阅读 · 0 评论 -
100万并发用户的分布式频道聊天系统
以上步骤为实现一个高并发、低延迟、可扩展的分布式频道聊天系统提供了完整的设计与实现流程,包括 WebSocket 服务器的实现、频道隔离、消息队列、Redis 管理、负载均衡和容器化部署。原创 2025-01-05 12:55:56 · 1043 阅读 · 0 评论 -
redis 3 种缓存更新策略
今天跟大家聊聊,常见的 3 种缓存更新策略。Cache Aside(旁路缓存)策略;Read/Write Through(读穿 / 写穿)策略;Write Back(写回)策略;实际开发中,Redis 和 MySQL 的更新策略用的是 Cache Aside,另外两种策略主要应用在计算机系统里。原创 2024-11-21 14:26:58 · 1145 阅读 · 0 评论 -
Redis 的「内存淘汰策略」和「过期删除策略」
Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key。原创 2024-11-21 14:21:54 · 742 阅读 · 0 评论 -
Erlang 行为模式gen_fsm状态机 分析
有限状态机这名词听起来好像很高大上,其实本质上是对象(actor)在不同状态下收到信息有不同的行为(处理方式)和状态转换,有点类似设计模式中的状态模式。以一个简单的游戏场景为案例,在rpg游戏地图中常常会出现一些怪物,怪物站在地图里的初始状态是游荡状态,如果玩家出现在他的实现范围内,那么他的状态就会变成追击状态,离开怪物视野后又变为游荡状态,当人物打死怪物就会变成死亡,类似这种其状态会因为触发事件而导致的状态转换就有限状态机。原创 2024-01-11 11:04:23 · 753 阅读 · 0 评论 -
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 · 765 阅读 · 0 评论 -
redis哨兵机制
当有个哨兵标记主节点为「客观下线」后,就会进行选举 Leader 的过程,因为此时哨兵集群还剩下 3 个哨兵,那么还是可以拿到半数以上(5/2+1=3)的票,而且也达到了 quorum 值,满足了选举 Leader 的两个条件, 所以就能选举成功,因此哨兵集群可以完成主从切换。这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis 主节点的客户端,将其配置中的主节点 IP 地址更新为「新主节点」的 IP 地址。原创 2023-10-20 16:51:39 · 236 阅读 · 0 评论 -
redis 数据结构(二)
整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不时,就会使用整数集这个数据结构作为底层实现。原创 2023-09-04 18:55:10 · 1170 阅读 · 0 评论 -
redis 数据结构(一)
redis是一种内存数据库,所有的操作都是在内存中进行的,还有一种重要原因是:它的数据结构的设计对数据进行增删查改操作很高效。redis的数据结构是什么redis数据结构是对redis键值对值的数据类型的底层的实现,注意不是。原创 2023-08-12 11:56:10 · 706 阅读 · 0 评论 -
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 · 436 阅读 · 0 评论 -
redis 三种缓存更新策略
今天聊聊redis 三种缓存更新策略分别是:Cache Aside(旁路缓存)策略;Read/Write Through(读穿 / 写穿)策略;Write Back(写回)策略;其中 Cache Aside策略是redis和Mysql使用的更新策略,另外两种策略主要使用在计算机系统上。原创 2023-07-09 19:11:30 · 2244 阅读 · 0 评论 -
redis 主从复制
在文章中,我们知道如果redis宕机了,我们可以通过AOF 和 RDB 文件的方式恢复数据,从而保证数据的丢失(或少量损失)从而提高稳定性。但是,如果我们数据只存在一台redis服务器中,那么在恢复期间我们无法提供服务的,这不符合服务器的高可靠性。如果更加严重的话,这台服务器的硬盘出现了故障,那么数据是不是全部丢失了吗?这也是无法接受的。那么为了避免这种单点故障,我们有什么办法呢?有同学可以会想到的机制。那就恭喜你了,你想的答案是对的。在redis中也提供来解决这样的问题。原创 2023-02-14 18:45:00 · 506 阅读 · 1 评论 -
redis的持久化RDB与AOF详解
Redis读写速度快、性能优越是因为它将所有数据存在了内存中,然而,当Redis进程退出或重启后,所有数据就会丢失。所以我们希望Redis能保存数据到硬盘中,在Redis服务重启之后,原来的数据能够恢复,这个过程就叫持久化。原创 2023-02-07 20:26:05 · 601 阅读 · 0 评论 -
解决哈希冲突的方案
当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了。原创 2022-11-21 18:00:00 · 677 阅读 · 0 评论 -
缓存雪崩、击穿、穿透
我们都知道,用户数据一般都是存储在数据库中,而数据库的数据是落地于磁盘的,如果我们读取数据库的数据那是很慢的。一旦,用户访问量上来,就很容易引起数据库崩溃。所以,我们一般会加入一层缓存避免直接访问数据库,而redis就是不错的缓存层。因为redis是内存数据库,所以存放redis中的数据跟存放在内存中的数据差不多。这也是我们今天要解决的问题,要知道它们怎么发生的,然后该怎么解决。原创 2023-04-02 11:42:06 · 4911 阅读 · 0 评论 -
缓存(redis)与数据库(MYSQL)数据一致性问题
在文章中,仔细的学习了一些MYSQL数据库的知识。但是,随着我们的业务越来越好,那么我们不可能直接去操作MYSQL数据库。因为直接去操作MYSQL终究会有比较多的I/O操作,而使整个系统的性能最终受到数据库I/O的制约而无法承载。所以,我们一般会给服务器加入缓存,这样客户端的操作可以直接操作缓存,从而减轻数据库的压力。而NOSQL中的redis比较常用的场景就是作为缓存。当我们引入缓存之后,怎么样去更新缓存和数据库的数据呢?原创 2023-01-12 16:31:00 · 1612 阅读 · 0 评论 -
Redis 实现分布式锁
今天跟大家聊聊两个问题:如何用 Redis 实现分布式锁?Redis 是如何解决集群情况下分布式锁的可靠性问题的?原创 2022-11-14 11:06:54 · 25 阅读 · 0 评论 -
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 · 13939 阅读 · 0 评论 -
MYSQL 主从复制 --- binlog
在谈主从复制之前,应该都会有一个疑问,那么就是一个MYSQL数据库存在的问题呢?1. 读和写所有压力都由一台数据库承担,压力大2. 数据库服务器磁盘损坏则数据丢失,单点故障为了解决我们可以使用MYSQL的主从复制处理,那么什么是主从复制呢?原创 2022-12-15 20:00:00 · 2912 阅读 · 0 评论 -
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 · 1372 阅读 · 0 评论 -
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 · 2053 阅读 · 1 评论 -
MySQL 的日志(undo log、redo log、binlog)
WAL(Write Ahead Log)预写日志,指的是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。也是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。原创 2022-12-08 19:00:00 · 1348 阅读 · 0 评论 -
MYSQL 事务、事务隔离级别和MVCC,幻读
事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。事务实现的主要两种方式:自动提交和手动提交, mysql默认是自动提交的。这两个方式实现如下:在MYSQL中事务是由引擎来实现的,因此并不是所有引擎都支持事务,如MYSQL的InnoDB 引擎是支持事务的,而 MyISAM 引擎是不支持事务的。事务看起来感觉简单,但必须遵守ACID 特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。这A原创 2022-12-01 19:15:00 · 1160 阅读 · 2 评论 -
MYSQL查询执行过程
MySQL逻辑架构整体分为三层,分别是客户端层,核心服务层,存储引擎层:客户端层:客户端层是最上层,主要处理连接处理、授权认证、安全等功能,并非MYSQL特有核心服务层:核心服务层主要处理查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)、存储过程、触发器、视图等存储引擎层:负责MySQL中的数据存储和提取。核心服务层通过API与其通信。原创 2022-11-10 17:30:00 · 1998 阅读 · 0 评论 -
MYSQL索引数据结构----B+树
我们在考虑数据结构的时候,应该首先要知道数据存放在哪里?而MYSQL的数据是持久化的,所以其数据(数据记录+索引)应该是保存在磁盘里面的。因此当我们要查询某条数据记录时,就会先从磁盘中读取索引到内存中,然后再通过内存索引数据找到该条记录在磁盘的某个位置上,最后将其读到内存中。所以查询过程中会发生多次磁盘I/O,而I/O越多耗时越长。所以,我们索引数据结构应该要尽可能少的磁盘的 I/O 操作就能完成查询工作。另外,MySQL 是支持范围查找的,所以索引的数据结构不仅要能高效地查询某一个记录,而且也要能高效地执原创 2022-11-24 19:45:00 · 1735 阅读 · 0 评论 -
MYSQL索引详解和优化
索引的定义 索引分类 数据结构分类 B+tree索引 Hash索引 Full-text索引 物理存储分类 聚簇索引(主键索引)二级索引(辅助索引) 字段特性分类 主键索引 唯一索引 普通索引 前缀索引 字段个数分类 单列索引 联合索引 创建索引的条件 索引优化方法 索引操作 创建索引 查看索引 删除索引原创 2022-11-17 18:30:00 · 920 阅读 · 0 评论 -
TCP连接中客户端的端口号是如何确定的?
在 TCP 连接中,客户端在发起连接请求前会先确定一个客户端端口,然后用这个端口去和服务器端进行握手建立连接。那么在 Linux 上,客户端的端口到底是如何被确定下来的呢?事实上很多我们平时遇到的问题都和这个端口选择过程相关,如果能深度理解这个过程,将有助于我们对这些问题的深刻理解。Cannot assign requested address 报错是怎么回事?一个客户端端口可以同时用在两条 TCP 连接上吗?还是让我们借助一段简单到只有两句的代码,从这个来讲起!转载 2022-10-02 18:30:00 · 2891 阅读 · 0 评论 -
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 · 1644 阅读 · 0 评论 -
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 · 1340 阅读 · 0 评论 -
MySQL数据库优化总结
索引的优化只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引尽量使用短索引,如果可以,应该制定一个前缀长度对于经常在where子句使用的列,最好设置索引,这样会加快查找速度对于有多个列where或者order by子句的,应该建立复合索引对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引尽量不要在列上进行运算(函数操作和表达式操作)尽量不要使用not in和操作sql语句的优化。原创 2022-10-18 19:00:00 · 710 阅读 · 0 评论 -
为什么服务端程序都需要先 listen 一下
icsk->icsk_accept_queue 定义在 inet_connection_sock 下,是一个 request_sock_queue 类型的对象。是内核用来接收客户端请求的主要数据结构。我们平时说的全连接队列、半连接队列全部都是在这个数据结构里实现的。我们来看具体的代码。*/......}我们再来查找到 request_sock_queue 的定义,如下。//全连接队列//半连接队列......};转载 2022-10-04 19:30:00 · 280 阅读 · 0 评论 -
TCP协议的可靠传输原理
从上面的和中,我们都知道TCP是可靠的传输协议,那么TCP协议是怎么样保证可靠性呢?其实要实现可靠性就是要解决等问题?要解决这些基本问题主要是通过TCP协议的等机制实现。原创 2022-09-26 19:00:00 · 1264 阅读 · 0 评论 -
深入理解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 · 1842 阅读 · 0 评论 -
Linux网络包接收过程
网络模块是Linux内核中最复杂的模块了,看起来一个简简单单的收包过程就涉及到许多内核组件之间的交互,如网卡驱动、协议栈,内核ksoftirqd线程等。看起来很复杂,本文想通过图示的方式,尽量以容易理解的方式来将内核收包过程讲清楚。现在让我们再串一串整个收包过程。当用户执行完recvfrom调用后,用户进程就通过系统调用进行到内核态工作了。如果接收队列没有数据,进程就进入睡眠状态被操作系统挂起。这块相对比较简单,剩下大部分的戏份都是由Linux内核其它模块来表演了。......转载 2022-09-08 19:00:00 · 1344 阅读 · 0 评论 -
深入理解高性能网络开发路上的绊脚石 - 同步阻塞网络 IO
在网络开发模型中,有一种非常易于开发同学使用的方式,那就是同步阻塞的网络 IO。例如我们想请求服务器上的一段数据,那么 C 语言的一段代码 demo 大概是下面这样:但是在高并发的服务器开发中,这种网络 IO 的性能奇差。因为如果用一句话来概括,那就是:同步阻塞网络 IO 是高性能网络开发路上的绊脚石!转载 2022-09-04 13:33:52 · 282 阅读 · 0 评论 -
深入理解 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 · 734 阅读 · 0 评论