Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用 ANSI C 语言编写、支持网络、基于内存但也可持久化的高性能 Key-Value 数据库,它提供多种语言的API。
1 Redis 安装与运行
1.1 安装
Redis 的安装有两种方式,一种是从源码编译安装,一种是通过系统自带的软件源进行安装,但官方推荐第一种,因为软件源中的版本通常比较旧。另外 Redis 的源码包非常小,只有 2M 左右,编译起来不会耗费太多时间。
目前 redis 最新版本为 6.0.5,但在实际编译过程中,由于我们选用的 CentOS 系统安装的 gcc 版本较低(4.8.5),编译会遇到错误。因此要么使用版本 5 的 Redis,要么升级 gcc 版本(>=4.9)。我们这里选择前者。
1.1.1 下载
首先下载 Redis 的最新稳定版本:
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
1.1.2 编译
tar xvzf redis-5.0.8.tar.gz
cd redis-5.0.8
make
1.1.3 可能遇到的错误
1)没有安装编译环境
如果没有安装编译环境的话,编译会遇到错误:
安装编译环境:
yum install gcc
这时如果直接执行 make 编译的话仍然会遇到错误:
如果搜索错误相关信息 “redis jemalloc”的话,多数答案会说这是系统没有安装 jemalloc 的问题,并提供错误的解决方案:
make MALLOC=libc
上面的编译参数将 jemalloc 替换为了 libc,这是存在隐患的,首先我们要知道 redis 是需要使用内存分配器的, make MALLOC=jemalloc 就是指定内存分配器为 jemalloc ,make MALLOC=libc 就是指定内存分配器为 libc ,而 jemalloc 内存分配器在实践中处理内存碎片要比 libc 更好,而且在 README.md 文档也说明到了,jemalloc 内存分配器也是包含在源码包里面的,可以在 deps 目录下看到 jemalloc 目录。
实际上出现这个错误这是因为在安装 gcc 前执行的 make 编译操作失败了,有残留的错误文件,我们只需要清理一下就可以了再次编译了:
make distclean && make
2)库文件链接错误
上面的步骤都做完后,还可能遇到编译不通过的情况:
"/usr/bin/ld: cannot find -latomic"
latomic 代表的是 libatomic.so,也即是在编译的过程中,需要 libatomic.so 库,而系统又找不到这个库;
解决方法是手动找到这个库,可能存在如下几种情况:
1、系统中没有安装依赖库 libatomic.so,通过执行 find / -name "libatomic.so*" 来确认。
如果没有的话,在软件源中搜索相关的软件包:
yum list |grep libatomic
解决方法:通过执行 yum -y install libatomic libatomic_ops-devel 安装相关依赖。
2、系统中没有 libatomic.so 这个库,但是找到类似 libatomic.so.1.2.0 这种带版本号的库,通过执行 find / -name "libatomic.so*"来确认:
解决方法:使用软链接的方法将依赖库libatomic.so链接到正确路径,执行如下命令:
ln -s /usr/lib64/libatomic.so.1.2.0 /usr/lib/libatomic.so
再执行 make 编译,问题解决。
这时在 src 目录中能够看到已经编译好的 redis 可执行文件:
cd src
ls
redis-server:Redis 服务本身
redis-sentinel:Redis Sentinel 集群可执行程序(用于监控和故障转移)
redis-cli: Redis 命令行客户端程序
redis-benchmark: 检测 Redis 性能的工具
redis-check-aof 和 redis-check-rdb (Redis 版本 3.0 及以下为 redis-check-dump):为极少数数据损坏情况下的有力工具
1.2 运行
如果只是为了了解和测试 Redis 的话,直接执行 .\redis-server 即可运行一个 Redis 实例,默认监听在 6379 端口。但如果是将 Redis 用于更正式的环境,则需要进行一定的配置:
1)首先将 redis-server 和 redis-cli 复制到系统可执行文件目录下(通常是 /usr/local/bin),这样执行时不需要切换到编译目录即可执行;另外也可以在编译时使用 make install 命令进行安装达到同样目的。
2)准备一个适当的 Redis 配置文件,在源代码根目录有一个示例(redis.conf),可以根据实际需求进行修改,下面是 redis.conf 配置参数说明:
# Redis 配置文件示例
#
# 注意:要使 Redis 运行时读取本配置文件的话,需要在运行时指定配置文件路径:
# ./redis-server /path/to/redis.conf
# 当涉及到内存大小时,可以使用常用单位例如 1k 5GB 4M 等等,单位换算如下:
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
# 以上单位不区分大小写,所以 1GB 1Gb 1gB 都是同一个意思。
################################## 包含 ###################################
# include 指令的意思是包含其它配置文件,当有多个 Redis 服务需要配置,但其中少数参数有区
# 别时,则可以将公共的配置放入到一个公共的配置文件中,然后通过子配置文件引入父配置,从而
# 将配置按照模块分开。
#
# 注意:“include” 指令不受来自 admin 或 Redis Sentinel 的 “CONFIG REWRITE” 影响(不会
# 被重写)。
# 如果存在多个相同指令的不同参数设置,Redis 总是使用最后一次的设置,因此你最好把 “include” 放在
# 文件的开始处,以避免在运行时被后面的文件重写。 如果相反,你希望使用 “include” 来覆盖这些
# 配置选项,则最好把它放在配置文件末尾。
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## 模块 #####################################
# 在启动时加载模块,如果加载失败则启动过程终止。可以同时加载多个模块。
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## 网络 #####################################
# 默认如果没有 "bind" 指令设置的话, Redis 默认监听所有接口。可以使用 "bind" 监听
# 指定网络接口。可以同时指定一个或多个 IP 地址。
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ 警告 ~~~ 如果 Redis 所在服务器直接暴露在互联网,那么监听所有网络接口是一件
# 危险的事情。所以默认我们在下面设置了只监听环回地址,当然如果你明确了解了这些配置
# 的含义,你可以自行调整配置参数。
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
# 保护模式是一种安全保护,目的在于避免 Redis 实例暴露在互联网遭到未授权访问和攻击。
# 当保护模式开启时,如果:
# 1) 服务器没有使用 "bind" 指令明确监听某个接口。
# 2) 服务器没有设置访问密码。
# 那么服务器仅接收来自 127.0.0.1(IPv4) 和 ::1(IPv6), 以及 Unix domain sockets
# 的连接。
#
# 保护模式默认开启。
protected-mode yes
# 指定监听端口,默认为 6379。
# 如果指定了端口 0,则代表 Redis 不监听任何 TCP 协议。
port 6379
# TCP listen() backlog.
#
# 在高并发的场景你可能需要设置一个较高的 backlog 参数来避免客户端连接问题。注意
# Linux 内核对并发连接数也有限制,通常在 /proc/sys/net/core/somaxconn。所以需
# 要同时调高 somaxconn 和 tcp_max_syn_backlog 参数。
tcp-backlog 511
# Unix socket.
#
# 监听 Unix socket, 用于接收请求,默认 Redis 不会监听 unix socket,因为没有指定
# socket 路径。
#
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# 在客户端处于空闲 N 秒后断开连接。(0 为从不断开)
timeout 0
# TCP keepalive.
# 客户端心跳检测间隔时间,默认为 300 秒。
tcp-keepalive 300
################################# 通用设置 #####################################
# 默认情况下 Redis 已非守护进程方式运行。如果需要以守护进程方式运行,则将下面的 no 改为 yes。
# 守护进程方式运行支持后台运行。它会创建一个 pid 文件 /var/run/redis