自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql join 正确的使用姿势

在实际生产中,大部分业务都需要从多张数据表中读取数据。在实现上,我们可以使用单表查询,在代码层实现关联;当然更多的时候,我们会使用 关键字 join。 join 用于多表联合查询,直接在数据库层将多张表的数据拼接起来,不用再去代码层实现关联。

2023-08-16 23:16:07 166

原创 mysql 特性之 change buffer

Change Buffer 只是一个统称,实际上它包含三个类型: Insert Buffer、Delete Buffer 和 Purge Buffer,分别对应 INSERT、DELETE 和 UPDATE 三种 DML 操作。Change Buffer 和数据页一样,也是物理页的一个组成部分,即它也会被写到磁盘;并且它的数据结构也是 B+ 树,存放在共享表空间中(ibdata1)。此外,Change Buffer 使用的是 buffer pool 里的内存,因此不能无限增大。从 InnoDB 1.

2023-08-15 18:09:45 185 1

原创 MySQL实战45讲 学习笔记(基础篇)

最近在阅读林晓斌老师的《MySQL实战45讲》,结合已经阅读的《InnoDB 存储引擎》,做了一些笔记记录。作为学习笔记,只会记录知识点,老师举的用例基本都不作记录,当然,对一些知识点也会做适当补充。

2023-04-01 15:27:11 371

原创 db2转orcale 建表篇

通过 jdbc 可以获取到数据库元数据,然后通过元数据就可以拿到所有表信息,有了方向,说干就干。思路很简单:首先查询所有 db2 的表名,然后挨个的去创建 orcale 对应的建表语句,生成建表语句后还要生成索引创建信息,最后将他们保存的一个 sql 文件中,然后就可以一键执行了。

2023-02-17 22:24:13 315

原创 go 学习, 模拟写个简单的 du 程序

linux的du命令用于显示目录或文件的大小,它提供诸多选项功能,本程序旨在学习并发控制。

2022-12-11 12:56:25 376

原创 golang 面试常问(简短变量声明、字符串、切片、defer)

简短变量声明,nil slice 和 empty slice,浅拷贝和深拷贝,切片扩容,浅拷贝引发的内存泄漏

2022-11-22 23:37:34 231

原创 redis惰性删除 lazy free 源码剖析,干货满满

redis 是用 c 语言实现的,而我们知道 c 语言是没有垃圾回收的,也就说对于程序申请的内存是需要程序来释放的,因此,在 redis 中删除数据包含两个步骤:步骤一:将待删除数据对从字典表中删除;步骤二:释放待删除数据所占用的内存空间。如果这两个步骤同步执行,就叫同步删除;而如果只执行步骤一,将来通过后台线程来执行步骤二,就叫异步删除。而惰性删除里的惰性其实指的就是删除时只执行步骤一,而将步骤二 "延迟" 到后台线程执行。

2022-11-10 22:01:30 3141 1

原创 Mysql两大日志之binlog和redo log

Innodb 基于磁盘存储,同时按 页 的方式来管理记录,一个页的大小默认为 16KB。如果每次查询或修改都要按页和磁盘进行 IO 交互会严重影响数据库的性能,因此引入了 内存缓存;有了内存缓存,在对数据进行查询时,先查缓存,如果数据存在直接返回,如果不存在则去磁盘读取并将读取到的页放到缓存池中,然后再返回数据;对数据的修改也是 先修改缓存池的页,而后异步的将页刷新回磁盘。但是异步刷新磁盘也带来一个新问题:在刷新磁盘前如果意外宕机,重启后内存数据已经没有了,就会导致数据丢失。

2022-09-20 23:56:42 6329

原创 Redis 主从同步

单点部署的服务无论服务本身设计的多完美,只要服务所在的机器宕掉了,都是白扯。在要求高可用性的系统设计上,都会遵守一个核心准则:冗余。也就是说某个节点挂掉后,还有其他节点可以继续提供服务。对 存储系统 设计冗余要考虑如何保证 数据的一致性(所有节点的数据要一致)。...

2022-08-18 20:37:43 5717

原创 TCP半连接和全连接队列

在 linux 4.18 这个版本中,并不存在所谓的 半连接队列,表示半连接状态的 requst_sock 保存在全局的 ehash 中, 具体结构可以参考文章 TCP源码浅读(1)数据结构,而且它的状态也不是 SYN_RECV,是 NEW_SYN_RECV。这个变化是 linux 4.4 以后产生的,可以阅读下这篇文章 TCP_NEW_SYN_RECV。​

2022-05-29 08:41:44 1511

原创 TCP源码浅读(6)三次握手-被动方接收ACK

1、首先查找 sock,会在 ehash 中找到代表半连接的 request_sock,它处于 TCP_NEW_SYN_RECV 状态;2、根据 request_sock 关联到 inet_listen_hashbucket 监听该端口的 tcp_sock (TCP_LISTEN);3、调用子流程 tcp_check_req 对 ACK 包做合法性检查,检查通过后,创建一个新的 tcp_sock ,用来表示和客户端的全连接;4、对新的 tcp_sock 进一步处理。

2022-05-14 10:43:21 380

原创 TCP源码浅读(5)三次握手-主动方接收SYN+ACK

主动方调用 connect 函数向被动方发起第一次握手后一直处于阻塞状态,直到收到被动方的响应,即第二次握手,主动方才可以继续接下来的处理。

2022-05-08 10:56:55 835

原创 TCP源码浅读(4)三次握手-被动方接收SYN

版本:linux 4.18.1作为学习笔记,只讨论常规的三次握手过程。服务端调用 listen 函数后一直处于 TCP_LISTEN 状态,等待客户端的连接请求;上一节我们分析了第一握手,客户端发送了 SYN 包,现在我们来看下服务端接收 SYN 包后的处理过程。// net/ipv4/tcp_ipv4.cint tcp_v4_rcv(struct sk_buff *skb){ struct sock *sk; // 从 tcp_hashinfo 中的各种 has

2022-05-04 21:06:50 1463

原创 TCP源码浅读(3)三次握手-主动方发送SYN

客户端调用 connect() 函数向服务端发起连接请求,经典的三次握手就是从这个时刻开启的。我们按照三次握手的流程来梳理。第一次握手,客户端发送 SYN 包。第一次握手主要流程:1、设置 sock 状态为 SYN_SENT;2、绑定端口,将 sock 加入到 bhash 和 ehash 中;3、构造 SYN 包,发送给服务端。

2022-05-03 21:12:29 1725

原创 TCP源码浅读(2)服务端 bind & listen

bind() 函数主要流程:首先根据 端口号 计算一个 hash 值,然后通过这个 hash 值在定位到 inet_bind_hashbucket 某个 slot;定位到 slot 后,要遍历它指向的整个链表,看这个端口是否已经存在:如果端口不存在,就新建一个 inet_bind_bucket ,链入该 slot;如果端口已经存在,则要检查是否已经有连接使用了该端口:如果已经有连接使用,则报错(不考虑端口重用);执行到这里,已经有一个 inet_bind_bucket 表示这个端口了

2022-05-02 21:43:16 1370

原创 TCP源码浅读(1)数据结构

版本:linux 4.18.1作为学习笔记,只讨论常规的三次握手过程。全局连接信息 inet_hashinfolinux 通过一个全局的 inet_hashinfo 类型的对象 tcp_hashinfo 来管理所有 tcp 连接信息。在 inet_hashinfo 类型中,又包含四个 hashtable 分别管理不同状态下的 sock。// linux-4.18.1/include/net/inet_hashtables.hstruct inet_hashinfo { /

2022-05-01 23:30:05 907

原创 TCP三次握手,两次可以吗?

这个问题网络上的回答超级多,众说纷纭。以RFC 793来回答这个问题可能更加准确。Reliability:The TCP must recover from data that is damaged, lost, duplicated, or delivered out of order by the internet communication system. This is achieved by assigning a sequence number to each octet tra...

2022-04-13 16:00:21 3244

原创 golang 垃圾回收、三色标记法、写屏障

垃圾回收简称 GC,就是对程序中不再使用的内存资源进行自动回收释放的操作。常见的垃圾回收算法引用计数:每个对象维护一个 引用计数,当对象被创建或被其他对象引用时,计数 +1;如果引用该对象的对象被销毁时,计数 -1 ;当计数为 0 时,回收该对象。优点:对象可以很快被回收,不会出现内存耗尽或到达阀值才回收。 缺点:不能很好的处理循环引用;需要实时维护计数引用。标记-清除:从根变量开始遍历所有引用的对象,引用的对象会被标记,没有被标记的则进行回收。优点:解决了引用计数的缺点; 缺点:需要

2022-04-06 23:25:59 1984 4

原创 golang unsafe.Sizeof 函数

unsafe.Sizeof 函数// Sizeof takes an expression x of any type and returns the size in bytes// of a hypothetical variable v as if v was declared via var v = x.// The size does not include any memory possibly referenced by x.// For instance, if x is a sl

2022-03-25 22:45:52 1642

原创 Redis RDB 和 AOF 持久化

前言Redis 是内存数据库,一旦 Redis 进程因为某种原因发生退出,内存中的数据就会全部丢失,即使只是把 Redis 当做缓存使用,在高并发的情况下也可能引起 缓存雪崩,导致整个系统不可用。为了解决这个问题,Redis 提供了两种持久化方式: RDB(Redis DataBase) 和 AOF(Append Only File),它们可以将内存中的数据保存到磁盘,在 Redis 进程异常退出重启后,可以从磁盘里把数据重新读回到内存。RDB 持久化RDB 持久化是将内存在某一时刻的数据集

2022-03-17 23:17:29 1238

原创 Redis 缓存淘汰策略以及 LRU、LFU 算法

Redis 使用内存来保存数据,而物理内存是有限的,如果不对 Redis 使用内存做出限制,当内存不够用时,操作系统将通过 swap 分区让数据在内存和硬盘之间来回置换,这会严重影响 Redis 性能,因此我们一般要配置 Redis 可以使用的最大内存(maxmemory)。​​​​​​​

2022-03-13 22:08:43 5294 4

原创 golang 原生 tcp setsocketopt

最近新项目上线,自己写了一个测试程序来做压测。测试刚开始使用小并发的请求没有啥问题,但是加大并发后,发现每次请求到1.6 万笔左右的时候就连接不上服务器了,而监控服务器这边显示 cpu、内存都很正常,所以猜测是客户端这边某些资源到达了瓶颈。再次发起测试,同时在客户端这边通过 netstat -anpt 命令 查看 tcp网络状态,发现存在大量 time_wait 状态 的连接。问题找到了,因为压测程序这边使用 tcp 短连接,每完成一次请求后就 主动断开 了连接。我们知道正常调用 close 会

2022-03-12 20:45:35 4492 1

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

缓存雪崩大量 key 的查询本应该在缓存层返回,由于缓存失效,这些查询都要去请求数据库,导致数据库过载。造成缓存雪崩的原因一般有以下两点 :大量 key 同时过期 Redis 缓存实例宕机,导致缓存完全失效大量 key 同时过期 一般源自于大量 key 在同一时间设置了相同的过期时间。如果存在同一时间需要设置大量 key 的情况, 最简单实用的方案是 给过期时间加个较小的随机值,这样就可以避免大量 key 同时过期的产生,同时还可以保证 key 的有效期和预期设定值不会偏离很远。而如

2022-03-06 22:50:50 542

原创 Redis 缓存和数据库一致性讨论

缓存模型根据 缓存是否接收写请求 可以将缓存分为 只读缓存 和 读写缓存。只读缓存所有的 读请求直接发到缓存,缓存中不存在再去数据库查询数据并加载到缓冲中。所有的 写请求直接发送到后端数据库,针对删除和修改,数据可能存在于缓存中,因此还需要 删除缓存中的数据。因为写请求是直接发送到后端数据库的,因此 数据的最新状态存在于数据库中,不会发生数据的丢失。读写缓存读请求和写请求都发送到缓存,即直接在缓存中进行增删改查。直接操作缓存可以极大地提升系统的响应性能,当然,因为数据的最新状态位

2022-03-03 22:50:28 363

原创 RabbitMQ 延迟队列

业务需求发送消息可能出现失败的情况,此时需要对消息进行重新发送,重新发送需要设置一定的延迟间隔,针对同一条消息的重试,间隔要随着重试次数线性增长(第一次间隔 3 秒,第二次间隔 10 秒,第三次 30 秒...)。方案选择传统的解决方案是利用消息过期变成死信来模拟实现的,即 死信队列 DLX + TTL 的方案;而在 RabbitMQ 3.6.x 开始后,官方提供了延迟队列的插件 rabbitmq-delayed-message-exchange 。DLX + TTL在实现上,消息过

2022-02-17 22:54:39 1672

原创 [mysql 学习笔记] - Next-key 锁

三种行锁算法InnoDB 支持行锁,包含三种行锁算法:Record Lock: 单个记录上的锁; Gap Lock: 间隙锁,它锁住的是一个范围,不包含记录本身;Next-key Lock: 等效于 Record Lock + Gap Lock。特别注意:InnoDB 行锁是通过 给索引上的索引项加锁来实现的。因此,在执行当前读的sql语句时,一定要记得带上索引条件,否则,mysql 将会执行全表扫描,将整个表锁住。假设有一张测试表 t:create table t (a i

2022-02-13 21:29:53 1669

原创 [mysql 学习笔记] - 多版本并发控制 MVCC

MVCC 定义MVCC(Multi-Version Concurrency Control)多版本并发控制,它是一种并发控制的方法。MVCC 会保存某个时间点上的数据快照,这意味着同一个事务在执行过程中,始终可以看到一个一致的数据视图。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。不同的存储引擎,实现 MVCC 的方法也不一样。-- 百科 MVCC一致性非锁定读、锁定读一致性非锁定读一致性非锁定读(Consistent Nonlocking Read

2022-02-10 22:09:11 604

redis底层对象结构图

函数没加上去,做简单的浏览。

2017-03-12

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

TA关注的人

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