继续撸我们的对象和数据类型. 上节我们一起认识了字符串和列表,接下来还有哈希.集合和有序集合. 1 哈希对象 哈希对象的可选编码分别是:ziplist 和 hashtable. 1.1 ziplist 编码的哈希对象 ziplist 编码的哈希对象使用压缩列表作为底层实现.每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到表尾,然后再将保存了值的压缩列表节点推入到表尾.因此: 保存了键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后: 先添加到哈希对象中的…
相信很多人应该都知道 Redis 有五种数据类型:字符串.列表.哈希.集合和有序集合.但这五种数据类型是什么含义?Redis 的数据又是怎样存储的?今天我们一起来认识下 Redis 这五种数据结构的含义及其底层实现. 首先要明确的是,Redis 并没有直接使用这五种数据结构来实现键值对数据库,而是基于这些数据结构创建了一套对象系统,我们常说的数据类型,准确来说,是 Redis 对象系统的类型. 1 对象 对于 Redis 而言,所有键值对的存储,都是将数据存储在对象结构中.所不同的是,键总是一个…
Redis 没有直接使用 C 语言传统的字符串表示(以空字符串结尾的字符数组),而是构建了一种名为简单动态字符串(simple dynamic string)的抽象类型,并将 SDS 用作 Redis 的默认字符串表示. 在 Redis 中,C 字符串只会作为字符串字面量用在一些无需对字符串进行修改的地方,比如打印日志: serverLog(LL_WARNING,"SIGTERM received but errors trying to shut down the server, check…
目录 1 字典的实现 2 插入算法 3 rehash 与 渐进式 rehash 总结 字典,是一种用于保存键值对的抽象数据结构.由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字典实现. 在 Redis 中,就是使用字典来实现数据库底层的.对数据库的 CURD 操作也是构建在对字典的操作之上. 除了用来表示数据库之外,字典还是哈希键的底层实现之一.当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis 就会适应字典作为哈希键的底层实现. 1 字…
目录 1 ziplist 2 skiplist 3 quicklist 总结 Redis 底层使用了 ziplist.skiplist 和 quicklist 三种 list 结构来实现相关对象.顾名思义,ziplist 更节省空间.skiplist 则注重查找效率,quicklist 则对空间和时间进行折中. 在典型的双向链表中,我们有称为节点的结构,它表示列表中的每个值.每个节点都有三个属性:指向列表中的前一个和下一个节点的指针,以及指向节点中字符串的指针.而每个值字符串值实际上存储为三个部…
[TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis 用于保存整数值的集合抽象数据结构.它可以保存类型为 int16_t.int32_t.int64_t 的整数值,并且保证集合中不会出现重复元素. 每个 intset.h/intset 结构表示一个整数集合: typedef struct intset { uint32_t encoding; uin…
一直很羡慕那些能读 Redis 源码的童鞋,也一直想自己解读一遍,但迫于 C 大魔王的压力,解读日期遥遥无期. 相信很多小伙伴应该也都对或曾对源码感兴趣,但一来觉得自己不会 C 语言,二来也不知从何入手,结果就和博主一样,一拖再拖. 但正所谓,种一棵树的最好时间是十年前,其次就是现在.如果你真的想了解 Redis 源码,又有缘看到了这系列博文,何不跟着博主一起解读 Redis 源码,做个同行人呢?接下来,就让我们一起走入 Redis 的源码世界吧. 决定要读了,下一步就是如何读.从 github…
上次我们通过问题"启动服务器,程序都干了什么?",跟着源码,深入了解了 Redis 服务器的启动过程. 既然启动了 Redis 服务器,那我们就要连上 Redis 服务干些事情.这里我们可以通过 redis-cli 测试. 现在客户端和服务器都准备好了,那么Redis 客户端和服务器如何建立连接?服务器又是如何响应客户端的请求呢? 1 连接服务器 客户端和服务器进行通讯,首先应该就是建立连接.接下来,我们来看下 redis-cli 与服务器的连接过程. 还记得我们上次使用 gdb 调试…
继续我们上一节的讨论.服务器启动了,客户端也发送命令了.接下来,就要到服务器"表演"的时刻了. 1 服务器处理 服务器读取到命令请求后,会进行一系列的处理. 1.1 读取命令请求 当客户端与服务器之间的套接字因客户端的写入变得可读时,服务器将调用命令请求处理器执行以下操作: 读取套接字中的命令请求,并将其保存到客户端状态的输入缓冲区. 对输入缓冲区的命令请求进行分析,提取出命令请求中包含的命令参数及参数个数,然后分别将参数和参数个数保存到客户端状态的 argv 属性和 argc 属性里…
众所周知,Redis 服务器是一个事件驱动程序.那么事件驱动对于 Redis 而言有什么含义?源码中又是如何实现事件驱动的呢?今天,我们一起来认识下 Redis 服务器的事件驱动. 对于 Redis 而言,服务器需要处理以下两类事件: 文件事件(file event):Redis 服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象.服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列的网络通信操作. 时间时间(time event):Red…
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列ConcurrentQueue作为开篇来聊一聊它的实现原理. 话不多说,直奔主题. 要提前说明下的是,本文解析的源码是基于.NET Framework 4.8版本,地址是:https://referencesource.microsoft.com/#mscorlib/system/Collections/Concur…
前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 ReentrantLock 仍有其存在价值,例如可以感知线程中断,公平锁模式,可以指定超时时间的抢锁等更细粒度的控制都是目前的 synchronized 做不到的. 如果不是很了解 Java 中线程的一些基本概念,可以看之前这篇: Java读源码之Thread 案例 用一个最简单的案例引出我们的主角…
前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源码之ReentrantLock 源码分析 感知中断锁 如果我们希望检测到中断后能立刻抛出异常就用 lockInterruptibly 方法去加锁,还是建议用 lock 方法,自定义中断处理,更灵活一点. ReentrantLock#lockInterruptibly 我们只需要把 Reentrant…
作为一个程序员,经常需要读一些开源项目的源码.同时呢,读源码对我们也有很多好处: 1.提升自己 阅读优秀的代码,第一可以提升我们自身的编码水平,第二可以开拓我们写代码的思路,第三还可能让我们拿到大厂 offer.无论那种情况,优秀的代码就是提升我们开发水平的资粮,而把这些优秀的代码读懂.读透并不很容易. 2.修复 Bug 有些时候,我们用的一些开源组件,出现了一些预想不到的问题.而这时候,也没有前人经验可借鉴,也没有文档可供参考,只能靠自己修复.阅读代码,理解项目,才能顺利修复问题.如果阅读代码…
前言 相信大家都挺熟悉 CountDownLatch 的,顾名思义就是一个栅栏,其主要作用是多线程环境下,让多个线程在栅栏门口等待,所有线程到齐后,栅栏打开程序继续执行. 案例 用一个最简单的案例引出我们的主角 public class CountDownLatchDemo { public void run(CountDownLatch countDownLatch) { System.out.println(Thread.currentThread().getName() + "就位&quo…
✿ 需要掌握的编译器知识 ★ 编译器为eclipse为例子 调试准备工作(步骤:Window -> Show View ->...): □ 打开调试断点Breakpoint: □ 打开变量监视: 要看一个方法的内部细节,按f5,进入 要快速跳到某个位置[在目标位置上打个断点],然后按f8 观察方法的细节(执行流程),一步一步走,按f6 去除掉所有断点(编译器是eclipse) □ 注意看开始标记的执行位置对不对 f5调试的方式进入[若进入的是不相干的,按f7返回,再按f5进入一次] 举例: U…
死磕以太坊源码分析之EVM动态数据类型 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. Solidity提供了在其他编程语言常见的数据类型.除了简单的值类型比如数字和结构体,还有一些其他数据类型,随着数据的增加可以进行动态扩展的动态类型.动态类型的3大类: 映射(Mappings):mapping(bytes32 => uint256), mapping(address => strin…
目录 一.为什么需要对象池 二.使用姿势 2.1 同线程创建回收对象 2.2 异线程创建回收对象 三.数据结构 3.1 物理数据结构图 3.2 逻辑数据结构图(重要) 四.源码分析 4.2.同线程获取对象 4.3 同线程回收对象 4.4 异线程回收对象 4.5 从异线程获取对象 五.流程总结 5.1 同线程获取对象 5.2 同线程回收对象 5.3 异线程回收对象 5.4 从异线程获取对象 六.线程同步问题 七.防止资源泄露的措施 netty源码分析 - Recycler 对象池的设计 <nett…
Python3.7源码在windows(VS2015)下的编译和安装 下载官方源码,使用vs2015(WIN10SDK),最python3.7.0的源码进行编译,编译出不同的版本(release,debug),并配置python的运行环境(环境变量的配置). 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 VS版本:vs2015社区版(免费) 相关工具下载: VS版本vs2015社区版(免费) win10SDK(安装vs2015是可以选择,如果没有安装…
前言 在<TOMCAT源码分析——SESSION管理分析(上)>一文中我介绍了Session.Session管理器,还以StandardManager为例介绍了Session管理器的初始化与启动,本文将接着介绍Session管理的其它内容. Session分配 在<TOMCAT源码分析——请求原理分析(下)>一文的最后我们介绍了Filter的职责链,Tomcat接收到的请求会经过Filter职责链,最后交给具体的Servlet处理.以访问http://localhost:8080/…
[源码解析] PyTorch 分布式(3) ----- DataParallel(下) 目录 [源码解析] PyTorch 分布式(3) ----- DataParallel(下) 0x00 摘要 0x01 前向操作 1.1 并行 1.2 Gather 1.2.1 Python世界 1.2.2 C++世界 0x02 计算损失 0x03 后向传播 3.1 分发梯度 3.1.1 Gather.backward 3.1.2 Scatter 3.1.3 C++ 3.2 并行后向传播 3.3 归并梯度 3…
并发编程——ConcurrentHashMap#transfer() 扩容逐行分析 前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结构,之前的文章中,我们介绍了 putVal 方法.并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析.其中分析了 initTable 方法和 putVal 方法,但也留下了一句话: 这篇文章仅仅是 ConcurrentHashMap 的开头,关于 ConcurrentHashMap 里面的精华太多…
前言 JDK版本:1.8 阅读了Object的源码,wait和notify方法与线程联系紧密,而且多线程已经是必备知识,那保持习惯,就从多线程的源头Thread类开始读起吧.由于该类比较长,只读重要部分 源码 类声明和重要属性 package java.lang; public class Thread implements Runnable { private volatile String name; // 优先级 private int priority; //是否后台 private b…
前言 JDK版本: 1.8 之前在看Thread源码时候看到这么一个属性 ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocal实现的是每个线程都有一个本地的副本,相当于局部变量,其实ThreadLocal就是内部自己实现了一个map数据结构. ThreadLocal确实很重要,但想到看源码还是有个小故事的,之前去美团点评面试,问我如何保存用户登录token,可以避免层层传递token? 心想这好像是在说ThreadLocal,然后…
前言 最近发现 网上好多自己的博客,很多朋友转载了文章却不加下 原载地址,本文欢迎转载一起学习,请在目录出加上原出处,感谢.转载来自:博客(一枝花算不算浪漫) 看了前面几篇文章的小伙伴知道,前几天在学习设计模式,所以标题也是用的[一起学xxx],后面不出意外的话 都会使用这个标题了. 公司项目一直用的也是spring cloud,目前自己的水平仅仅也停留在使用阶段,所以最近用业余时间来学习下spring cloud相关组件. 文章打算采用连载的方式,欢迎大家批评指正. 项目结构 以下所有文章 源…
JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行. 由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,…
SQLite单表4亿订单,大数据测试 SQLite作为嵌入式数据库的翘楚,广受欢迎!新生命团队自2010年以来,投入大量精力对SQLite进行学习研究,成功应用于各系统非致命数据场合. SQLite极致性能 关闭同步,Synchronous=Off,提升性能.添删改操作时不必同步等待写入磁盘,操作系统会延迟若干毫秒批量写入 设置WAL模式,Journal Mode=WAL,减少锁定.写入向前日志模式,避免多线程访问时锁定数据库,写入时不必使用排它锁影响其它线程读取,而是把事务操作写入到WAL文件…
HTMLTestRunner 汉化版 20170925 测试报告完全汉化,包括错误日志的中文处理 针对selenium UI测试增加失败自动截图功能 增加失败自动重试功能 增加饼图统计 同时兼容python2.x 和3.x 20180402 表格样式优化 修复部分bug 增加截图组,可展示多张截图,首次打开自动播放 增加仅展示最后一次运行结果,多次重试时,每个测试用例仅展示一次 报告汉化 selenium 截图 截图功能根据测试结果,当结果为fail或error时自动截图 截图方法在_TestR…
上一篇我们介绍了查询规划模块的总体流程和预处理部分的源码.查询规划模块再执行完预处理之后,可以进入正式的查询规划处理流程了. 查询规划的主要工作由grouping_planner函数完成.在具体实现的时候,针对postgresql中独有的继承表,程序使用inheritance_planner函数来解决,该函数主要是先将继承表的继承关系变换为非继承表来处理,然后仍然调用的是grouping_planner函数来完成查询规划的工作. 因此,我们说查询规划的主要工作在于grouping_planner…
接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令. 原文地址:http://www.jianshu.com/p/e22615586595 看本篇文章前需要先对上面文章有所了解: redis源码分析之事务Transaction(上) 一.redis事务核心命令简介 redis事务操作核心命令: //用于开启事务 {"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0}, //用来执行事…