1. 下载安装包
Linux 中常用两种安装方法,第一种是通过操作系统软件管理软件来安装,例如 CentOS 中的 yum Ubuntu 中的 apt。由于 Redis 更新比较快,而这些软件也不一定更新到最新版本,且源码安装难度不大,所以我们一般比较推荐使用源码安装。
Redis 借鉴了 Linux 操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如 2.7、2.9、3.1)如果是偶数,则为稳定版本(例如 2.6、2.8、3.0)通常我们生产环境都会选择 “偶数” 版本。
2. 安装步骤
- 解压 Redis 源码安装包;
tar -zxvf redis-5.0.0.tar.gz
- 创建软链接(方便后面升级使用)
ln -s redis-5.0.0 redis
- 进入 Redis 目录
cd redis
- 编译(编译前确认操作系统已经安装 gcc)如果没有安装 gcc 会报错,重新编译前需要运行 make distclean
make
- 安装
make install
- 查询版本
# redis-cli --version
redis-cli 5.0.0
安装完成后会有默认的可执行文件:
- redis-benchmark:Redis 基准测试工具
- redis-check-aof:Redis AOF 持久化检测及修复工具
- redis-check-rdb:Redis RDB 持久化检测及修复工具
- redis-cli:Redis 命令行客户端
- redis-sentinel:Redis 哨兵
- redis-server:Redis 启动
编译阶段可能会报错,可能是因为 gcc 的版本原因,Redis 6.0 及以上需要用 gcc 5.0 及以上的版本。
In file included from server.c:30:0:
可以使用下面的方法升级 gcc 解决:
devtoolset-3 对应 gcc4.x.x版本
devtoolset-4 对应 gcc5.x.x版本
devtoolset-6 对应 gcc6.x.x版本
devtoolset-7 对应 gcc7.x.x版本
devtoolset-8 对应 gcc8.x.x版本
devtoolset-9 对应 gcc9.x.x版本
devtoolset-10 对应 gcc10.x.x版本
yum install centos-release-scl
yum install devtoolset-8
scl enable devtoolset-8 bash
3. 参数配置
3.1 监听配置
Redis 默认 bind 127.0.0.1
需要根据业务需求修改。
默认只监听本地回环地址,远程无法访问。
3.2 密码配置
如果是初始化阶段的 Redis 直接在配置文件中修改 requirepass
配置即可:
# If the master is password protected (using the "requirepass" configuration
# requirepass foobared
如果服务已经启动起来了,想要配置密码,可以使用下方命令,不需要重启:
-- 设置密码
config set requirepass YouPassword
-- 将修改的配置持久化
config rewrite
3.3 内存配置
Redis 的目录下都会有默认的配置文件,可以在默认的基础上进行修改,通常初始化我们都会关注这两个参数:
maxmemory:允许 Redis 使用的最大内存,如果为 0 则表示不限制。
maxmemory-policy:当内存超出限制,使用哪种数据淘汰策略。
- VolatileLRU:按照 LRU 算法逐出原有数据,但仅逐出设置了过期时间的数据;
- AllKeysLRU:按照 LRU 算法逐出原有数据;
- AllKeysRandom:随机逐出原有数据;
- VolatileLFU:只从设置失效(expire set)的 key 中选择最不常用的 key 进行删除;
- VolatileTTL:仅逐出设置了过期时间的数据,并且是按照 TTL 有小到大的顺序进行逐出;
- VolatileRandom:随机逐出原有数据,但仅逐出设置了过期时间的数据;
- AllkeysLFU:优先删除掉最不常用的 key;
- NoEviction:不逐出任何数据,新数据的写入会得到一个错误信息。
一般都会按照 Reids 使用场景来设置,如果是 cache 场景,数据是可以再重新刷出来,我们会选择对应的 LRU 数据淘汰策略,避免内存溢出。如果是 store 场景,数据不能丢失,则会设置为 noeviction 如果超出限制,后面的写入操作会报错,读请求正常响应。
3.4 启动配置
配置启动时,我们经常会用到下面的参数,建议在配置文件中设置好:
- port:端口,默认 6379。
- logfile:日志文件路径。
- dir:Redis 工作目录,存放 RDB 等文件。
- daemonize:是否以守护进程方式启动。
- pidfile:PID 文件路径。
以下参数修改在默认配置文件中修改:
# 端口
port 6379
# 日志文件
logfile "/data/redis/redis.log"
# 工作目录,可以搜索下方注释,找到该参数位置
# The working directory.
dir "/data/redis"
# PID 文件
pidfile "/data/redis/redis_6379.pid"
# 后台运行
daemonize yes
参数配置完成后,使用下方命令启动 Redis:
redis-server /usr/local/redis/redis.conf
4. 关闭 Redis
使用 redis-cli 命令可以关闭,关闭时会断开所有链接,然后生成持久化文件。
redis-cli shutdown
关闭时我们可以在日志中看到如下内容:
* DB loaded from disk: 0.000 seconds
* Ready to accept connections
# User requested shutdown...
* Saving the final RDB snapshot before exiting.
* DB saved on disk
* Removing the pid file.
# Redis is now ready to exit, bye bye...
如果使用 kill 进程号的方式关闭,则不会生成持久化文件,极端情况可能会出现 AOF 和复制丢失数据情况。
5. 开机自启
配置 systemctl 实现 Redis 开机自启,使用服务的方式管理 Redis,这里需要关闭 Redis 如果直接 kill 进程可能来不及生成 dump 文件,所以使用 shutdown 安全关闭 Redis 这里写了一个关闭脚本。
vi /usr/local/redis/redis_stop.py
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
# 执行 Linux 命令
def exec_command(command_str):
process = subprocess.Popen(command_str, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
process.communicate()
if process.returncode != 0:
print('STOP ERROR')
print(command_str)
sys.exit(1)
else:
sys.exit(0)
# 获取配置文件中的密码
with open('/usr/local/redis/redis.conf', 'r') as r:
content = r.readlines()
password = ""
for i in content:
if i[0:11] == 'requirepass':
password = str(i).replace('\n', '').split(" ", )[1]
break
# 拼接命令
command = "/usr/local/bin/redis-cli -a {0} shutdown".format(password)
# 执行命令
exec_command(command)
创建启动数据库专用的 Redis 用户:
groupadd redis
useradd -r -g redis -s /bin/false redis
目录属组授权:
# home 目录授权
chown -R redis:redis /usr/local/redis
# 二进制程序授权
chown redis:redis /usr/local/bin/redis*
# 数据目录授权
chown -R redis:redis /data/redis
# 加执行权限
chmod +x /usr/local/redis/redis_stop.py
编写启动配置:
vi /etc/systemd/system/redis.service
[Unit]
Description=Redis Server
After=network.target
[Service]
User=redis
Group=redis
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf
ExecStop=/usr/bin/python /usr/local/redis/redis_stop.py
PrivateTmp=true
[Install]
WantedBy=multi-user.target
更新配置:
systemctl daemon-reload
查看是否有效:
systemctl list-unit-files | grep redis
常用命令:
# 查看 Redis 状态
systemctl status redis
# 关闭 Redis
systemctl stop redis
# 启动 Redis
systemctl start redis
设置开机自启:
# 设置为开机自启
systemctl enable redis.service
# 查看确认
systemctl list-unit-files|grep redis.service
关闭开机自启:
# 关闭开机自启
systemctl disable redis.service
# 查看确认
systemctl list-unit-files|grep redis