Redis配置与优化

目录

一:Redis介绍

1:关系数据库与非关系型数据库

2:Redis基础

2.1 Redis简介

2.2 Redis安装部署

2.3 配置参数

3:Redis 命令工具

3.1 redis-cli 命令行工具

3.2 redis-benchmark测试工具

4:Redis 数据库常用命令

4.1 key 相关命令

4.2 多数据库常用命令

二:Redis持久化

1:RDB 和 AOF 的区别

2:RDB 和 AOF 的优缺点

3:Redis持久化配置

三:性能管理


一:Redis介绍

1:关系数据库与非关系型数据库

特性 关系数据库 (RDBMS) 非关系型数据库 (NoSQL)
数据模型 表格结构,严格的行列关系 多样化的模型:键值对、文档、列存储、图数据库等
查询语言 使用标准SQL 无统一标准,各数据库有自己的查询语法
Schema 需要预定义表结构(强Schema) 动态Schema或无Schema(灵活结构)
扩展性 通常垂直扩展(提升单机性能) 通常水平扩展(增加节点)
事务支持 完整ACID支持(原子性、一致性、隔离性、持久性) 通常不支持完整ACID,多为BASE原则(最终一致性)
一致性 强一致性 通常为最终一致性
性能 适合复杂查询,但高并发写入可能成为瓶颈 高吞吐量,适合大规模读写
代表产品 MySQL、PostgreSQL、Oracle、SQL Server MongoDB(文档)、Redis(键值)、Cassandra(列)、Neo4j(图)
适用场景 需要复杂查询、强一致性的系统(如金融、ERP) 大数据、高并发、灵活结构的应用(如社交网络、IoT)

2:Redis基础

2.1 Redis简介

    Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用C语言编写的 NoSQL 数据库。Redis 基于内存运行并支持持久化,采用 key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

    Redis 服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis 进程,而 Redis 的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个 Redis 进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个 Redis 进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis 进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU 资源比较紧张,采用单进程即可。

Redis 具有以下几个优点:

  • 具有极高的数据读写速度,数据读取的速度最高可达到 110000 次/s,数据写入速度最高可达到 81000 次/s。
  • 支持丰富的数据类型,不仅仅支持简单的 key-value 类型的数据,还支持Strings,Lists,Hashes,Sets 及 0rdered Sets 等数据类型操作。
  • 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • 原子性,Redis 所有操作都是原子性的。
  • 支持数据备份,即 master-salve 模式的数据备份。

    Redis 作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,Redis 常见应用场景还包括获取最新 N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。

2.2 Redis安装部署

[root@localhost src]# dnf -y install tar gcc make
[root@localhost src]# tar xvzf redis-4.0.9.tar.gz
[root@localhost src]# cd redis-4.0.9/
[root@localhost redis-4.0.9]# make
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
# Redis服务安装配置过程

[root@localhost redis-4.0.9]# cd utils/
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
//需要手动输入
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf    //配置文件路径
Log file : /var/log/redis_6379.log    //日志文件路径
Data dir : /var/lib/redis/6379 //数据文件路径
Executable : /usr/local/redis/bin/redis-server    //可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli    //客户端命令行工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

# 验证Redis服务
[root@localhost utils]# netstat -lnupt | grep redis
tcp 0 0 127.0.0.1:6379  0.0.0.0:*  LISTEN  5494/redis-server 1

    Redis 安装完成,可通过 Redis 的服务控制脚本/etc/init.d/redis_6379来对 Redis 服务进行控制,如停止 Redis 服务、启动 Redis 服务、重启 Redis服务、查看 Redis 运行状态。

[root@localhost ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped

[root@localhost ~]# /etc/init.d/redis_6379 start
Starting Redis server...

[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

[root@localhost ~]# /etc/init.d/redis_6379 status
Redis is running (28894)

2.3 配置参数

    Redis 主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成与大多数 Linux 配置文件一样,注释性的文字以“#”开始,包含了对相关配置内容进行的说明和解释。除了注释行与空行以外的内容即为设置行。可根据生产环境的需求调整相关参数,如下:

[root@localhost ~]# vi /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.161 //监听的主机地址
port 6379 //端口
daemonize yes //启用守护进程
pidfile /var/run/redis_6379.pid //指定 PID 文件
loglevel notice //日志级别
logfile /var/log/redis_6379.log //指定日志文件

[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
参数 作用
timeout 300 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
dbfilename dump.rdb 指定本地数据库文件名,默认值为dump.rdb
dir /var/lib/redis/6379 指定本地数据库存放目录
maxclients 10000 设置同一时间最大客户端连接数,默认为10000。Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置maxclients 0,表示不限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU资源,可以关闭该选项,但会导致数据库文件变的巨大
requirepass foobared 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
maxmemory 指定Redis最大内存限制。Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作
activerehashing yes 指定是否激活重置哈希,默认为开启
slaveof 当本机为从服务器时,设置主服务的IP地址及端口。在Redis启动时,从服务器会自动从主服务进行数据同步
masterauth 当主服务设置了密码保护时,从服务连接主服务的密码
appendonly no 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步地把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为Redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename appendonly.aof 指定更新日志文件名,默认为appendonly.aof
appendfsync everysec 指定更新日志条件,共有3个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)
include /path/to/local.conf 指定包含其它的配置文件,可以在同一主机上多个Redis 实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

3:Redis 命令工具

    Redis 软件提供了多个命令工具。安装 Redis 服务时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用分别如下所示。

  • redis-server: 用于启动 Redis 的工具;
  • redis-benchmark: 用于检测 Redis 在本机的运行效率;
  • redis-check-aof: 修复 AOF 持久化文件;
  • redis-check-rdb: 修复 RDB 持久化文件;
  • redis-cli: Redis 命令行工具。

3.1 redis-cli 命令行工具

    Redis 数据库系统也是一个典型的 C/S(客户端/服务器端)架构的应用,要访问 Redis 数据库需要使用专门的客户端软件。Redis 服务的客户端软件就是其自带的 redis-cli 命令行工具。使用 redis-cli 连接指定数据库,连接成功后会进入提示符为“远程主机 IP 地址:端口号>”的数据库操作环境,例如“127.0.0.1:6379>”。用户可以输入各种操作语句对数据库进行管理。如执行ping 命令可以检测 Redis 服务是否启动。

# Redis 客户端连接测试

[root@localhost ~]# /usr/local/redis/bin/redis-cli  //连接本机 Redis 数据库
127.0.0.1:6379> ping  //检测 redis 服务是否启动
PONG
127.0.0.1:6379>
# 远程连接Redis并查看信息

[root@localhost ~]# redis-cli -h 192.168.10.161 -p 6379
192.168.10.161:6379> info
# Server
redis_version:4.0.9
redis_git_shal:00000000
redis_git_dirty:0
redis_build_id:7ff5f2c1a630cbe5
……
//省略部分内容
192.168.10.161:6379> exit
  • help @:获取中的命令列表;
  • help:获取某个命令的帮助;
  • help:获取可能帮助的主题列表
# Redis 命令帮助查询

[root@localhost ~]# redis-cli
127.0.0.1:6379> help @list  //查看所有与 List 数据类型的相关命令
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
BRPOPLPUSH source destination timeout
......
//省略部分内容

127.0.0.1:6379> help set  //查看 set 命令的命令帮助
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string

3.2 redis-benchmark测试工具

参数 描述
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器 socket
-c 指定并发连接数
-n 指定请求数
-d 以字节为单位设置 SET/GET 值的数据大小
-k 连接保持选项:1(保持连接)或 0(断开重连)
-r 为 SET/GET/INCR 使用随机 key,为 SADD 使用随机值
-P 通过管道传输指定数量的请求(numreq
-q 精简输出模式,仅显示每秒查询数(query/sec)
--csv 以 CSV 格式输出结果
-l 循环模式,永久执行测试
-t 仅运行指定的测试命令(逗号分隔列表,如 -t set,get
-I Idle 模式:仅打开 N 个空闲连接并等待
# Redis 性能测试

[root@localhost ~]# redis-benchmark -h 192.168.10.161 -p 6379 -c 100 -n 100000
...... //省略部分内容
8225.04 requests per second
===== MSET (10 keys) ====
100000 requests completed in 1.57 seconds
100 parallel clients
3 bytes payload
keep alive: 1
24.75% <= 1 milliseconds
99.02% <= 2 milliseconds
99.57% <= 3 milliseconds
99.90% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 5 milliseconds
63653.72 requests per second
[root@localhost ~]# redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100
PING_INLINE: 88261.25 requests per second
PING_BULK: 90991.81 requests per second
SET: 83612.04 requests per second
GET: 84961.77 requests per second
INCR: 83682.01 requests per second
LPUSH: 76745.97 requests per second
RPUSH: 78247.26 requests per second

---

**LPOPS:** 77519.38 requests per second  
**RPOP:** 79681.27 requests per second  
**SADD:** 83125.52 requests per second  
**SPOP:** 85543.20 requests per second  
**LPUSH (needed to benchmark LRANGE):** 78864.35 requests per second  
**LRANGE_100 (first 100 elements):** 30931.02 requests per second  
**LRANGE_300 (first 300 elements):** 9437.52 requests per second  
**LRANGE_500 (first 450 elements):** 5541.39 requests per second  
**LRANGE_600 (first 600 elements):** 3824.38 requests per second  
**MSET (10 keys):** 64184.86 requests per second
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 85763.29 requests per second
LPUSH: 86580.09 requests per second

4:Redis 数据库常用命令

  • set:存放数据,基本的命令格式为 set key value。
  • get:获取数据,基本的命令格式为 get key。

    例如,在 Redis 的命令行模式下执行”set teacher zhanglong”,表示在当前数据库下存放一个key 为teacher,value 为 zhanglong 的数据,而执行getteacher“命令即可查看刚才存放的数据。

127.0.0.1:6379> set teacher zhanglong
OK
127.0.0.1:6379> get teacher
"zhanglong"

4.1 key 相关命令

命令 语法 描述 返回值 示例
KEYS KEYS pattern 查找所有匹配给定模式的 Key 匹配的 Key 列表(数组) KEYS user:*(查找所有 user: 开头的 Key)
EXISTS EXISTS key [key ...] 检查一个或多个 Key 是否存在 存在的 Key 数量(整数) EXISTS user:1(返回 1 存在,0 不存在)
DEL DEL key [key ...] 删除一个或多个 Key 被删除的 Key 数量(整数) DEL user:1 user:2(删除两个 Key)
TYPE TYPE key 返回 Key 存储的数据类型 数据类型(stringhashlistsetzsetnone TYPE user:1(返回 string
RENAME RENAME key newkey 修改 Key 的名称(如果 newkey 已存在,会覆盖) OK(成功)或报错 RENAME old_key new_key
RENAMENX RENAMENX key newkey 仅当 newkey 不存在时,才重命名 Key 1(成功),0(失败) RENAMENX old_key new_key(仅当 new_key 不存在时生效)
DBSIZE DBSIZE 返回当前数据库的 Key 总数 整数(Key 数量) DBSIZE(返回当前 DB 的 Key 数量)
# 1. 检查 Key 是否存在
EXISTS user:1  # 返回 1(存在)或 0(不存在)

# 2. 删除 Key
DEL user:1     # 返回 1(成功删除)

# 3. 查找所有以 "cache:" 开头的 Key
KEYS cache:*   # 返回 ["cache:1", "cache:2"]

# 4. 获取 Key 的类型
TYPE session:abc  # 返回 "string"、"hash" 等

# 5. 重命名 Key(强制)
RENAME old_key new_key  # 即使 new_key 存在也会覆盖

# 6. 安全重命名(仅当 new_key 不存在时)
RENAMENX old_key new_key  # 返回 1(成功)或 0(失败)

# 7. 查看当前数据库的 Key 总数
DBSIZE  # 返回 100(表示当前有 100 个 Key)

4.2 多数据库常用命令

命令 语法 描述 返回值 示例
SELECT SELECT index 切换到指定数据库(默认16个,索引0-15) OK SELECT 1(切换到DB1)
MOVE MOVE key db 将当前数据库的 Key 移动到目标数据库 1(成功)
0(失败)
MOVE user:1 2(移动到DB2)
FLUSHDB FLUSHDB [ASYNC] 清空当前数据库的所有 Key
ASYNC:异步执行
OK FLUSHDB(立即清空当前DB)
FLUSHALL FLUSHALL [ASYNC] 清空所有数据库的所有 Key
ASYNC:异步执行
OK FLUSHALL ASYNC(异步清空所有DB)
DBSIZE DBSIZE 返回当前数据库的 Key 数量 整数 DBSIZE(当前DB的Key总数)
SWAPDB SWAPDB db1 db2 交换两个数据库的所有数据(Redis 4.0+) OK SWAPDB 0 1(交换DB0和DB1)

二:Redis持久化

1:RDB 和 AOF 的区别

RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

Redis配置与优化_第1张图片

AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

Redis配置与优化_第2张图片

2:RDB 和 AOF 的优缺点

维度 RDB (快照) AOF (日志追加)
存储原理 定时生成数据集的二进制快照(dump.rdb 记录所有写操作命令(appendonly.aof
优点
性能 高性能:备份时父进程fork子进程,不影响主线程 较低:每次写入需记录日志,appendfsync策略影响性能
文件体积 紧凑:二进制格式,文件较小(适合全量备份) 庞大:持续追加日志,文件可能极大(需定期重写优化)
恢复速度 极快:直接加载二进制数据到内存 较慢:需逐条执行命令重建数据
容灾性 可能丢失最后一次快照后的数据(默认5分钟间隔) 更高:可配置为秒级同步(如appendfsync everysec
缺点
数据安全 定时备份,故障时可能丢失数据 更安全:支持实时/近实时持久化
兼容性 备份文件兼容不同Redis版本 AOF重写时可能占用较多CPU和内存
运维复杂度 简单:单文件管理方便 需监控文件大小,定期执行BGREWRITEAOF

3:Redis持久化配置

RDB 持久化配置

配置指令 时间窗口 数据变更要求 说明
save 900 1 900秒 (15分钟) 至少1个key被修改 在15分钟内如果有1个或更多key被修改,则生成内存快照
save 300 10 300秒 (5分钟) 至少10个key被修改 在5分钟内如果有10个或更多key被修改,则生成内存快照
save 60 10000 60秒 (1分钟) 至少10000个key被修改 在1分钟内如果有10000个或更多key被修改,则生成内存快照

AOF 持久化配置

配置指令 同步策略 数据安全性 性能影响 适用场景
appendfsync always 每次写入立即同步 最高 最低 金融交易等要求零数据丢失的场景
appendfsync everysec 每秒同步一次 中等 大多数生产环境(默认推荐)
appendfsync no 由操作系统决定 最低 最高 可容忍数据丢失的缓存场景

AOF重写

关键项 说明
触发条件 手动触发:BGREWRITEAOF 命令
自动触发:根据 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 配置
重写原理 基于当前内存数据生成最小化命令集
新AOF文件替换旧文件(原子操作)
优点 减少AOF文件体积
提升恢复速度
清除无效命令(如重复SET
风险点 重写期间内存占用上升(fork子进程)
磁盘I/O压力增大
AOF 重写配置参数表
参数名 默认值 说明
auto-aof-rewrite-percentage 100 AOF文件大小比上次重写后增长的比例阈值(如100%表示翻倍时触发)
auto-aof-rewrite-min-size 64MB 允许触发重写的最小AOF文件大小(避免小文件频繁重写)
aof-rewrite-incremental-fsync yes 重写时每生成32MB数据同步一次磁盘(减少阻塞)
aof-load-truncated yes 是否加载不完整的AOF文件(崩溃恢复时可用)

三:性能管理

指标类别 关键命令/参数 健康阈值 说明
内存 INFO memory used_memory < maxmemory 监控内存碎片率 (mem_fragmentation_ratio),理想值 1~1.5
CPU INFO cpu used_cpu_sys < 70% 高CPU可能因复杂命令(如 KEYS *)或频繁持久化导致
网络 INFO stats instantaneous_ops_per_sec 稳定 关注 total_connections_received 和 rejected_connections(连接数超限)
持久化 INFO persistence aof_delayed_fsync=0 AOF同步阻塞次数应为0
慢查询 SLOWLOG GET 单命令耗时 < 10ms 通过 slowlog-log-slower-than 设置阈值
优化方向 配置项 推荐值 作用
内存管理 maxmemory-policy volatile-lru 内存满时淘汰策略(LRU/LFU/TTL等)
连接控制 maxclients 根据系统文件描述符调整 避免连接数耗尽导致拒绝请求
持久化调优 appendfsync everysec 平衡性能与数据安全(always影响吞吐量)
慢查询日志 slowlog-log-slower-than 5000(5毫秒) 记录执行时间超过阈值的命令
内核参数 vm.overcommit_memory=1 系统级配置 防止Redis被OOM Killer终止
问题现象 排查方法 解决方案
CPU占用高 top -Hp [redis-pid] + INFO commandstats 禁用长耗命令(如KEYS→改用SCAN
升级到多线程版本(Redis 6.0+)
内存溢出 INFO memory + redis-cli --bigkeys 调整maxmemory和淘汰策略
拆分大Key(如Hash分片)
AOF阻塞 INFO persistence 启用aof-rewrite-incremental-fsync
使用混合持久化(RDB+AOF)
网络延迟 redis-cli --latency 启用客户端缓存(Redis 6+)
部署Proxy(如Twemproxy)减少直连

你可能感兴趣的:(redis,数据库,缓存)