Redis 安装配置和性能优化
目录
简介
一、Redis 基础概念与优势
1.1 关系型与非关系型数据库对比
1.2 Redis 核心特性
二、Redis 部署
2.1 环境准备与源码安装
2.2 服务脚本配置与启动
三、Redis 配置参数
四、Redis 命令工具与常用操作
4.1 命令行工具(redis-cli)
4.2 性能测试工具(redis-benchmark)
五、Redis 持久化机制
5.1 RDB 持久化:快照存储
5.2 AOF 持久化:日志追加
5.3 RDB 与 AOF 如何选择
六、Redis 性能优化与内存管理
6.1 内存碎片率
碎片率优化策略:
6.2 内存使用率控制
优化手段:
6.3 内存淘汰策略优化
策略选择建议:
七、总结与最佳实践
Redis 核心优势总结
生产环境最佳实践
简介
Redis 作为高性能内存键值存储系统,在现代互联网架构中扮演着核心角色。本文将从基础概念入手,详细介绍 Redis 的安装部署、核心配置、常用命令、持久化机制及性能优化策略,帮助读者全面掌握 Redis 技术栈。
一、Redis 基础概念与优势
1.1 关系型与非关系型数据库对比
关系型数据库(SQL) 基于二维表格模型,通过 SQL 语句操作数据,典型代表有 MySQL、Oracle 等。其优势在于数据一致性高、事务支持完善,但在应对高并发读写、海量数据存储和横向扩展时存在瓶颈。
非关系型数据库(NoSQL) 是“Not Only SQL”的缩写,包括 Redis、MongoDB 等。它们具有非关系型、分布式、开源及横向扩展等特点,专门解决传统数据库在 Web 2.0 场景下的“三高”问题:
- High Performance:应对每秒上万次的高并发读写
- Huge Storage:处理海量数据的高效存储与查询
- High Scalability & Availability:支持灵活的横向扩展与高可用架构
1.2 Redis 核心特性
Redis(Remote Dictionary Server)是基于内存的开源 NoSQL 数据库,采用 key-value 存储形式,具有以下显著优势:
- 高性能:数据读取速度最高达 110000 次/秒,写入速度 81000 次/秒
- 丰富数据类型:支持 Strings、Lists、Hashes、Sets、Ordered Sets 等
- 持久化支持:提供 RDB 和 AOF 两种持久化方式,保障数据安全
- 原子性操作:所有命令均为原子性执行
- 主从复制:支持 master-slave 模式实现数据备份与读写分离
二、Redis 部署
2.1 环境准备与源码安装
在 Linux 系统中安装 Redis 需先准备编译环境,以下是完整安装流程:
# 安装编译工具(GCC、Make 等)
[root@localhost src]# dnf -y install tar gcc make# 解压 Redis 源码包(以 redis-4.0.9 为例)
[root@localhost src]# tar xvzf redis-4.0.9.tar.gz# 进入源码目录
[root@localhost src]# cd redis-4.0.9/# 编译 Redis(使用默认配置)
[root@localhost redis-4.0.9]# make# 安装到指定目录(/usr/local/redis)
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install# 创建软链接方便全局调用
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
命令解释:
-
dnf install
:安装编译所需的工具包 -
tar xvzf
:解压 Redis 源码压缩包 -
make
:编译 Redis 源码 -
make install
:将二进制文件安装到指定目录 -
ln -s
:创建软链接,使 Redis 命令可在任意路径执行
2.2 服务脚本配置与启动
Redis 源码包提供了安装脚本,可快速配置为系统服务:
# 进入工具脚本目录
[root@localhost redis-4.0.9]# cd utils/# 运行安装脚本(交互式配置)
[root@localhost utils]# ./install_server.sh# 查看 Redis 服务监听端口
[root@localhost utils]# netstat -lnupt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5494/redis-server# 服务控制示例
[root@localhost ~]# /etc/init.d/redis_6379 stop # 停止服务
[root@localhost ~]# /etc/init.d/redis_6379 start # 启动服务
[root@localhost ~]# /etc/init.d/redis_6379 restart # 重启服务
[root@localhost ~]# /etc/init.d/redis_6379 status # 查看状态
脚本配置说明:
- 安装脚本会引导用户配置端口(默认 6379)、配置文件路径、日志文件路径等
- 生成的服务脚本位于
/etc/init.d/redis_6379
,支持系统服务管理 -
netstat
命令用于验证 Redis 服务是否正常启动并监听指定端口
三、Redis 配置参数
Redis 主配置文件为 /etc/redis/6379.conf
,以下是关键配置项解析:
# 基础网络配置
bind 127.0.0.1 192.168.10.161 # 监听的主机地址,可指定多个IP
pidfile /var/run/redis_6379.pid # PID文件路径,用于进程管理
port 6379 # 服务端口号
daemonize yes # 以守护进程模式运行,后台启动# 日志配置
loglevel notice # 日志级别(debug/verbose/notice/warning)
logfile /var/log/redis_6379.log # 日志文件路径# 持久化配置(RDB)
save 900 1 # 900秒内至少1个key变更则生成RDB快照
save 300 10 # 300秒内至少10个key变更则生成快照
save 60 10000 # 60秒内至少10000个key变更则生成快照
dbfilename dump.rdb # RDB文件名
dir /var/lib/redis/6379 # 数据文件存储目录# 连接与资源限制
timeout 300 # 客户端闲置300秒后关闭连接(0表示禁用)
maxclients 10000 # 最大客户端连接数(0表示不限制)
maxmemory 17179869184 # 最大内存限制(16GB)
maxmemory-policy allkeys-lru # 内存不足时的淘汰策略(LRU算法)# 安全配置
requirepass foobared # 客户端连接密码(需通过AUTH命令验证)# AOF持久化配置
appendonly yes # 启用AOF持久化
appendfilename appendonly.aof # AOF文件名
appendfsync everysec # AOF同步策略(always/everysec/no)
no-appendfsync-on-rewrite yes # AOF重写时暂停同步
auto-aof-rewrite-percentage 100 # AOF文件体积增长100%时触发重写
auto-aof-rewrite-min-size 64mb # AOF重写的最小文件体积
关键配置说明:
- bind:建议在生产环境中绑定具体IP,避免公网暴露
- maxmemory:根据服务器内存大小设置,通常为物理内存的45%-95%
- maxmemory-policy:常用策略包括
allkeys-lru
(淘汰最少使用键)、volatile-ttl
(淘汰即将过期键) - appendfsync:AOF同步策略中,
everysec
是性能与安全性的平衡选择 - RDB与AOF:建议同时启用两种持久化方式,RDB用于快速恢复,AOF用于减少数据丢失
四、Redis 命令工具与常用操作
4.1 命令行工具(redis-cli)
redis-cli 是 Redis 的官方命令行客户端,支持连接与操作 Redis 服务器:
# 连接本地 Redis 服务器
[root@localhost ~]# redis-cli
127.0.0.1:6379> ping # 测试连接,返回PONG表示正常# 连接远程 Redis 服务器(带密码)
[root@localhost ~]# redis-cli -h 192.168.10.161 -p 6379 -a "password"# 查看命令帮助
127.0.0.1:6379> help @list # 查看List类型相关命令
127.0.0.1:6379> help set # 查看set命令详细说明# 数据操作示例
127.0.0.1:6379> set teacher zhanglong # 存储键值对
OK
127.0.0.1:6379> get teacher # 获取键值
"zhanglong"# key相关操作
127.0.0.1:6379> keys * # 查看所有key
1) "teacher"
2) "k1"
127.0.0.1:6379> exists teacher # 判断key是否存在
(integer) 1
127.0.0.1:6379> del teacher # 删除key
(integer) 1
参数解析:
-
-h
:指定远程服务器IP -
-p
:指定端口号 -
-a
:指定连接密码 -
help @group
:按功能分组查看命令 -
keys *
:通配符查询,生产环境慎用(可能阻塞服务器)
4.2 性能测试工具(redis-benchmark)
redis-benchmark 用于测试 Redis 服务器的性能表现:
# 基本性能测试(100并发,10万请求)
[root@localhost ~]# redis-benchmark -h 192.168.10.161 -p 6379 -c 100 -n 100000
8225.04 requests per second # 每秒处理请求数# 测试指定数据大小的性能(100字节)
[root@localhost ~]# redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100
PING_NLINE: 88261.25 requests per second # 不同操作的性能指标
SET: 83612.04 requests per second
GET: 84961.77 requests per second# 测试特定命令的性能(set和lpush)
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 85763.29 requests per second
LPUSH: 86580.09 requests per second
选项说明:
-
-c
:并发连接数 -
-n
:总请求数 -
-d
:SET/GET值的字节大小 -
-t
:指定测试的命令列表 -
-q
:仅显示每秒请求数(query/sec)
五、Redis 持久化机制
5.1 RDB 持久化:快照存储
RDB(Redis Database)将内存中的数据定时快照到磁盘,形成二进制文件(dump.rdb)。
RDB 工作原理
- Redis fork 出子进程
- 子进程将数据集写入临时文件
- 写入成功后替换旧的 RDB 文件
RDB 优缺点
- 优点:
- 文件体积小,便于备份与迁移
- 恢复速度快,适合大规模数据集
- 持久化过程对主进程影响小(子进程执行)
- 缺点:
- 数据安全性低,可能丢失最近一次快照后的所有数据
- 大规模数据集快照时可能导致服务器短暂阻塞
RDB 配置优化
# 调整快照触发条件(示例:更频繁的快照)
save 300 1 # 5分钟内1个key变更即快照
save 60 10 # 1分钟内10个key变更即快照
5.2 AOF 持久化:日志追加
AOF(Append Only File)以日志形式记录所有写操作,重启时重放日志恢复数据。
AOF 工作原理
- 客户端发送写命令到服务器
- 服务器将命令追加到 AOF 缓冲区
- 根据配置策略将缓冲区内容同步到磁盘
AOF 优缺点
- 优点:
- 数据安全性高,可配置为每秒同步或实时同步
- 日志文件以文本格式存储,可读性强
- 支持自动重写(rewrite),避免日志文件过大
- 缺点:
- 文件体积通常大于 RDB
- 恢复速度慢于 RDB
- 频繁同步会影响性能
AOF 配置优化
# 启用AOF并优化配置
appendonly yes # 启用AOF
appendfsync everysec # 每秒同步(平衡性能与安全)
auto-aof-rewrite-percentage 200 # 体积增长200%时触发重写
auto-aof-rewrite-min-size 100mb # 重写最小体积100MB
5.3 RDB 与 AOF 如何选择
- 优先使用 AOF:适用于对数据安全性要求高的场景(如金融交易)
- 优先使用 RDB:适用于对恢复速度要求高、允许少量数据丢失的场景(如缓存)
六、Redis 性能优化与内存管理
6.1 内存碎片率
内存碎片率是衡量 Redis 内存使用效率的重要指标,可通过 info memory
命令查看:
192.168.9.236:7001> info memory
# Memory
used_memory: 1789108864 # Redis分配的内存总量(字节)
used_memory_human: 1.67G # 人类可读格式
used_memory_rss: 1834389504 # 操作系统分配的物理内存
mem_fragmentation_ratio: 1.03 # 内存碎片率(理想值≈1)
碎片率优化策略:
- 碎片率 > 1.5:重启 Redis 服务,释放无效碎片
# 安全重启(先保存数据再关闭)
127.0.0.1:6379> shutdown save
- 碎片率 < 1:说明发生内存交换,需增加物理内存或减少 Redis 内存占用
- 调整内存分配器:Redis 支持
libc
、jemalloc
、tcmalloc
,可编译时指定
6.2 内存使用率控制
优化手段:
- 使用 32 位实例:当数据量 < 4GB 时,32 位实例可减少内存占用
# 编译时指定32位模式(修改Makefile)
# CFLAGS= -m32 make
- 合理使用 Hash 结构:存储对象时使用 Hash 而非多个 String
# 推荐方式:单个Hash存储用户信息
127.0.0.1:6379> hset user:1 name "张三" age 25 job "developer"
# 避免方式:多个String存储
127.0.0.1:6379> set user:1:name "张三"
127.0.0.1:6379> set user:1:age 25
- 设置 key 过期时间:主动淘汰无效数据
127.0.0.1:6379> set token abc123 ex 3600 # 1小时后过期
127.0.0.1:6379> expire user:10086 86400 # 设置key有效期为1天
6.3 内存淘汰策略优化
通过 maxmemory-policy
配置内存不足时的淘汰策略:
# 常用淘汰策略配置
maxmemory-policy allkeys-lru # 对所有key使用LRU算法淘汰
# maxmemory-policy volatile-ttl # 对过期key中优先淘汰TTL短的
# maxmemory-policy allkeys-random # 随机淘汰
策略选择建议:
- 数据集包含大量过期键:
volatile-ttl
- 希望淘汰最少使用的键:
allkeys-lru
- 对淘汰策略不敏感:
allkeys-random
- 禁止淘汰(仅读操作):
no-enviction
七、总结与最佳实践
Redis 核心优势总结
- 内存存储带来的极致性能(十万级 QPS)
- 丰富的数据结构(String/List/Hash/Set/ZSet)
- 完善的持久化与高可用方案(RDB/AOF/主从/集群)
- 简单易用的命令体系与客户端支持
生产环境最佳实践
- 部署优化:
- 绑定具体 IP,禁止公网访问
- 设置强密码(
requirepass
) - 启用后台守护进程(
daemonize yes
)
- 持久化优化:
- 同时启用 RDB 和 AOF
- AOF 采用
everysec
同步策略 - 定期备份 RDB 文件到异地存储
- 内存优化:
- 设置
maxmemory
为物理内存的 45%-95% - 采用
allkeys-lru
淘汰策略 - 合理使用 Hash 结构与过期时间
- 监控与运维:
- 实时监控内存碎片率、CPU 使用率
- 配置告警(内存不足、持久化失败)
- 定期进行主从切换演练
通过掌握上述 Redis 技术要点,开发者可以在缓存加速、实时计数、排行榜、消息队列等场景中充分发挥 Redis 的性能优势,构建高效稳定的分布式系统。