
数据库
bohu83
微信:bohu83
展开
-
mysql 加锁分析与实践
一序 本文分为两个部分,第一部分主要基于何登成大神的文章。何博士作为阿里数据库内核团队大神。文章更是深入浅出。膜拜一下:原文地址如下 http://hedengcheng.com/?p=771 第二部分介绍常见的实践注意事项。二 背景 MVCC:Snapshot Read vs Current Read MySQL InnoDB存储引擎,实现的是基于...原创 2018-09-25 11:47:57 · 1007 阅读 · 0 评论 -
《redis设计与实现》-第8章object
一 序: 前面整理了edis基本的数据结构分别进行了简单的介绍,包括字符串、链表、哈希表、整数集合、压缩列表、压缩字典等,但是redis并不是直接使用这些数据结构来实现key-value对数据库的,而是基于这些数据结构为每一个对象创建一个对象robject。通过这五种不同类型的对象, Redis 可以在执行命令之前, 根据对象的类型来判断一个对象是否可以执行给定的命令。 使用对象的另一个好...原创 2018-11-22 13:30:24 · 442 阅读 · 0 评论 -
《redis设计与实现》-8字符串对象
今天下午去国家会议中心听了下gtic大会,孙玄老师讲的转转微服务化service mesh真好。接着看redis代码。一 编码及创建 字符串对象的编码可以是 int 、 raw 或者 embstr 。 源码在object.c/* Create a string object with EMBSTR encoding if it is smaller than * REIDS_E...原创 2018-11-23 23:46:26 · 371 阅读 · 0 评论 -
《redis设计与实现》-第6章整数集合intset
一 序 intset是Redis集合的底层实现之一,当存储整数集合并且数据量较小的情况下Redis会使用intset作为set的底层实现。当数据量较大或者集合元素为字符串时则会使用dict实现set。这一章看书相对简单,看一下源码对应的api,发现自己对于字节序不懂,所以先把预备知识贴一下,熟悉的可以跳过无视了。 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端...原创 2018-11-19 21:32:51 · 356 阅读 · 0 评论 -
《redis设计与实现》-8 list命令实现
一 序 上一篇整理了《quicklist》底层数据结构的实现原理。Redis 3.2版本对外开放的列表list结构就是采用quicklist作为底层实现,所以编码上就只有OBJ_ENCODING_QUICKLIST,而quicklist底层又是ziplist.所以从list的接口层面来看,是基于quicklist的接口进行封装。源码在t_list.c. 可以结合quicklist的源码q...原创 2018-11-26 00:03:00 · 293 阅读 · 0 评论 -
《redis设计与实现》-8 列表list
一 序 书上这一节内容不是很多,3.0版本还是侧重讲了ziplist到linkedlist的实现。3.2已经用quiklist替代了。打算分两部分来整理。先看quicklist本身的结构特性,下一篇再看list的命令实现,二 quicklist 先说下背景吧,就是为啥用quicklist:1 考虑到链表的附加空间相对太高,prev 和 next 指针就要占去 16 个字节...原创 2018-11-25 00:36:24 · 319 阅读 · 0 评论 -
《redis设计与实现》-8集合对象
一 序 之前的时候,拆二代(日天哥)问我集合的sdiff命令是怎么实现的?我说不知道,需要看代码才能知道。所以有了这篇。书上照例是举例说明编码及转换,还是按照惯例,先看编码、再看命令实现。谨以此文送给分享过disruptor的二代。二 t_set 之前在《redis设计与实现》-第8章object介绍过:一个集合类型的对象的编码有两种,分别是OBJ_ENCODING_HT和...原创 2018-11-28 23:28:56 · 254 阅读 · 0 评论 -
《redis设计与实现》-8 有序集合zset
一 序 书上本节照例比较简单,介绍两种编码及转换方式。所以还是分为编码跟命令实现两部分。二 zset 2.1 编码有序集合对象的底层实现类型如下表:编码—encoding 对象—ptr OBJ_ENCODING_SKIPLIST 跳跃表和字典实现的有序集合对象 OBJ_ENCODING_ZIPLIST 压缩列表实现的有序集合对象 关于底层的数据...原创 2018-11-30 00:17:23 · 430 阅读 · 0 评论 -
《redis设计与实现》-9数据库命令实现
一 序 上一篇按照书上的第9章的内容整理了redis数据库, 主要侧重于键值的过期及删除策略。限于偏于本篇整理数据的命令。数据库管理的命令如下表所示:命令 描述 FLUSHDB 清空当前数据库的所有key FLUSHALL 清空整个Redis服务器的所有key DBSIZE 返回当前数据库的key的个数 DEL key [key …] 删...原创 2018-12-04 21:43:02 · 218 阅读 · 0 评论 -
《redis设计与实现》-8 hash对象
一 序 昨天偷懒没有看代码,看了部电影《伸冤人2》,与中国的大侠不同,老外也有雷锋啊。明明是退役特工,却在生活中收敛锋芒,变成了滴滴快车的师傅,打戏占比不是全程从头打到尾的,却也干净利落。大段的镜头描写平静的美式中年生活。有一种大隐于市的感觉,喜欢主人公那种读书的感觉。 好吧,扯完闲篇开始 今天的读书生活。关于hash对象书上只是简单列了下编码格式及转换。后面整理命令的实现需要结合...原创 2018-11-28 00:44:16 · 303 阅读 · 0 评论 -
《redis设计与实现》-第7章压缩列表ziplist
一 序 压缩列表是 Redis 为了节约内存而开发的(上一篇还看了intset,都是时间换空间吧), 由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。书上分了两部分:介绍结构及连锁更新。本文也是从结构及API源码两部分。 ziplist是hash键以及zset键的底层实现之一(3.0之后list键已经不直接用ziplist和linkedlist作为底层...原创 2018-11-21 14:28:22 · 269 阅读 · 1 评论 -
《redis设计与实现》-4 字典
一 序 上一篇整理了redis的hash,其实算法看不懂是个人能力有限,但是剩下的没有那么复杂了,在理解了字典的结构后,主要是hash的扩容rehash等。所以,本篇分为两个部分,上面介绍结构,下面介绍api的部分实现,如扩容、缩容等。 Redis中的字典采用哈希表作为底层实现,一个哈希表有多个节点,每个节点保存一个键值对。C语言没有这个结构,所以redis构件自己的实现。字...原创 2018-11-17 00:04:09 · 238 阅读 · 0 评论 -
MySQL · 引擎特性 · InnoDB 事务锁系统简介(上)
一 序 最近跟速运联调系统,没顾上写笔记。之前看沈剑老师的公众号:架构师之路 有对锁做了介绍。还是参照官方文档整理下,有助于系统理解。主要是mysql.taobao的月报。 锁机制是数据库区别于文件系统的主要标志之一,用于管理对共享资源的并发访问。MYSQL支持表锁,innodb引擎支持行锁,主要分为基本概念,目的是了解锁类型,加锁场景。case没有补充。代码以mysql 5....原创 2018-09-20 15:47:13 · 681 阅读 · 0 评论 -
慢SQL优化case
一 序 慢SQL是常见的问题,可能建表没有,慢慢随着业务增长就有了。所以是一个长期的过程。需要不断去监控,维护。二 无索引 当数据库中出现访问表的SQL无索引导致全表扫描,如果表的数据量很大,扫描大量的数据,应用请求变慢占用数据库连接,连接很快被耗用完,新请求无连接可用。case:CREATE TABLE `user` (……mo bigint NOT NULL ...原创 2018-09-26 18:10:29 · 805 阅读 · 0 评论 -
MySQL · 源码分析 · InnoDB Repeatable Read隔离级别之大不同
一序 ANSI SQL STANDARD定义了4类隔离级别(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE),包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级别一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommitted(读未提交) 在该隔离级别,所有...原创 2018-09-27 20:02:09 · 2148 阅读 · 0 评论 -
MySQL · 引擎特性 · InnoDB mini transation
一 序 之前的在整理redo log redo log用来保证事务持久性,通过undo log可以看到数据较早版本,实现MVCC,或回滚事务等功能。二 mini transaction 简介 innodb存储引擎中的一个很重要的用来保证持久性的机制就是mini事务,在源码中用mtr(Mini-transaction)来表示,本书把它称做“物理事务”,这样叫是相对逻辑事务...原创 2018-10-07 22:55:57 · 974 阅读 · 0 评论 -
MySQL · 源码分析 · 一条insert语句的执行过程
一序本文只分析了insert语句执行的主路径,和路径上部分关键函数,很多细节没有深入。二 SQL_parse我们略过建立连接(其实是还没整理这一块),看sql解析部分。因为在执行execute command之前,一个SQL query首先会被放入mysql_parse()进行语法解析,源码在mysql-5.7.18/blob/master/sql/sql_parse.cc:/*...原创 2018-09-30 17:22:33 · 7927 阅读 · 9 评论 -
Could not get a resource from the pool
一 问题:redis.clients.jedis.exceptions.JedisConnectionException: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResour...原创 2018-10-19 16:42:01 · 1209 阅读 · 0 评论 -
《redis设计与实现》读书笔记-第三章链表
一 序: 书上这一章比较简单,redis链表就是一个双向链表的结构,每个元素都是一个结点。跟Java的linkedlist类似。所以它的插入和删除操作非常快,时间复杂度为 O(1),索引定位很慢,时间复杂度为 O(n)。主要列举下链表的特点: 双端:链表节点有prev 和next指针。 无环:头结点的prev跟尾节点的next都指向null。 带头尾指针:head...原创 2018-11-09 17:02:57 · 270 阅读 · 0 评论 -
《redis设计与实现》-4字典中hash方法
一 序 本文打算整理hash,暂时看不懂大神的算法,先整理下来,至于redis字典结构啥的,文章很多了。大神的原著:http://www.concentric.net/~Ttwang/tech/inthash.htm 贴出来表示敬意,其实已经打不开了,好在有好心人有搬到github 了:https://gist.github.com/badboy/6267743 非常推荐。对了它...原创 2018-11-15 21:15:32 · 856 阅读 · 0 评论 -
《redis设计与实现》-第5章跳跃表
一 序: 之前的文章<跳跃表的原理> 已经整理过,本篇看下redis的具体实现。以下摘自书上的介绍: 跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均 O(\log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平...原创 2018-11-18 18:48:01 · 441 阅读 · 0 评论 -
《redis设计与实现》-8对象总结
一 序 前面几篇文章分别整理了:8字符串对象 列表list list命令实现 hash对象 集合对象 有序集合zset 后面的几节就是回顾了对象的其他特性。下面简单汇总下。二 类型检查与命令多态2.1 类型检查 Redis 中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行, 比如说 DEL 命令、 EXPIRE 命令、 ...原创 2018-11-30 22:43:19 · 268 阅读 · 0 评论 -
《redis设计与实现》-10 RDB持久化
一 序 本章书上内容较大部分介绍了RDB文件的创建与载入、自动间隔性保存、RDB文件结构。所以本文分为两部分上边参照书上梳理,第二部分看bgsave的源码实现。 Redis是内存型数据库,如果服务器进程退出,服务器中的数据状态也会消失不见,所以需要持久化功能。为了解决这个问题,Redis提供了两种持久化的机制:RDB和AOF。本篇主要整理RDB持久化的部分。RDB持久化功能...原创 2018-12-05 23:56:23 · 486 阅读 · 0 评论 -
《redis设计与实现》-17槽指派
一 序 Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。 当数据库总的16384个槽都有节点在处理时,集群处于上线状态(ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。 通过向节...原创 2019-01-18 17:02:33 · 577 阅读 · 0 评论 -
《redis设计与实现》-17 集群重新分片reshard
一 重新分片 Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。 重新分片操作可以在线进行,在重新分片过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。二 重新分片的原理 Redis的集群管理工具redis-trib,通过向源节点和目标节点发送命令来进...原创 2019-01-23 23:52:27 · 1914 阅读 · 0 评论 -
《redis设计与实现》-17 在集群中执行命令
一 序在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了。当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令 如果将所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,...原创 2019-01-18 23:50:45 · 291 阅读 · 0 评论 -
《redis设计与实现》-17 cluster节点
一 序 关于redis的集群,官网介绍比较全面了。https://redis.io/topics/cluster-spec 设计目标:High performance and linear scalability up to 1000 nodes. There are no proxies, asynchronous replication is used, and no merge...原创 2019-01-14 21:42:16 · 963 阅读 · 0 评论 -
《redis设计与实现》-17 集群的故障检测
一 序 redis集群中的节点分为master 和slave 。其中master负责处理槽;slave 会复制master 的数据, 并在master 下线后, 代替它继续进行处理命令请求。下面分别介绍节点复制、故障检测,限于篇幅故障转移下一篇整理。二 节点复制 向集群节点发送"CLUSTER REPLICATE <nodeID>"命令,使收到命令的集群节点成为...原创 2019-01-27 22:09:43 · 865 阅读 · 0 评论 -
《redis设计与实现》-17 集群 gossip协议
一 gossip协议 上一篇介绍了集群的cluster meet命令实现过程,握手过程结束后,A节点会将B节点信息通过gossip协议传播给集群的其他节点,其他节点也会与B节点握手,最终经过一段时间后,B节点会被集群的所有节点认识。 补充下背景知识: Gossip算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都会知道该八卦的信息,这种方式也与...原创 2019-01-16 23:23:37 · 5321 阅读 · 1 评论 -
《redis设计与实现》-19事务transaction
一 序 Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 、UNWATCH 5个命令来实现事务功能, 本章首先讨论使用 MULTI 、 DISCARD 和 EXEC 三个命令实现的一般事务, 然后再来讨论带有 WATCH 的事务的实现,最后通过常见的 ACID 性质对 Redis 事务的安全性进行了说明。二 事务 事务提供了一种“将多个命令...原创 2019-02-04 01:03:35 · 328 阅读 · 0 评论 -
《redis设计与实现》-17集群故障转移
一 RAFT算法 书接上篇17 集群的故障检测,本篇主要介绍集群检测到某主节点下线后,是如何选举新的主节点的。注意到Redis集群是无中心的,那么使用分布式一致性的算法来使集群中各节点能对在新主节点的选举上达成共识就是一个比较可行的方案。Redis使用了Raft算法来做主节点选举的。所以这里先简单介绍下Raft的原理:( 坦白的说,我是看不懂论文的数学公式,真让人头疼,之前在看书pa...原创 2019-01-29 22:57:55 · 581 阅读 · 0 评论 -
MYSQL数据库 单表亿级数据不停机迁移
一 序 根据业务规划,需要对于交易系统进行数据库优化,合规性要求是先进行数据库迁移,再做水平分库拆分。一些表数据供参考: rows datasize index...原创 2019-06-27 10:43:33 · 8186 阅读 · 2 评论 -
《redis设计与实现》-16sentinel 源码部分
一 序 上一篇整理了sentinal的理论部分,本篇继续看下源码部分,源码在sentinel.c 。 redis的sentinel的解决方案基于主从复制结构着眼于分布式存储的高可用方案,那么数据的持久化跟复制就是基础。而sentinel就是针对异常情况下,如何对于实现主从切换,并且对于客户端透明。所以从整个系统来看,sentinel本身是监督者的身份,没有存储功能。而为了实现监督...原创 2019-01-07 00:46:34 · 1690 阅读 · 13 评论 -
《REDIS设计与实现》-16 sentinel 哨兵
一 序 redis主从复制可将主节点数据同步给从节点,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。这个过程如果人工介入,效果肯定没有自动的高可用机制好。sentinel 哨兵机制就是为了解决这个问题。是redis的高可用HA方案:有一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服...原创 2018-12-26 00:10:25 · 508 阅读 · 0 评论 -
《redis设计与实现》-9 单机数据库
一 序 第9章书上内容还是比较多的,主要是数据库的数量,切换,数据库键空间,设置键过期时间,过期删除策略,AOF对过期键的处理,数据库的通知等不同点去展开。下面接单总结下。二 数据库的实现 数据库结构,源码在server.htypedef struct redisDb { // 键值对字典,保存数据库中所有的键值对 dict *dict; ...原创 2018-12-04 00:14:14 · 335 阅读 · 0 评论 -
《REDIS设计与实现》- 网络连接库剖析(client的创建/释放、命令接收/回复等)
一 序 这一篇看起来networking.c好头大,因为书上的没怎么提,主要看代码,这个流程有点长。感谢网上大神的文章,终于明白了这个流程。本篇的主要包含:客户端的连接处理、客户端的创建与释放、接受客户端的命令、回复客户端、关于客户端命令几部分。这个找到原始出处会补充上。限于篇幅本文只整理server端流程,客户端的待下篇整理。对比下自己画的server端的草图二...原创 2018-12-15 00:31:06 · 1085 阅读 · 0 评论 -
《redis设计与实现》-11 AOF持久化
一 序 Redis除了使用RDB文件持久化数据库外,还提供了AOF持久化功能,与RDB持久化的区别如下:RDB持久化:把当前进程数据生成时间点快照(point-in-time snapshot)保存到硬盘的过程,避免数据意外丢失。 AOF持久化:以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。AOF 持久化功能的实现可以分为命令追加(appe...原创 2018-12-09 23:51:51 · 677 阅读 · 0 评论 -
《redis设计与实现》--客户端如何发送及接受命令
一 序 上一篇整理了redis的server端流程,本篇文章介绍的是 Redis 客户端如何处理输入的命令、向服务发送命令以及取得服务端回复并输出到终端等过程。 简单的交互过程如下:一、Client 发起socket 连接二、Server 接受socket连接三、客户端 开始写入四、server 端接收写入五、server 返回写入结果六、Client收到返回结果 详...原创 2018-12-16 22:41:41 · 1319 阅读 · 0 评论 -
REDIS 数据淘汰机制
一 序 之前在整理Object的时候,关于LRU的淘汰地方没有看代码,本篇补上。redisobject中除了type、encoding、ptr和refcount属性外,还有一个lru属性用来计算空转时长。OBJECT IDLETIME命令可以打印出给定键的空转时长,是用当前时间减去键的lru时间计算得出的。OBJECT IDLETIME命令是特殊的,这个命令在访问键的对象时,不会修...原创 2018-12-17 23:32:43 · 1093 阅读 · 0 评论 -
《redis设计与实现》-12事件event
一 序 书上主要介绍了文件事件、时间事件,事件调度三部分,结合源码来看,主要分在ae.hae.c 与networking.c两大块。限于篇幅。本文分两部分,第一部分整理书上概念,第二部分看一下时间事件及文件事件的部分源码。文件事件的处理器部分单独整理。二 事件类型Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(file event):Redis服务器...原创 2018-12-12 13:52:58 · 405 阅读 · 0 评论