bjmayor 发布于 2021-10-24

MySQL为何选择B+树存储索引

MySQL为何选择B+树存储索引

声明
本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫。

什么是索引

提起索引,大家都知道,建立索引可以让数据库查询更快,那么索引究竟是什么?我想这就不是每个人都能说得出来了。
索引,是数据库管理系统中一个排序的数据结构,并用以协助快速查询、 更新数据库表中数据。
是的,索引是一种数据结构,但是那么多的数据结构中为何MySQL要选择B+树呢?接下来就让我们一起来了解下B+树相对于其他数据结构有何独特之处!

阅读全文 »

bjmayor 发布于 2021-10-22

I/O多路复用

I/O 多路复用

前言

  • BIO 、NIO 、AIO 总结
  • Unix网络编程中的五种IO模型

为了加深对 I/O多路复用机制 的理解,以及了解到多路复用也有局限性,本着打破砂锅问到底的精神,前面我们讲了BIO、NIO、AIO的基本概念以及一些常见问题,同时也回顾了Unix网络编程中的五种IO模型。本篇重点学习理解IO多路复用的底层实现机制。

概念说明

IO 多路复用有三种实现,在介绍select、poll、epoll之前,首先介绍一下Linux操作系统中基础的概念

  • 用户空间和内核空间
  • 进程切换
  • 进程的阻塞
  • 文件描述符
  • 缓存 I/O

阅读全文 »

bjmayor 发布于 2021-10-18

memcached使用介绍

[TOC]

memcached 有2个版本。需要注意。

介绍

特点:

  1. 协议简单
  2. 基于libevent的时间处理。
  3. 内置内存存储方式;
  4. 采用互不通信的分布式。(这里的分布式只是为了扩大能存多少的问题,而不是稳定性。)

从上述特点4可见,基于memcached的memcacheq有个很大的缺点,就是做分布式其实不稳定,如果其中一个服务器down掉,就会丢失消息,这时只能通过重启机器来解决。也就是必须有个监控服务才能保证稳定性。

基本特性

(1)mc的核心职能是KV内存管理,value存储最大为1M(可修改,改源代码,编译安装),它不支持复杂数据结构(哈希、列表、集合、有序集合等);

(2)mc不支持持久化;

(3)mc支持key过期;

(4)mc持续运行很少会出现内存碎片,速度不会随着服务运行时间降低;

(5)mc使用非阻塞IO复用网络模型,使用监听线程/工作线程的多线程模型;

阅读全文 »

bjmayor 发布于 2021-10-18

GMP调度器

GMP调度器

主要内容来自 潘少 的 gnet开源说。 https://github.com/gocn/opentalk

G、M、P 是什么

image-20211018161626840

G: 表示 Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑 定到 P 才能被调度执行。

P: Processor,表示逻辑处理器, 对 G 来说,P 相当于 CPU 核,G 只有绑定到 P(在 P 的 local runq 中)才能被调度。对 M 来说,P 提供了相关的执行 环境(Context),如内存分配状态(mcache),任务队列(G)等,P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量),P 的数量由用户设置的 GOMAXPROCS 决定,但是不论 GOMAXPROCS 设置为多大,P 的数量最大为 256。

M: Machine,OS 线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 goexit 做清理工作并回到 M,如此反复。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础,M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000个。

阅读全文 »

bjmayor 发布于 2021-10-14

原码、补码、反码

原码、补码、反码

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

将带符号位的机器数对应的真正数值称为机器数的真值。如: 10000011 的真值是3。

原码: 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。原码是人脑最容易理解和计算的表示方式.

反码:反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码: 补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

阅读全文 »