目录
一: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持久化配置
三:性能管理
特性 | 关系数据库 (RDBMS) | 非关系型数据库 (NoSQL) |
---|---|---|
数据模型 | 表格结构,严格的行列关系 | 多样化的模型:键值对、文档、列存储、图数据库等 |
查询语言 | 使用标准SQL | 无统一标准,各数据库有自己的查询语法 |
Schema | 需要预定义表结构(强Schema) | 动态Schema或无Schema(灵活结构) |
扩展性 | 通常垂直扩展(提升单机性能) | 通常水平扩展(增加节点) |
事务支持 | 完整ACID支持(原子性、一致性、隔离性、持久性) | 通常不支持完整ACID,多为BASE原则(最终一致性) |
一致性 | 强一致性 | 通常为最终一致性 |
性能 | 适合复杂查询,但高并发写入可能成为瓶颈 | 高吞吐量,适合大规模读写 |
代表产品 | MySQL、PostgreSQL、Oracle、SQL Server | MongoDB(文档)、Redis(键值)、Cassandra(列)、Neo4j(图) |
适用场景 | 需要复杂查询、强一致性的系统(如金融、ERP) | 大数据、高并发、灵活结构的应用(如社交网络、IoT) |
Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用C语言编写的 NoSQL 数据库。Redis 基于内存运行并支持持久化,采用 key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
Redis 服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis 进程,而 Redis 的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个 Redis 进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个 Redis 进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis 进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU 资源比较紧张,采用单进程即可。
Redis 具有以下几个优点:
Redis 作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,Redis 常见应用场景还包括获取最新 N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
[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)
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 实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件 |
Redis 软件提供了多个命令工具。安装 Redis 服务时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用分别如下所示。
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
# 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
参数 | 描述 |
---|---|
-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
例如,在 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"
命令 | 语法 | 描述 | 返回值 | 示例 |
---|---|---|---|---|
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 存储的数据类型 | 数据类型(string 、hash 、list 、set 、zset 、none ) |
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)
命令 | 语法 | 描述 | 返回值 | 示例 |
---|---|---|---|---|
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] |
清空当前数据库的所有 KeyASYNC :异步执行 |
OK |
FLUSHDB (立即清空当前DB) |
FLUSHALL |
FLUSHALL [ASYNC] |
清空所有数据库的所有 KeyASYNC :异步执行 |
OK |
FLUSHALL ASYNC (异步清空所有DB) |
DBSIZE |
DBSIZE |
返回当前数据库的 Key 数量 | 整数 | DBSIZE (当前DB的Key总数) |
SWAPDB |
SWAPDB db1 db2 |
交换两个数据库的所有数据(Redis 4.0+) | OK |
SWAPDB 0 1 (交换DB0和DB1) |
RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF 持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
维度 | RDB (快照) | AOF (日志追加) |
---|---|---|
存储原理 | 定时生成数据集的二进制快照(dump.rdb ) |
记录所有写操作命令(appendonly.aof ) |
优点 | ||
性能 | 高性能:备份时父进程fork子进程,不影响主线程 | 较低:每次写入需记录日志,appendfsync 策略影响性能 |
文件体积 | 紧凑:二进制格式,文件较小(适合全量备份) | 庞大:持续追加日志,文件可能极大(需定期重写优化) |
恢复速度 | 极快:直接加载二进制数据到内存 | 较慢:需逐条执行命令重建数据 |
容灾性 | 可能丢失最后一次快照后的数据(默认5分钟间隔) | 更高:可配置为秒级同步(如appendfsync everysec ) |
缺点 | ||
数据安全 | 定时备份,故障时可能丢失数据 | 更安全:支持实时/近实时持久化 |
兼容性 | 备份文件兼容不同Redis版本 | AOF重写时可能占用较多CPU和内存 |
运维复杂度 | 简单:单文件管理方便 | 需监控文件大小,定期执行BGREWRITEAOF |
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压力增大 |
参数名 | 默认值 | 说明 |
---|---|---|
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)减少直连 |