第一节 Redis前世今生
1、Redis产生背景
2、安装
2.1 找到官网下载链接
https://redis.io/download
2.2 在centos中使用wget下载
[root@npf01]#wget http://download.redis.io/releases/redis-5.0.8.tar.gz
-bash: wget: command not found
[root@npf01 resource]#
根据提示,当前wget命令未找到。所以我们需要先安装wget命令。
[root@npf01 resource]# yum install wget
接着安装下载 Redis 安装包。
2.3 解压 Redis 安装包
[root@npf01 resource]# tar -xvf redis-5.0.8.tar.gz
2.4 编译 & 安装 Redis
[root@npf01 resource]# cd redis-5.0.8
[root@npf01 redis-5.0.8]# pwd
/root/resource/redis-5.0.8
[root@npf01 redis-5.0.8]# make
cd src && make all
make[1]: Entering directory `/root/resource/redis-5.0.8/src'
CC Makefile.dep
...........
CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/root/resource/redis-5.0.8/src'
make: *** [all] Error 2
[root@npf01 redis-5.0.8]#
根据提示,cc 命令未找到。那么接下来我们安装 cc 命令。
[root@npf01 redis-5.0.8]# yum install gcc
然后再执行 make 命令,发现错误。
我们需要执行 make distclean 清楚我们第一次执行 make 命令遗留的残渣。
再次执行 make 命令。
[root@npf01 redis-5.0.8]# make
到这里,我们已经编译完成。其实到这里的时候,我们可以进入到 src 目录,可以看到可执行文件了,我们可以去执行,但是我们一般不会那么去干的。因为 src 目录下面还有源码,我们一般不会将源码和可执行文件放在一起的,可以接下来我们需要执行 install 命令,其实就是将 src 目录下面的可执行文件拷贝到一个我们想要的目录下面去的。根据 README.md 文档指示,我们需要执行如下命令。
执行命令 [root@npf01 redis-5.0.8]# make PREFIX=~/software/redis5 install
综上,其实我们已经安装好了 Redis,但是我们想在任何地方都可以快速的使用 Redis 的启动命令,这样的话,我们就需要配置环境变量。
[root@npf01 redis5]# vi /etc/profile
export REDIS_HOME=/root/software/redis5
PATH=$REDIS_HOME/bin:$PATH
export PATH
[root@npf01 redis5]# source /etc/profile
其实做了这么多,已经差不多了。但是我们使用 Redis 一般都是作为服务端,我们希望它可以作为守护程序自启动,那么接下来你应该这么做。
Redis 已经作为一个后台服务跑起来了。我们可以再通过其他命令去查看。
比如说我们要停止或者开启这个服务,可以使用如下命令:
3、研究 Redis 的线程模型
3.1 学会使用 strace 命令
现在我们停掉所有的 Redis 实例,然后使用 strace 命令去追踪启动后的 Redis 实例。
第一步:停掉 Redis 实例
第二步:在合适的位置建立一个合适的目录,例如:
第三步:运行如下命令:
[root@npf01 src]# pwd
/root/resource/redis-5.0.8/src
[root@npf01 src]# strace -ff -o /tmp/redisstrace/out ./redis-server
你将会看到:
第四步:我们在 straceredis目录下查看。
我们看到 Redis 进程号是 30577。进入 linux 的进程目录查看。
第五步:查看out.30577文件。
[root@npf01 redisstrace]# vi out.7618
查找 socket 函数。
socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) = 6
setsockopt(6, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
setsockopt(6, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(6, {sa_family=AF_INET6, sin6_port=htons(6379), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = 0
listen(6, 511) = 0
3.2 查看操作系统内核函数
3.2.1 socket 函数
[root@npf01 ~]# man 2 socket
3.2.2 bind 函数
[root@npf01 ~]# man 2 bind
例子程序:
3.2.3 select 函数
[root@npf01 ~]# man 2 select
3.3 Redis为什么快