自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(242)
  • 资源 (7)
  • 收藏
  • 关注

原创 Redis源码剖析--源码结构解析

找工作那会儿,看了黄建宏老师的《Redis设计与实现》,对redis的部分实现有了一个简明的认识。在面试过程中,redis确实成为了面试官考核我的一个亮点,恰好以后的工作又与redis有着千丝万缕的联系,于是就想趁着毕业前的这段时间把redis的源代码研究一下,为以后的工作打个良好的基础。 Redis简介redis全称REmote DIctionary Server,是一个由Salvatore S

2016-12-09 17:11:54 1799

原创 记录生活,记录学习----我的2016

过着2017年的日子,思考着2016年人生的变化,或许,最大的变化是懂得记录学习,记录生活吧。2016年,博客进入了我的生活,从年初的寥寥数篇博客,到现在CSDN积累了200多篇,也许是因为「过于勤奋」,CSDN给了我博客专家的称号。博客地址:Zeecoder’s CSDN Blog2016年,无意中发现了Hexo博客这个非常Geek的写博方式,于是,热衷于折腾的我动手搭建了自己的hexo博客。博客

2017-01-08 16:11:07 4782 6

原创 Redis源码剖析--列表list

上一篇博客Redis源码剖析–快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理。Redis对外开放的列表list结构就是采用quicklist作为底层实现(在新版本的Redis源码中,不再采用ziplist和sdlist两种结构,而是统一采用quicklist)。有关列表键的实现源码在t_list.c文件中,大家可以边看源码边看这篇博客,一起来理解。List概述其实在[Redi

2016-12-20 22:42:58 1490

原创 Redis源码剖析--快速列表quicklist

在RedisObject这一篇博客中,有介绍到list结构的底层编码类型有OBJ_ENCODING_QUICKLIST,当时就发现这个底层数据结构被我遗漏了。昨天花了点时间补了补这个知识,看完发现这货就跟STL中的deque的思想一样,顿时觉得又是一个实现超级繁琐但很实用的数据结构。今天就带大家一起来看看这个“二合一”的数据结构。 quicklist是Redis在3.2版本加入的新数据结构,其是

2016-12-20 22:42:23 4606 1

原创 Redis源码剖析--字符串t_string

前面一直在分析Redis的底层数据结构,Redis利用这些底层结构设计了它面向用户可见的五种数据结构,字符串、哈希,链表,集合和有序集合,然后用redisObject对这五种结构进行了封装。从这篇博客开始,带你一点点分析五种数据类型常见命令对应的源码实现,慢慢地解开Redis的面纱。字符串概述字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds,因此,该字符串类型是二进制安全

2016-12-20 22:41:47 1468

原创 Redis源码剖析--对象object

前面一系列的博客分析了Redis的基本数据结构,有动态字符串sds、双端链表sdlist、字典dict、跳跃表skiplist、整数集合intset和压缩列表ziplist等,这些数据结构对于用户来说是不可见的。Redis在这些数据结构的基础上构建了对用户可见的五种类型,分别是string、hash、list、set和zset,为了更方便的使用这五种数据类型,Redis定义了RedisObject结

2016-12-15 16:32:46 2682

原创 Redis源码剖析--整数集合Intset

本系列博客文章已经分析了Redis的大部分数据结构,包括动态字符串,双端链表,字典,跳跃表等,这些数据结构都非常强大实用,但是在内存消耗方面也非常“巨大”。Redis的数据都是存放在内存上面的,所以对内存的使用要求及其苛刻,Redis会想方设法的来节省内存。假设有一组集合1,2,3,6,5\\{1,2,3,6,5\\},如果采用上述的数据结构来存储的话,必然会付出昂贵的内存代价,因此,Redis在这

2016-12-09 20:10:41 1211

原创 Redis源码剖析--基数统计hyperloglog

Redis中hyperloglog是用来做基数统计的,其优点是:在输入元素的数量或者体积非常非常大的时候,计算基数所需的空间总是固定的,并且是很小的。在Redis里面,每个Hyperloglog键只需要12Kb的大小就能计算接近2^64个不同元素的基数,但是hyperloglog只会根据输入元素来计算基数,而不会存储元素本身,所以不能像集合那样返回各个元素本身。基数统计什么是基数呢?基数是指一个集合

2016-12-09 20:10:18 3758 1

原创 Redis源码剖析--跳跃表zskiplist

跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问的目的。跳跃表在插入、删除和查找操作上的平均复杂度为O(logN),最坏为O(N),可以和红黑树相媲美,但是在实现起来,比红黑树简单很多。> 说起跳跃表,在前段时间面试中可帮了我的大忙。腾讯一面的时候面试官要求设计一个数据结构,里面的元素要求按一定顺序存放,能以最低的复杂度获取每个元素的名次,且增、删等操作的复

2016-12-09 20:09:55 1181

原创 Redis源码剖析--字典dict

字典是Redis中的一个非常重要的底层数据结构,其应用相当广泛。Redis的数据库就是使用字典作为底层实现的,对数据库的增、删、查、改都是建立在对字典的操作上。此外,字典还是Redis中哈希键的底层实现,当一个哈希键包含的键值对比较多,或者键值对中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。Redis中的字典采用哈希表作为底层实现,在Redis源码文件中,字典的实现代码在

2016-12-09 20:09:26 1110

原创 Redis源码剖析--双端链表Sdlist

请持续关注我的个人博客:https://zcheng.ren今天来分析Redis的一个基本数据结构–双端链表,其定义和实现主要在sdlist.h和sdlist.c文件中。其主要用在实现列表键、事务模块保存输入命令和服务器模块,订阅模块保存多个客户端等。 # sdlist的数据结构Redis为双端链表的每一个节点定义了如下的结构体。// 链表节点定义typedef struct listNo

2016-12-09 17:23:02 1022

原创 Redis源码剖析--动态字符串SDS

请持续关注我的个人博客:https://zcheng.renRedis没有使用C语言的字符串结构,而是自己设计了一个简单的动态字符串结构sds。它的特点是:可动态扩展内存、二进制安全和与传统的C语言字符串类型兼容。下面就从源码的角度来分析一下Redis中sds的实现。(sds的源码实现主要在sds.c和sds.h两个文件中)# sds数据结构定义在sds.h文件中,我们可以找到sds的数据结构定

2016-12-09 17:19:50 2139

原创 Redis源码剖析--内存分配

请持续关注我的个人博客:https://zcheng.ren深受侯捷老师的《STL源码剖析》一书的影响,在该书中开篇就对STL的空间配置器进行了一个详尽的介绍。以应用的角度而言,空间配置器是最不需要介绍的,它总是隐藏在一切组件的背后;可是,就源码分析而言,空间配置是最为关键的,也是分析源码之路的第一步!Redis在内存分配方面,仅仅是对系统的malloc/free做了一层简单的封装,然后加上了异常

2016-12-09 17:18:28 2100 1

原创 带你深入理解STL之Set和Map

在上一篇博客中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来“乘凉”了。STL的set和map都是基于红黑树实现的,和stack和queue都是基于deque一样,它们仅仅是调用了RBTree提供的接口函数,然后进行外层封装即可。本篇博客理解起来比较轻松,set和map的源代码也不多,大家可以慢慢“品味

2016-09-09 15:28:47 11263 2

原创 带你深入理解STL之RBTree

最近一直忙于校招的笔试,STL的深入理解系列也耽搁了好几天,再加上!红黑树真的是超级超级难理解,超级超级复杂,参考了好多博客上的大神的理解才稍微明白一点,勉强入个门,下面请以一个菜鸟的角度跟着我一起学习STL的红黑树吧。概述红黑树是平衡二叉搜索树的一种,其通过特定的操作来保持二叉查找树的平衡。首先,我们来复习一下二叉查找树的知识,建议如果对二叉查找树不理解的先去搜一下相关博客来了解一下。二叉搜索树是

2016-09-06 14:55:54 7762 2

原创 腾讯2017暑期实习生笔试题解题答案汇总

构造回文题目给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子: abcda google输出例子: 2 2解题思路本题可

2016-09-03 15:56:52 5507 1

原创 带你深入理解STL之Stack和Queue

上一篇博客,带你深入理解STL之Deque容器中详细介绍了deque容器的源码实现方式。结合前面介绍的两个容器vector和list,在使用的过程中,我们确实要知道在什么情况下需要选择恰当的容器来满足需求和提升效率。一般选择的准则有如下几条:如果需要随机访问一个容器,vector比list要好如果需要经常插入和删除操作的话,list比vector要好如果既要随机存取,又要关心两端数据的插入和删

2016-08-26 21:51:19 4549 1

原创 带你深入理解STL之Deque容器

在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点。vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间。但是其在分配的内存不够的情况下,需要对容器整体进行重新分配、拷贝和释放等操作,而且在vector中间插入或删除元素效率很低。而list是以节点形式来存放数据,使用的是非连续的内存空间来存

2016-08-26 11:43:24 15008 6

原创 带你深入理解STL之List容器

上一篇博客中介绍的vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,很好的支持了随机存取,但由于是连续空间,所以在中间进行插入、删除等操作时都造成了内存块的拷贝和移动,另外在内存空间不足时还需要重新申请一块大内存来进行内存的拷贝。为了克服这些缺陷,STL定义了另一种容器List,它对于数据插入和删除的时间复杂度均为O(1),而且再内存方面不用频繁的拷贝转移。下面,就一起来看看Lis

2016-08-24 17:29:27 5491 1

原创 带你深入理解STL之Vector容器

C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便。STL实现了一个Vector容器,该容器就是来改善数组的缺点。vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮

2016-08-23 17:51:55 4114 2

原创 GDB调试工具入门

从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试。于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。GDB概述GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大

2016-08-23 14:16:57 967

原创 C/C++的mem函数和strcpy函数的区别和应用

mem系列函数是面试的时候常考的知识点,我们需要熟练掌握这三个函数的原理和代码实现,要能准确无误的写出代码。memcpy、memset和memset三个函数在使用过程中,均需包含以下头文件://在C中#include <string.h>//在C++中#include <cstring>memcpymemcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,

2016-08-23 14:16:14 650

原创 带你深入理解STL之迭代器和Traits技法

在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器。//对于int类的求和函数int sum(int *a , int n){ int sum = 0 ; for (int i = 0 ; i < n ; i++) { sum += *a++; } return sum;}//对于listNode类的求和函数struc

2016-08-23 08:58:15 6463 11

原创 【一天一道LeetCode】#303.Range Sum Query - Immutable

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道leetcode系列依旧在csdn上继续更新,除此系列以外的文章均迁移至我的个人博客 另外,本系列文章已整理并上传至gitbook,网址:点我进 欢迎转

2016-08-22 20:27:22 1130

原创 【一天一道Leetcode】#190.Reverse Bits

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道leetcode系列依旧在csdn上继续更新,除此系列以外的文章均迁移至我的个人博客 另外,本系列文章已整理并上传至gitbook,网址:点我进 欢迎转

2016-08-22 20:02:32 1166

原创 带你深入理解STL之空间配置器(思维导图+源码)

前不久把STL细看了一遍,由于看得太“认真”,忘了做笔记,归纳和总结这步漏掉了。于是为了加深印象,打算重看一遍,并记录下来里面的一些实现细节。方便以后能较好的复习它。以前在项目中运用STL一般都不会涉及到空间配置器,可是,在STL的实现中,空间配置器是重中之重,因为整个STL的操作对象都存放在容器之内,而容器一定需要配置空间以置放资料。所以,在阅读STL源码时,最先需要掌握的就是空间配置器,没了它,

2016-08-19 08:27:29 3807 5

原创 【数据结构和算法】全面剖析树的各类遍历方法

面试中常考到树的前序,中序,后序和层序遍历,这篇博文就带你深度剖析一下二叉树的各类遍历算法的实现二叉树的遍历主要有四种,前序、中序、后序和层序遍历的实现方式主要是:递归和非递归递归遍历的实现非常容易,非递归的实现需要用到栈,难度系数要高一点。一、二叉树节点的定义二叉树的每个节点由节点值、左子树和右子树组成。class TreeNode{public: int val; TreeNo

2016-08-11 15:10:52 15173 3

原创 C++对象模型的那些事儿之六:成员函数调用方式

前言C++的成员函数分为静态函数、非静态函数和虚函数三种,在本系列文章中,多处提到static和non-static不影响对象占用的内存,而虚函数需要引入虚指针,所以需要调整对象的内存布局。既然已经解决了数据,函数等在内存中的布局问题,下一个需要考虑的就是如何调用,上述提到的三种函数的调用机制都不一样,其间的差异正是本篇博客需要讨论的。非静态成员函数C++的设计准则之一就是:非静态成员函数至少必须和

2016-08-11 15:09:50 1682

原创 C++对象模型的那些事儿之五:NRV优化和初始化列表

前言在C++对象模型的那些事儿之四:拷贝构造函数中提到如果将一个对象作为函数参数或者返回值的时候,会调用拷贝构造函数,编译器是如何处理这些步骤,又会对其做哪些优化呢?本篇博客就为他家介绍一个编译器的优化操作:NRV,以及关于初始化列表的一些容易踩的“坑”!NRVNRV是named Return Value的缩写,翻译过来就是具名返回值优化,这个优化到底在编译层干了些什么事,我们先来看个例子:clas

2016-08-11 15:09:33 685

原创 C++对象模型的那些事儿之四:拷贝构造函数

前言对于一个没有实例化的空类,编译器不会给它默认生成任何函数,当实例化一个空类后,编译器会根据需要生成相应的函数。这类函数包括一下几个:构造函数拷贝构造函数析构函数赋值运算符在上一篇博文C++对象模型的那些事儿之三:默认构造函数中讲到,编译器在需要的时候会合成一个空构造函数。本篇博文中就重点来介绍一下第二主角:拷贝构造函数。引子正如Linus Torvalds说的一句话:“Talk is

2016-08-11 15:09:02 818

原创 C++对象模型的那些事儿之三:默认构造函数

前言继前两篇总结了C++对象模型及其内存布局后,我们继续来探索一下C++对象的默认构造函数。对于C++的初学者来说,有如下两个误解:任何class如果没有定义default constructor,就会被合成出来编译器合成出来的default constructor会显示设定“class内每一个data member的默认值“如果读者对这两句话理解颇深,了解里面的陷阱,那么可以不必阅读下去;倘

2016-08-11 15:08:31 687 1

原创 C++对象模型的那些事儿之二:对象模型(下)

前言上一篇博客C++对象模型的那些事儿之一为大家讲解了C++对象模型的一些基本知识,可是C++的继承,多态这些特性如何体现在对象模型上呢?单继承、多重继承和虚继承后内存布局上又有哪些变化呢?多态真正的底层又是如何实现呢?本篇博客就带大家全面理解一下C++对象模型,从而理解上述疑惑。引例还是以上篇博客的Animal类说起,假设我们有一个Dog类,它继承了Animal类。程序如下:class Anima

2016-08-11 15:07:40 1050 2

原创 C++对象模型的那些事儿之一:对象模型(上)

前言很早以前就听人推荐了《深入理解C++对象模型》这本书,从年初买来到现在也只是偶尔翻了翻,总觉得晦涩难懂,放在实验室上吃灰吃了好久。近期由于找工作对C++的知识做了一个全面系统的学习,基础相对扎实了不少,于是,又重新拿起这本书,突然觉得里面的知识也不那么难懂,而且越看越有意思,不愧是C++高阶教程啊!耐着性子,抓着头皮花了两个多月,总算对其中的知识有了一些理解,部分章节反反复复的看,每次都有新的收

2016-08-11 15:06:50 1202 3

原创 【一天一道Leetcode】#203.Remove Linked List Elements

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道leetcode系列依旧在csdn上继续更新,除此系列以外的文章均迁移至我的个人博客 另外,本系列文章已整理并上传至gitbook,网址:点我进 欢迎转

2016-08-06 22:01:29 735

原创 【一天一道LeetCode】#290. Word Pattern

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Given a pattern and a string str, find if str follows the same pattern. Here follow means a ful

2016-07-29 11:37:09 698

原创 【一天一道LeetCode】#219. Contains Duplicate II

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Given an array of integers and an integer k, find out whether there are two distinct indices i and

2016-07-29 11:26:34 616

原创 【一天一道LeetCode】#257. Binary Tree Paths

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Given a binary tree, return all root-to-leaf paths. For example, given the following binary tre

2016-07-25 23:37:41 689

原创 【一天一道LeetCode】#205. Isomorphic Strings

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the

2016-07-21 21:59:47 581

原创 【一天一道LeetCode】#223. Rectangle Area

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is de

2016-07-20 21:52:20 1460

原创 【一天一道LeetCode】#225. Implement Stack using Queues

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处(一)题目 Implement the following operations of a stack using queues. push(x) – Push element x onto

2016-07-20 20:38:17 1445

【Visual C++】游戏编程代码\【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)

【Visual C++】游戏编程代码\【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神) 配套代码

2015-03-21

【Visual C++】游戏编程学习笔记之八:2D游戏小demo

【Visual C++】游戏编程学习笔记之八:2D游戏小demo 的配套代码,欢迎下载使用。

2015-03-18

【Visual C++】游戏编程学习笔记之七:键盘输入消息

【Visual C++】游戏编程学习笔记之七:键盘输入消息 配套代码

2015-03-15

【Visual C++】游戏编程代码\【Visual C++】游戏编程开发笔记六:多背景循环动画

【Visual C++】游戏编程代码\【Visual C++】游戏编程开发笔记六:多背景循环动画 配套代码

2015-03-14

【Visual C++】游戏编程笔记四:透明动画实现

【Visual C++】游戏编程笔记四:透明动画实现 配套代码

2015-03-14

【Visual C++】游戏编程学习笔记五:单一背景滚动

本代码配合ZeeCoder的【Visual C++】游戏编程学习笔记五使用。

2015-03-13

PCI入门资料

该文档包括PCI入门开发的一些知识,简要的介绍了一个pci规范。。

2013-10-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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