Redis Makefile注解
Redis Makefile注解Redis的makefile是阅读源码的第一步,总共有292行,读起来也是头大,记录之。 4.02版本源码为: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771...
GCC的编译选项
GCC的编译选项Makefile 中的gcc的编译选项有很多,因此学习记录下。 这些选项在Makefile文件中常用CFLAGS(gcc 用在c语言的编译),CXXFLAGS(g++用在c++的编译)来表示。 程序编译的过程gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步: 1、预处理,生成 .i 的文件[预处理器cpp] 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs] 3、将汇编代码变为目标代码(机器代码)生成 .o 的obj文件[汇编器as] 4、连接目标代码, 生成可执行程序 [链接器ld] 选项 选项 释义 -c 只激活预处理,编译,和汇编。只把程序做成obj文件,不是可执行文件(因为没有链接,有的程序中也没有main入口) -S 只激活预处理和编译,就是只把文件编译成为汇编代码。生成.s的汇编代码 -E 只激活预处理,不生成文件,你需要把它重定向到一个输出文件里面 例子:gcc -E hello.c > pianoapan.txt -...
Linux shell脚本计算运行时间
Linux shell脚本计算运行时间这个功能经常用但是,总是现用现查,很麻烦。 代码 123456789101112131415161718192021222324252627282930313233343536# filename: msec_diff.shfunction timediff() {# time format:date +"%s.%N", such as 1502758855.907197692 start_time=$1 end_time=$2 start_s=${start_time%.*} start_nanos=${start_time#*.} end_s=${end_time%.*} end_nanos=${end_time#*.} # end_nanos > start_nanos? # Another way, the time part may start wit...
Redis源码阅读——字典
Redis源码阅读——字典字典是整个Redis实现的基础,之前把《Redis设计与实现》书上的理论知识看完了,开始阅读源码。 Rehash参考https://tech.meituan.com/2018/07/27/redis-rehash-practice-optimization.html https://luoming1224.github.io/2018/11/12/[redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0]redis%E6%B8%90%E8%BF%9B%E5%BC%8Frehash%E6%9C%BA%E5%88%B6/
gdb 调试
gdb调试以前学习过,用得少,又忘记了,现在刚好为了调试redis 的dict 模块,所以再次记录。 使用摘自参考<https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html>。 主要是补充实例 对C/C++程序的调试,需要在编译前就加上-g选项: 1$g++ -g hello.cpp -o hello 自己的Makefile里面修改成: 12dict-benchmark: dict.c sds.c siphash.c $(CC) -g -o $@ $^ 但是好像没加之前也是可以直接就使用gdb 了? 不知道为什么(可以使用但是出错不会显示所在的行,相当于没有调试) 调试可执行文件: 1$gdb <program> program也就是你的执行文件,一般在当前目录下。 调试core文件(core是程序非法执行后core dump后产生的文件): 12$gdb <program> <core dump file>$gdb program core....
Redis源码阅读——dict
Redis源码阅读——dict继续Redis 的源码阅读,进入dict这一章节。知识点讲解,见redis设计与实现的读书笔记dict这一章。 dict的创建还是和sds一样单独将dict模块给提取出来,参考博客是直接将server的main函数给修改了的。再阅读Makefile的时候发现了dict-benchmark 这个选项,make dict-benchmark 这个命令,可以编译出一个可执行文件dict-benchmark。 所以想着应该可以单独再把dict-benchmark给提取出来。 需要拷贝的文件 1dict.c ditc.h fmacros.h redisassert.h sdsaclloc.h sds.c sds.h siphash.c 需要做的修改 zmalloc zfree zcalloc 需要修改成使用malloc ,free, calloc 其中zcalloc在修改成calloc的时候需要在调用的时候多传入一个参数1,作为第一个参数,因为zcalloc 和calloc 的接口不一样。 还需要在redisassert.h 中对_serverAsser...
Docker 学习
Docker 学习之前一直听说容器可以免去配置环境的麻烦,但是一直没有机会接触,现在刚好有机会可以使用。 三大基础镜像、容器、仓库 类比的话:镜像是类(iso),容器是实例(操作系统),仓库类似于git的仓库。 镜像的构建是一层层的继承而来的,镜像和容器都是文件,容器退出的时候容器文件依然存在。除非手动使用-rm指定,才会删除。 从仓库下载镜像,加载镜像后进入容器,容器保存后构成镜像,镜像推送至仓库。 命令加载镜像,进入一个新的容器:docker run --name mydocker image:tag command 实例 摘自:https://yeasy.gitbooks.io/docker_practice/image/pull.html 123docker run -it --rm \ ubuntu:18.04 \ bash docker run 就是运行容器的命令 从镜像中新建一个容器 -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。 --rm:这个参数...
计算Linux系统的CPU利用率
计算Linux系统的CPU利用率通过读取系统的/proc/stat 信息来计算CPU的利用率 cpu 信息的读取摘自参考博客:https://blog.csdn.net/x_i_y_u_e/article/details/50684508 在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。 在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。 在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:ht...
Redis设计与实现读书笔记——第九章 数据库
Redis设计与实现读书笔记——第九章 数据库终于看到了服务器部分了,主要是想搞懂数据库的整个流程与架构。 9.1 服务器中的数据库将所有数据库都保存在redis.h/redisServer结构的db数组中(哇,不可思议用数组来保存的),db数组每个项都是一个redis.h/redisDb结构指针,而一个redisDb代表了一个数据库。
Redis设计与实现读书笔记——第8章 对象
Redis设计与实现读书笔记——第8章 对象Redis 并没有直接使用sds、dict等数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象, 每种对象都用到了至少一种前面所介绍的数据结构。 简介对象的好处: 根据对象的类型来判断是否可以执行给定的命令。 针对不同的使用场景, 为对象设置多种不同的数据结构实现, 从而优化对象在不同场景下的使用效率。 对象的特性: 基于引用计数技术的内存回收机制(和java的是否原理相似) 通过引用计数技术实现对象共享机制,多个键共享同一个对象来节约内存 带有访问时间记录信息,可以用来删除空转时长较大的键 8.1 对象的类型与编码Redis 使用对象来表示数据库中的键和值,创建一个新的键值对的时候,至少包含两个对象:1. 键对象 2. 值对象 对象都由一个 redisObject 结构表示,保存数据相关的属性 123456789101112131415typedef struct redisObject { // 对象类型...













