你要如何衡量你的人生

坚持,努力,让好事发生

Redis的set对象里用到了整数集合(intset)

(1) 整数集合是什么

整数集合(intset)类似于数组,但同时有有序无重复的特点,并且可以根据元素的值,自动选择整数类型来保存元素。

整数集合里的元素 类型一样(整数类型都是int16/int32/int64),里面的值不重复
相比于数组,增加了自动编码转换的功能。

阅读全文 »

Redis是内存数据库,为了节省内存,在一些条件下使用了紧凑型数据结构,其中一个就是压缩列表(ziplist)

(1) 压缩列表(ziplist)是什么

ziplist是一种特殊编码的双向链表,旨在提高内存效率。
它存储字符串和整数值,其中整数被编码为实际整数而不是一系列字符。
它允许在O(1)时间内对列表的任一侧进行推送和弹出操作。
但是,由于每个操作都需要重新分配 ziplist 使用的内存,因此实际的复杂性与 ziplist 使用的内存量有关。

(1.1) 压缩列表结构

压缩列表结构

阅读全文 »

在Redis的命令中,用于对键(key)进行处理的命令占了很大一部分, 而对于键所保存的值的类型(后简称”键的类型”),键能执行的命令又各不相同。

比如 string list hash set zset 怎么处理key的过期时间?

这就涉及到Redis的对象系统了。

(1) Redis对象系统是什么

Redis 的 key 一般是 String 类型,但 value 可以是很多类型(String/List/Hash/Set/ZSet等),所以 Redis 要想存储多种数据类型,就要设计一个通用的对象进行封装,这个对象就是 redisObject。

redisObject、数据类型、数据结构之间的关系

redisObject 是Redis类型系统的核心, 数据库中的每个键、值,以及Redis本身处理的参数,都表示为这种数据类型。

阅读全文 »

哈希表是一种非常关键的数据结构,在计算机系统中发挥着重要作用。
它的底层是数组+链表,通过哈希计算,能以 O(1) 的复杂度快速根据key查询到数据。

(1) 数据结构-哈希表

假设让我们自己实现一个哈希表,我们要考虑哪些方面?

  1. 哈希表提供的功能
  2. 哈希表操作的时间复杂度为O(1)
  3. 哈希表的容量与扩容

(1.1) 哈希表的常用方法

新建哈希表、新增数据、修改数据、删除数据、查询数据

(1.2) 哈希函数-优化时间复杂度的利器

要想使时间复杂度为O(1),要通过高效的定位方法,比如hash函数

哈希函数

阅读全文 »

Redis绝大部分操作都会涉及到key,使用特别广泛,从系统设计的角度来看,我们该如何设计实现字符串呢?

Redis 设计了简单动态字符串(Simple Dynamic String)的结构,用来表示字符串。相比于 C 语言中的字符串实现,SDS 这种字符串的实现方式,会提升字符串的操作效率,并且可以用来保存二进制数据。

(1) SDS是什么

Redis 是 Simple Dynamic String 的缩写,中文是简单动态字符串

SDS结构里包含了一个字符数组 buf[],用来保存实际数据。
同时,SDS结构里还包含了三个元数据,分别是字符数组现有长度 len、分配给字符数组的空间长度 alloc,以及 SDS 类型 flags。

sdshdr结构

阅读全文 »

Redis代码的整体架构,就相当于给 Redis代码画了张全景图。
有了这张图,我们再去学习 Redis 不同功能模块的设计与实现时,就可以从图上快速查找和定位这些功能模块对应的代码文件。

庖丁解牛
代码的目录结构和作用划分 理解 Redis 代码的整体架构,以及所包含的代码功能类别;
系统功能模块与对应代码文件 目的是了解 Redis 实例提供的各项功能及其相应的实现文件,以便后续深入学习。

阅读全文 »

Redis核心知识点
1、redis基本架构 访问模式(client server)、支持的功能、存储、持久化
2、redis索引模型
3、redis数据类型 string、list、hash、set、sorted set 及对应数据结构 sds、压缩列表、双向链表、整形数组、哈希表、跳表
4、redis IO模型
5、持久化 RDB、AOF
6、高可用 主从、哨兵
7、横向扩展 集群、分片
8、内存安全 内存过载时key淘汰算法
9、内存分配器
10、功能扩展

高性能: 数据结构、线程模型、持久化、(epoll)网络框架;
高可用: 主从复制、哨兵机制;
扩展性: 数据分片、负载均衡。

(1) Gossip协议是什么

Gossip协议是一种”最终一致性”的分布式共识协议。

(1.1) Gossip工作过程

Gossip 的过程十分简单,它可以看作是以下两个步骤的简单循环:

1、如果有某一项信息(八卦消息)需要在整个网络(社交网络)所有节点中传播,那从信息源(第一个人)开始,选择一个固定的传播周期(譬如1秒),随机选择它(关系好的k个人)相连接的k个节点(称为Fan-Out)来传播消息。

2、每一个节点收到消息(八卦消息)后,如果这个消息是它之前没有收到过的,将在下一个周期内,选择除了发送消息给它的那个节点外的其他相邻k个节点(关系好的人)发送相同的消息,直到最终网络中所有节点(所有人)都收到了消息,尽管这个过程需要一定时间,但是理论上最终网络的所有节点都会拥有相同的消息。

八卦协议

整个过程像八卦消息在人群中传播,也像病毒在人群中传播。

阅读全文 »

 最近的一段时间里,线上数据库出现了很多慢查询,但是通过代码去看都是走了索引的,而且通过explain分析也是走了索引,但确实是有慢查询,很奇怪,就想通过mysql-query-profiler分析SQL慢查。

 MySQL 的 Query Profiler 是一个使用非常方便的 Query 诊断分析工具,通过该工具可以获取一条Query 在整个执行过程中多种资源的消耗情况,如 CPU,IO,IPC,SWAP 等,以及发生的 PAGE FAULTS,CONTEXT SWITCHE 等等,同时还能得到该 Query 执行过程中 MySQL 所调用的各个函数在源文件中的位置。

(1) Query Profiler 的具体用法

(1.1) 查看是否开启 Query Profiler

/** 查看是否开启 Query Profiler */
mysql>  show variables like 'profiling' ;  
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | OFF   |
+---------------+-------+
1 row in set (0.03 sec)

mysql>

 

(1.2) 设置开启Query Profiler功能

/** 开启 Query Profiler 功能。 */
mysql>  set profiling = 1 ;    
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

 

(1.3) 获取系统中保存的所有 Query Profiler 概要信息

/** 获取系统中保存的所有 Query 的 profile 概要信息 */
mysql>  show profiles;  
+----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                                                                                                                                                                         |
+----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|        1 | 0.00138750 | show variables like 'profiling'                                                                                                                                                                                                                               |
|        2 | 0.19619525 | SELECT * FROM xxxx_biz_db_xxx_base_xxxxxxxx LIMIT 10 OFFSET 0 |
+----------+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql>

 

阅读全文 »

参考资料

[1] 《深入理解Linux网络》
[2] 开发内功修炼 - 能将三次握手理解到这个深度,面试官拍案叫绝!
[3] 趣谈Linux操作系统 - 44 | Socket内核数据结构:如何成立特大项目合作部?
[4] 开发内功修炼 - TCP连接中客户端的端口号是如何确定的?
[5] 开发内功修炼 - 深入解析常见三次握手异常

0%