1. Redis简介与安装准备
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息中间件。作为一名后端开发者,我在过去五年里几乎每个项目都会用到Redis,它那惊人的读写性能(官方基准测试显示单机可达10万+ QPS)和丰富的数据结构支持,让它成为现代应用架构中不可或缺的组件。
1.1 为什么选择Redis
在众多缓存解决方案中,Redis之所以能脱颖而出,主要因为以下几个特性:
- 内存存储:数据主要存储在内存中,读写速度远超传统磁盘数据库
- 持久化支持:通过RDB快照和AOF日志两种方式实现数据持久化
- 丰富的数据类型:支持字符串、哈希、列表、集合、有序集合等数据结构
- 原子性操作:所有操作都是原子性的,适合高并发场景
- 发布/订阅:内置消息队列功能
- 高可用:通过哨兵和集群模式支持故障自动转移
1.2 安装环境准备
在开始安装前,我们需要准备以下环境:
- Linux服务器(推荐使用CentOS 7+或Ubuntu 18.04+)
- 至少1GB可用内存(生产环境建议4GB+)
- GCC编译器(用于编译Redis源码)
- 基本的Linux操作权限
提示:虽然Redis可以在Windows上运行,但官方并不推荐在生产环境使用Windows版本,因为性能会大打折扣。我在早期项目中也尝试过Windows版,确实遇到了不少性能瓶颈和稳定性问题。
2. Redis源码安装详解
2.1 获取Redis安装包
首先访问Redis官网(https://redis.io/download/)获取最新稳定版。截至我写这篇文章时,最新稳定版本是6.2.6,但为了与示例保持一致,我们仍以6.2.4版本为例。
下载命令:
bash复制wget https://download.redis.io/releases/redis-6.2.4.tar.gz
如果服务器无法直接访问外网,可以先在本地下载后再上传到服务器。我通常使用scp命令上传:
bash复制scp redis-6.2.4.tar.gz user@yourserver:/usr/local/src/
2.2 解压与目录准备
建议将Redis安装在/usr/local目录下,这是Linux系统存放第三方软件的常规位置:
bash复制sudo mkdir -p /usr/local/redis
sudo tar -xzf redis-6.2.4.tar.gz -C /usr/local/redis
cd /usr/local/redis/redis-6.2.4
2.3 编译环境准备
Redis是用C语言编写的,因此需要GCC编译器。安装命令如下:
bash复制# CentOS/RHEL
sudo yum install -y gcc make
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y build-essential
安装完成后检查GCC版本:
bash复制gcc --version
# 输出应类似:gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
注意:如果系统自带的GCC版本过旧(低于4.9),可能会导致编译失败。这时需要先升级GCC,我在实际项目中遇到过这个问题,特别是在CentOS 7上。
2.4 编译Redis源码
进入解压后的目录开始编译:
bash复制make
编译过程通常需要1-3分钟,取决于服务器性能。如果遇到类似"jemalloc/jemalloc.h: No such file or directory"的错误,执行以下命令后再重试:
bash复制make distclean && make
2.5 安装Redis
编译成功后,执行安装命令:
bash复制sudo make install
这会将Redis的可执行文件安装到/usr/local/bin目录下。安装完成后,可以检查下生成的可执行文件:
bash复制ls -l /usr/local/bin/redis-*
关键文件说明:
- redis-server:Redis服务端程序
- redis-cli:Redis命令行客户端
- redis-benchmark:性能测试工具
- redis-check-aof/rdb:AOF/RDB文件检查工具
3. Redis配置与启动
3.1 基础配置
Redis默认配置文件位于源码目录的redis.conf。建议不要直接修改原文件,而是复制一份进行自定义:
bash复制mkdir -p /etc/redis
cp /usr/local/redis/redis-6.2.4/redis.conf /etc/redis/6379.conf
几个关键配置项需要关注:
conf复制daemonize yes # 以守护进程方式运行
bind 0.0.0.0 # 允许远程连接(生产环境应限制IP)
protected-mode no # 关闭保护模式(需配合bind设置)
port 6379 # 默认端口
dir /var/lib/redis # 持久化文件存储目录
requirepass yourpassword # 设置访问密码
3.2 启动Redis服务
使用配置文件启动Redis:
bash复制redis-server /etc/redis/6379.conf
验证服务是否正常运行:
bash复制redis-cli ping
# 如果返回PONG表示服务正常
3.3 系统服务配置(可选)
为了方便管理,我们可以将Redis配置为系统服务。创建服务文件:
bash复制sudo vim /etc/systemd/system/redis.service
内容如下:
ini复制[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
然后创建专用用户并设置权限:
bash复制sudo adduser --system --group --no-create-home redis
sudo mkdir -p /var/lib/redis
sudo chown redis:redis /var/lib/redis
sudo chmod 770 /var/lib/redis
启用并启动服务:
bash复制sudo systemctl enable redis
sudo systemctl start redis
4. Docker方式部署Redis
4.1 Docker安装准备
如果系统尚未安装Docker,可以先执行以下命令安装:
bash复制# CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
# Ubuntu
sudo apt-get update
sudo apt-get install -y docker.io
启动Docker服务:
bash复制sudo systemctl enable --now docker
4.2 拉取Redis镜像
从Docker Hub获取官方Redis镜像:
bash复制docker pull redis:6.2.4
4.3 准备配置文件和数据目录
创建本地目录用于存储Redis配置和数据:
bash复制mkdir -p ~/docker/redis/{conf,data}
下载默认配置文件并修改:
bash复制wget -O ~/docker/redis/conf/redis.conf https://raw.githubusercontent.com/redis/redis/6.2/redis.conf
修改关键配置项:
conf复制bind 0.0.0.0
protected-mode no
appendonly yes
requirepass yourpassword
4.4 启动Redis容器
使用以下命令启动容器:
bash复制docker run -d \
--name myredis \
-p 6379:6379 \
-v ~/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v ~/docker/redis/data:/data \
redis:6.2.4 \
redis-server /usr/local/etc/redis/redis.conf
参数说明:
-d:后台运行--name:容器名称-p:端口映射(主机端口:容器端口)-v:目录挂载(主机目录:容器目录)
4.5 验证容器运行状态
检查容器是否正常运行:
bash复制docker ps -f name=myredis
连接测试:
bash复制docker exec -it myredis redis-cli
> AUTH yourpassword
> PING
5. Redis基本操作与管理
5.1 常用命令
连接Redis服务:
bash复制redis-cli -h host -p port -a password
基础操作示例:
bash复制# 设置键值
SET mykey "Hello Redis"
# 获取键值
GET mykey
# 查看所有键
KEYS *
# 删除键
DEL mykey
5.2 持久化配置
Redis提供两种持久化方式:
RDB(快照)
conf复制save 900 1 # 900秒内至少有1个key变化时保存
save 300 10 # 300秒内至少有10个key变化时保存
save 60 10000 # 60秒内至少有10000个key变化时保存
AOF(追加日志)
conf复制appendonly yes # 启用AOF
appendfsync everysec # 每秒同步一次
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
5.3 性能监控
使用内置命令监控Redis:
bash复制redis-cli info # 查看全部信息
redis-cli info memory # 查看内存使用情况
redis-cli info stats # 查看统计信息
或者使用redis-cli的监控模式:
bash复制redis-cli monitor
6. 常见问题与解决方案
6.1 编译问题
问题1:fatal error: jemalloc/jemalloc.h: No such file or directory
解决方案:
bash复制make distclean
make
问题2:server.c:xxxx:xx: error: 'xxxxxxxx' has no member named 'xxxx'
这通常是GCC版本过低导致,需要升级GCC:
bash复制# CentOS
sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-9-gcc*
scl enable devtoolset-9 bash
6.2 运行问题
问题1:WARNING overcommit_memory is set to 0!
解决方案:
bash复制echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
问题2:连接数达到上限
调整最大连接数配置:
conf复制maxclients 10000
并在系统层面调整文件描述符限制:
bash复制ulimit -n 65535
6.3 性能优化建议
-
合理设置maxmemory:通常设置为物理内存的3/4,并配置淘汰策略
conf复制maxmemory 8gb maxmemory-policy allkeys-lru -
使用Pipeline:减少网络往返时间
python复制pipeline = r.pipeline() pipeline.set('key1', 'value1') pipeline.set('key2', 'value2') pipeline.execute() -
避免大Key:单个Key的value不宜过大(建议小于1MB)
-
合理使用数据结构:例如用Hash代替多个String存储对象属性
7. 生产环境部署建议
根据我多年Redis运维经验,生产环境部署需要注意以下几点:
-
高可用配置:至少使用主从复制+哨兵模式,或者直接使用Redis Cluster
-
安全配置:
- 修改默认端口
- 设置强密码
- 禁用危险命令(FLUSHALL等)
conf复制rename-command FLUSHALL "" rename-command CONFIG ""
-
监控告警:配置Prometheus+Granafa监控以下指标:
- 内存使用率
- 连接数
- 命中率
- 持久化延迟
-
定期维护:
- 每月执行一次内存碎片整理
bash复制
redis-cli MEMORY PURGE - 监控慢查询并优化
bash复制
redis-cli SLOWLOG GET 10
- 每月执行一次内存碎片整理
-
容量规划:提前做好容量评估,当内存使用超过70%时应考虑扩容
我在实际项目中遇到过因为没做好容量规划导致Redis内存爆满的情况,最终导致服务不可用。后来我们建立了完善的监控体系和自动扩缩容机制,这类问题就再没发生过了。