/images/avatar.png

vs2017与vs2005冲突解决

先安装vs2005,后安装vs2017,vs2017无法运行 原因:vs2005注册了Microsoft.VisualStudio.Shell.Interop.8.0.dll,优先于vs2017需要的dll。导致运行错误。 解决方法: 复制 C:\Program_Files_(x86)\Microsoft_Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.Shell.Interop.8.0.dll 到 C:\Windows\assembly\GAC\Microsoft.VisualStudio.Shell.Interop.8.0\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Shell.Interop.8.0.dll

redis源码阅读-链表

C语言程序由于没有标准库的存在,各种造轮子。Redis为了满足需求,同样写了一个链表。

实现文件在adlist.h/adlist.c中。

结构体定义

和普通的C写的双向链表差不多。没有什么特点。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
typedef struct listNode {
    struct listNode *prev; // 前节点
    struct listNode *next; // 后节点
    void *value; // 值
} listNode;

// 迭代器
typedef struct listIter {
    listNode *next;// 下一个节点
    int direction;// 方向
} listIter;

typedef struct list {
    listNode *head; // 头
    listNode *tail; // 尾
    void *(*dup)(void *ptr); // 自定义节点复制函数
    void (*free)(void *ptr); // 自定义节点释放函数
    int (*match)(void *ptr, void *key); // 自定义节点匹配函数
    unsigned long len; // 链表长度
} list;

redis源码阅读-动态字符串sds

Redis没有使用c语言的字符串结构,自己设计了一个简单的动态字符串。特点是:修改时大小不足则扩容,大小足够直接使用不缩小。末尾使用‘\0’,与c语言字符串兼容。

sds的源代码在sds.h与sds.c中。

sds的定义

1
2
3
4
5
6
7
typedef char *sds;// 兼容C

struct sdshdr {
    unsigned int len;// 字符串长度
    unsigned int free;// 未分配的空间
    char buf[];// 末尾'/0'的C风格字符串
};// SDS的实际结构,兼容char*则返回buf地址

SDS这样设计的优点:

  1. 重用部分C字符串库函数的函数。
  2. 在常数复杂度的情况下获取字符串长度(以下代码)。
  3. 杜绝缓冲区溢出,通过获取空余空间函数,来进行处理(sdscat函数)。
  4. 减少字符串内存的重分配。不足则分配更大的空间,足够也不减少空间,而是记录新的len、free值。
  5. 二进制兼容。C字符串以空字符结尾,而某些二进制数据中间可能存在空字符。SDS兼容该种数据。

读书摘录-程序员的思维方式

2.2 德雷福斯模型的5个阶段

2017-01-24

但是,如果给新手提供与情境无关的规则去参照,他们就会变得能干起来。也就是说,需要这种形式的规则:“当X发生时,执行Y。”换言之,需要一份指令清单。 图2-2 玉米饼食谱,不过你知道需要烹饪多长时间吗 这就是呼叫中心的工作原理。你可以雇用一大批对当前技术没有很多经验的人,然后让他们按照一个决策树按部就班地执行下去。

3.3 L型和R型的特征

2017-02-06

事实上,综合是一项非常强大的学习技术,以至于麻省理工学院媒体实验室的尼葛洛庞蒂在Don’t Dissect the Frog, Build It [Neg94]中建议,真正想要了解一只青蛙,传统的解剖不是办法,更好的方式是构造一只青蛙。 也就是说,要求学生构造一个具有青蛙特征的生物。这是一种伟大的方式,可以真正了解到,什么使青蛙成之为青蛙,以及青蛙如何适应其特定环境。这是一个综合学习的绝佳例子。

4.4 收获R型线索

2017-02-08

这种方法为什么会起作用?我认为这是因为晨写让毫无防备的大脑倾倒想法。早上刚起床时,你还没有像你想的那样清醒。潜意识仍然占主角。你还没有提起所有防备,也还未适应有限的现实世界。你可以直接连通R型,至少一小会儿。

2017-02-08

你需要培养一种非目标驱动的思维方式。正如庞加莱所做,把一切都写在纸上(或者编辑器中,如果你必须得这么做的话),然后不去管它。不要试图思考。记住它,如布朗所说,不要关注它。只要简单地记住它。让事实和问题自由地搅和、浸泡(我们将在8.2节讨论这一话题)

redis源码阅读-内存分配

redis的内存分配主要就是对malloc和free进行了一层简单的封装。具体的实现在zmalloc.h和zmalloc.c中。

内存分配器的选择

redis支持多种内存分配器,可以选择的分配器tcmalloc、jemalloc、dlmalloc、malloc/malloc.h(apple),这几个分配器自带内存大小的记录。如果不进行设置,则默认使用malloc进行分配。

redis源码阅读-开始

自本博客之后的文章大概都是依照《Redis设计与实现》对Redis的源码进行阅读的记录。目的是为了对于Redis有一个了解,同时对之后需要使用Redis的项目上能够有所帮助。 Redis的介绍 redis是一个使用C编写的key-value数据库。性能极高且支持丰富的数据类型。它所有的操作都是原子性的。代码精简,只有3w行不到,利于阅读。 阅读顺序 如何阅读Redis源码?阅读的顺序主要还是按照黄建宏老师所建议的顺序进行阅读,暂时不看多机部分的实现。 阅读数据结构的实现。 阅读内存编码数据结构的实现。 阅读数据类型的实现。 阅读数据库实现相关代码。 阅读客户端和服务端相关代码。 至此将Redis阅读完毕。