- 序言
Redis 作者是意大利的Salvatore Sanfilippo(antirez),antirez是他的艺名。现在他已经被VMWare招安去安心做redis。不知道他是喜欢意大利歌女Alessia Merz还是十分讨厌,反正他把redis的默认端口设置为了6379,是手机按键上MERZ对应的号码。把端口号设置成美女的名字充满了性意向,也反映了程序员这个群体的空虚寂寞冷。
图中就是Alessia Merz
Redis的作者在2009年三月六日,星期五,在自己发表了一篇博客,在这篇博客里提到了他的redis。此时的redis 连0.1的版本都不是,只是一个beta 4的版本。
我们将要从最底下的那个版本讲起。
这个版本的redis logo 实在不怎么好看。
“我想这是我第一次在这个博客上谈到redis,但希望不是最后一次。
Redis 将是我明年hacking sessions 的主要目标,但愿这个能够实现。
Redis 到底是干什么的呢?它是key-value数据库。但它和memcachedb(memcached的一个持久化版本)以及其他类似数据库有一些不同。例如许多key-value数据库都可以这样操作:
SET mykey foobar
GET mykey
DEL mykey
这使的这一类不需要加锁的计算更加容易,比如set-if-not-exists操作等等。Redis的特色是不但可以有字符串类型的数据,还可以存储List Set等数据结构。
LPUSH user_100_messages "Indeed, you are right!"
LPUSH user_100_messages " .... "
LRANGE user_100_messages 0 10
前两个操作是将元素放入链表中,最后一个操作是显示这个链表中的前10个元素。同样还可以对Sets 进行类似的增删改查操作,以及几个集合求并集等。“
这是摘录并翻译自作者博客中一段话。可以清楚地看到redis的目标是成为一个数据结构服务器,给程序员提供最大的方便,弥补关系型数据库的不足,而这样的数据库的源代码对于初入行的程序员还是多年的老水手都有借鉴的地方。
对于初入行的程序员最大的好处在于如何把校园里学到的数据结构变成一个优秀的轮子,把自己的理论知识近乎无缝地落到实践中。然而直接看完美的源代码并不能学到什么,只有经历了一个轮子创造过程中的坑才能学好编码。
所以就想到把redis 1.0 到redis 3.0 的变迁过程中自以为有点参考意义的更新,修改bug修正记录下来,来抛砖引玉。
作者自己博客的第一次提到他的redis
redis google code
- 第一章 测试一下redis作者第一个beta版本
因为redis的版本都只能在linux上运行,所以需要linux环境,如果是Mac 或者linux系统可以略过下边的内容,如果是windows可以参考一下。
首先我们需要获得一个虚拟机。笔者使用的是VMware workstation 12player ,是VMware的桌面免费版本,简洁而又很好用。
下载完成后
还需要下载linux,笔者选用了ubuntu的最新版本,Ubuntu 14.04.1 LTS。
ubuntu下载地址
选择用于开发者这个版本。
先安装vmware,安装后打开如下图。
再创建虚拟机,选择将虚拟机存储为单个文件,因为就实验用一下,依个人喜好。
ubuntu14运行起来想流畅些,内存要多给些。
安装好ubuntu,打开terminal,使用wget命令下载redis beta1的源文件,这个链接需要翻墙。
http://redis.googlecode.com/files/redis-beta-1.tar.gz
redis的旧版本都在google code上的
http://code.google.com/p/redis/
用
tar -xvf redis-beta-1.tar.gz
来解压缩。
然后输入 make 命令进行编译,然后你就拥有redis了就这么简单。
输入
./redis-server
就可以运行了
然后再打开一个终端窗口。然后到刚才编译redis的目录下
make test
结果中有一个error,这个bug会在接下来的过程中讲解一下,然后修正它。
当然这是自动测试的脚本,是调用了test-redis.tcl这个tcl脚本。
我们也可以用telnet 连接到redis上
telnet locahost 6379
然后输入
lrange mylist 0 10
会得到刚才make test 插入的链表里的值。
待续,接下来会写一些redis的基本使用和redis的架构详解。
写这个的时候已经是好几年前了,如果让我重新去写,我会选择用云来弄个机器来处理这个这个内容,但是基本没什么太大必要。
后边我自己也会用云上的虚拟机来接续接下来的内容。
https://download.redis.io/releases/redis-beta-1.tar.gz
//注释之间的内容,因为没有及时保存,在触发win10虚拟内存蓝屏bug的时候,丢失了
第一章:C语言基础知识
编程的本质和所有的工作都是相同的,是对资源的管理,只是程序员管理的资源是CPU、内存、I/O(包括硬盘和网络)。
CPU的管理可以阅读《编程之美》,这本书中有关CPU的利用,比如让任务管理器中CPU利用率画正弦曲线等。
对于redis来讲,内存管理才是它的核心,那么接下来要略微讲解一下内存管理中的核心问题边界问题。下面展示一段非常简单的代码,触发win10虚拟内存蓝屏bug。
这段代码没别的作用,就是不停申请内存,然后用cygwin下的gcc进行了编译,linux生成a.out,但是windows下gcc生成的文件是a.exe,同理linux的so文件对应的就是windows下的dll文件。
这段代码会导致windows 10死机,没法截屏,只能靠手机拍摄的视频给大家欣赏一下,录得不好,但是真的不想再蓝屏一次了,凑合看一下吧。
两行代码触发win10蓝屏bug
插播广告:蓝屏的钙好喝的钙
//注释之间的内容,因为没有及时保存,在触发win10虚拟内存蓝屏bug的时候,丢失了
这就是经典的内存溢出,忆初往往让你悔不当初,
要略微详细的说一下这个函数,malloc,如果要使用这个函数你要在文件头部引用 <stdlib.h>,细节看C的教程吧,这个教程只关心与数据库有关环节的内容。
还有一个经典的内存操作不当问题,就是越界访问,这是指针带来的一个问题之一。也是两行代码展示一下这个问题。
指针通过移动,访问到了一些意想不到的地址的内容,就出现了一个乱码,如果用VC来弄,会出来“烫烫烫”
redis main函数