ProgrammingLearner的博客

待我编码有成

Redis源码剖析——数据库

数据库的实现 服务器状态rediServer结构体如下: struct redisServer { // 配置文件的绝对路径 char *configfile; // serverCron() 每秒调用的次数 int hz; ...

2018-05-21 15:06:06

阅读数 88

评论数 0

Redis源码剖析——有序集合对象

有序集合对象 有序集合的对象的编码可以为ziplist或者skiplist ziplist实现有序集合 当满足下面两个条件时,有序集合的底层数据结构为skiplist 1. 元素数量小于128个 2. 所有元素成员的长度都小于64字节...

2018-05-14 19:35:57

阅读数 337

评论数 0

Redis源码剖析——ziplist的实现

有序集合对象 ziplist为Redis中的压缩列表,是列表键和哈希键的底层实现之一,用于存储长度短的字符串和小整数。ziplist采用一段连续的内存来存储节点 ziplist的表示 因为ziplist的数据结构的长度是变化的所有没有特定的结构体,ziplist在内存中的布局如下 ...

2018-05-14 16:18:12

阅读数 144

评论数 0

Redis源码剖析——skiplist的实现

跳跃表skiplist 跳跃表是一种有序的数据结构,它通过用空间换时间,在每个节点中维持多个指向其他节点的指针,从而达到快速访问的目的。跳跃表插入、删除的平均复杂度为O(logN),最坏为O(N),可以和红黑树相媲美,但是在实现起来,比红黑树简单很多。 Redis使用跳跃表来实现有序集合对象 ...

2018-05-12 16:58:11

阅读数 151

评论数 0

Redis源码剖析——集合对象

集合对象 集合对象的编码可以为intset 或则 hashtable intset编码的的集合对象 当满足下面两个条件时,集合对象将使用intset编码 1. 集合对象的所有元素都是整数值 2. 集合对象的元素个数小于等于512 当执行命令 SADD numbers 1 2 3 4 时...

2018-04-30 15:04:53

阅读数 48

评论数 0

Redis源码剖析——哈希对象

哈希对象 哈希对象的编码可以为ziplist或者hashtable ziplist编码的哈希对象 满足下面两个条件时,哈希对象使用ziplist编码 1. 所有键值对的键和值的字符串长度都小于等于64字节 2. 键值对数量小于512 连续执行下面三个命令后 HSET profil...

2018-04-30 14:36:40

阅读数 52

评论数 0

Redis源码剖析——列表对象

列表对象 列表对象的编码为ziplist或linkedlist ziplist编码的列表对象 当满足下面两个条件时列表对象用ziplist编码 1. 列表对象保存的所有字符串元素的长度都小于等于64字节 2. 元素数量小于等于512 当执行RPUSH numbers 1 “three”...

2018-04-30 13:33:20

阅读数 35

评论数 0

Redis源码剖析——字符串对象

字符串对象 字符串对象有三种编码方式,int、raw、embstr int编码的字符串对象 对于int编码的字符串对象,为了节省内存,int将会占用ptr的空间,布局如图 raw编码的字符串对象 当字符串值的长度大于39字节时,字符串对象将用SDS来保存字符串值 如使用 SET...

2018-04-30 13:12:46

阅读数 34

评论数 0

Redis源码剖析——Redis五种基本对象

Redis五大对象 Redis使用对象来表示数据库中的键和值。 Redis有五种基本对象,分别为字符串对象、列表对象、哈希对象、集合、有序集合 对象的表示 Redis中的对象由RedisObject表示 typedef struct redisObject { // 类型...

2018-04-30 12:35:51

阅读数 43

评论数 0

Redis源码剖析——intset的实现

intset intset为Redis中的整数集合, 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。intset采用一段连续内存空间实现,默认采用16bit的整数,当新加入的整数16bit放不下时会对整个空间进行扩容,因为每加入/...

2018-04-12 13:18:33

阅读数 95

评论数 0

《Linux内核设计与实现》读书笔记——进程管理

进程管理 进程概念 进程:进程是处于执行期的程序以及相关资源的总称 线程:线程是进程中活动的对象。每个线程都有独立的程序计数器、进程栈和寄存器。内核调度的是线程而不是进程 内核并不区分进程和线程,只是创建时传递给创建函数的参数不一样 进程结构 进程队列组成双向循环链表,类型...

2018-04-09 13:07:18

阅读数 93

评论数 0

Redis源码剖析——dict的实现

dict 字典为Redis的基本数据结构之一有着非常广泛的用途,由哈希表实现。Redis的数据库由字典实现 基本结构 #define DICT_OK 0 #define DICT_ERR 1 // 指示字典是否启用 rehash 的标识 static int dict_can_re...

2018-04-06 14:24:22

阅读数 109

评论数 0

Redis源码剖析——adlist的实现

adlist adlist为Redis基本数据结构之一,为双向链表,记录了链表长度,adlist的迭代器记录了迭代节点和方向,个人觉得实现优于STL的list 几个重要结构 adlist实现比较精简,基本上写过链表相关的代码就能很快写出所有实现函数 /* * 双端链表节点 */ typ...

2018-03-31 14:24:14

阅读数 138

评论数 0

Redis源码剖析——SDS的实现

SDS的实现 SDS即简单动态字符串,为Redis的几大基本数据结构之一,有广泛的用途 基本函数总览 函数 功能 复杂度 sdsnewlen 由给定字符串创建SDS O(N) sdslen 返回字符串长度 O(1) sdsd...

2018-03-30 17:15:33

阅读数 73

评论数 0

Redis源码剖析——内存管理

开始阅读Redis3.0版本源码,并以此为剖析对象,因为此版本有注释,并且网上有文章,便于初学者学习参考,了解以前的版本才能更好地学习最新的4.x版本 内存管理 Redis的内存管理仅仅对malloc,,free做了一层封装,并未实现内存池,远没有STL的内存分配器巧妙 内存管理...

2018-03-28 17:13:47

阅读数 80

评论数 0

可变参数模板实现求n个数的最小公倍数

前几天面试CVTE的时候,面试官要手撸了个题,求三个数的最小公倍数,题目很简单,当时想炫技说我可以求任意多个数的最小公倍数,还是忍住了,很长时间没看了,怕装逼失败。。。。。。 回来后简单写了下,使用variadic templates,很简单,前面博客有介绍 代码如下: /* 可变参数...

2018-03-26 11:00:14

阅读数 51

评论数 0

Variadic templates

Variadic Templates可变参数模板,函数的参数可以有任意多个,参数的类型任意1. 实现函数递归调用实现打印任意多个不同类型参数#include <iostream> using namespace std;//无参数版本 void print() {}//n+1 个参数版...

2017-12-11 18:27:35

阅读数 105

评论数 0

STL源码剖析——RB_TREE

花了差不多一个星期的时间读完了STL红黑树的实现,并凭理解自己写了出来 参考了《算法导论》,教你透彻了解红黑树,强烈推荐,《STL源码剖析》 记录下自己的理解RB_TREE红黑树优点: 与BST相比插入,查找,删除在最坏情况下的复杂度仍为O(lgn),相比BST应用范围更广 STL容器se...

2017-12-09 20:19:01

阅读数 118

评论数 0

=default, =delete

=default, =delete=default如果自己定义了一个ctor,那么编译器就不会再合成一个default ctor 如果强制加上=default, 编译器就会合成一个default ctor=delete禁止编译器合成class Test { public: Test(in...

2017-12-05 18:02:11

阅读数 110

评论数 0

STL源码剖析——deque的实现

deque简介deque是一个双向开口的容器,可在头尾两端插入和删除元素,deque由动态的连续空间组合而成,因为迭代器的良好设计,提供了随机访问,造成一种deque为连续空间的假象deque的数据结构deque有一个二级指针map,map指向一小块空间,其中的每个元素都是指针,指向一段连续线性空...

2017-11-01 17:39:57

阅读数 240

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭