INCR
操作)。LPUSH/RPOP
或发布订阅实现异步任务。SETNX
或 RedLock 算法实现并发控制。数据结构 | 常用命令 | 应用场景 |
---|---|---|
字符串 | SET/GET/INCR/DECR/MSET |
缓存、计数器、分布式 session |
哈希 | HSET/HGET/HGETALL/HMSET |
对象存储(如用户信息) |
列表 | LPUSH/RPOP/RANGE/LTRIM |
消息队列、最新动态列表(栈 / 队列结构) |
集合 | SADD/SMEMBERS/SISMEMBER/SUNION/SDIFF |
去重数据、交集计算(如共同好友) |
有序集合 | ZADD/ZRANGE/ZREVRANGE/ZRANK/SCORE |
排行榜、时间线(按分数排序) |
Redis 提供两种持久化方式,可单独或同时使用:
RDB(快照)
.rdb
)。SAVE
(阻塞)或BGSAVE
(异步)。save
参数(如save 900 1
表示 900 秒内至少 1 次写操作)。AOF(日志追加)
.aof
),重启时重放命令恢复数据。appendfsync always
:每次写操作同步,安全性最高,性能最差。appendfsync everysec
:每秒同步(默认),最多丢失 1 秒数据。appendfsync no
:由操作系统决定,性能最好,安全性最差。对比与选择
场景 | 推荐方案 |
---|---|
纯缓存,允许数据丢失 | 关闭持久化或仅 RDB |
需快速恢复,允许少量数据丢失 | 仅 RDB |
需高安全性,不接受数据丢失 | 仅 AOF(everysec) |
兼顾安全性和恢复速度 | 同时开启 RDB 和 AOF |
内存分配与监控
INFO memory
命令查看内存使用详情:
used_memory
:Redis 分配的总内存。used_memory_rss
:操作系统实际分配的内存(含碎片)。mem_fragmentation_ratio
:碎片率(理想值 1.03~1.5)。内存淘汰策略(maxmemory_policy)
allkeys-lru
:删除最近最少使用的键(推荐)。volatile-lru
:删除有过期时间的键中最近最少使用的。noeviction
:内存满时拒绝写操作(默认)。内存优化
EXPIRE
命令)。LRU
淘汰策略。slaveof
连接主节点。slowlog get
命令查看慢查询日志。KEYS *
、SORT
等全量操作,改用 SCAN
分批处理。基础安全措施
requirepass
设置密码认证。bind
限制可访问的 IP(如 bind 127.0.0.1 192.168.1.101
)。高级安全策略
部署防火墙,仅允许信任的 IP 访问 Redis 端口。
禁用危险命令(如FLUSHALL,CONFIG
)
rename-command FLUSHALL ""
定期备份 RDB/AOF 文件并加密存储。
mem_fragmentation_ratio > 1.5
。activedefrag yes
)。# redis.conf 核心配置
# 基础配置
bind 127.0.0.1 192.168.1.100 # 监听本地和局域网 IP
port 6379
requirepass your_strong_password
# 持久化配置
save 900 1 # RDB 快照:900 秒内至少 1 次写操作
appendonly yes # 启用 AOF
appendfsync everysec # AOF 同步策略:每秒一次
# 内存配置
maxmemory 2GB # 最大内存限制
maxmemory-policy allkeys-lru # 内存淘汰策略
# 集群配置(若启用)
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
功能 | 命令示例 |
---|---|
连接与认证 | redis-cli -h host -p port -a password |
键操作 | KEYS pattern , EXISTS key , DEL key , EXPIRE key seconds |
字符串操作 | SET key value , GET key , INCR key , MSET key1 val1 key2 val2 |
哈希操作 | HSET hash field value , HGET hash field , HGETALL hash |
列表操作 | LPUSH list value , RPOP list , LRANGE list 0 -1 |
集合操作 | SADD set member , SMEMBERS set , SINTER set1 set2 |
有序集合操作 | ZADD zset score member , ZRANGE zset 0 -1 , ZSCORE zset member |
服务器管理 | INFO , CONFIG GET parameter , FLUSHDB , FLUSHALL |
Redis 的安装相对于其他服务来说比较简单 。首先需要到 Redis 官网(https://www.redis.io)下载相应的源码软件包,然后上传至 Linux 系统的服务器中进行解压、安装。本章中以 redis-4.0.9.tar.gz 为例进行 Redis 服务的安装和配置讲解。
通常情况下,在 Linux 系统中进行源码编译安装,需要先执行./configure进行环境检查与配置,从而生成 Makefile 文件,再执行 make && make instal1命令进行编译安装。而 Redis 源码包中直接提供了 Makefile 文件,所以在解压完软件包后,可直接进入解压后的软件包目录,执行make与 make install命令进行安装。
###安装依赖环境
[root@localhost ~]# dnf -y install gcc zlib-devel
[root@localhost ~]# ls
redis-4.0.9.tar.gz
###解压缩
[root@localhost ~]# tar xf redis-4.0.9.tar.gz
[root@localhost ~]# cd redis-4.0.9
###编译安装
[root@localhost redis-4.0.9]# make && make PREFIX=/usr/local/redis/ install
###连接方便操作
[root@localhost redis-4.0.9]# ln -s /usr/local/redis/bin/* /usr/local/bin
make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。软件包中默认提供了一个 install server.sh 脚本文件,通过该脚本文件可以设置 Redis 服务所需要的相关配置文件。当脚本运行完毕,Redis 服务就已经启动,默认侦听端口为 6379。
# 进入Redis源码的工具目录(包含安装脚本和辅助工具)
[root@localhost redis-4.0.9]# cd utils/
# 执行官方提供的安装服务脚本(用于配置Redis为系统服务)
[root@localhost utils]# ./install_server.sh
# 脚本启动后的交互式配置过程:
# 1. 选择Redis实例的监听端口(默认6379)
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]
# 2. 指定配置文件路径(默认/etc/redis/6379.conf)
Please select the redis config file name [/etc/redis/6379.conf]
# 3. 指定日志文件路径(默认/var/log/redis_6379.log)
Please select the redis log file name [/var/log/redis_6379.log]
# 4. 指定数据存储目录(默认/var/lib/redis/6379)
Please select the data directory for this instance [/var/lib/redis/6379]
# 5. 指定Redis服务器可执行文件路径(需提前编译安装)
Please select the redis executable path [/usr/local/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/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
# 安装过程关键步骤:
# 1. 复制配置模板到指定位置(/etc/init.d/redis_6379)
Copied /tmp/6379.conf => /etc/init.d/redis_6379
# 2. 将Redis服务添加到系统服务管理(chkconfig)
Installing service...
Successfully added to chkconfig!
# 3. 设置Redis服务在运行级别3、4、5(多用户模式)下自动启动
Successfully added to runlevels 345!
# 4. 启动Redis服务并验证安装成功
Starting Redis server...
Installation successful!
Redis 安装完成,可通过 Redis 的服务控制脚本/etc/init.d/redis 6379来对 Redis 服务进行控制,如停止 Redis 服务、启动 Redis 服务、重启 Redis服务、查看 Redis 运行状态。
[root@localhost utils]# netstat -anpt |grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 12626/redis-server
# 使用初始化脚本管理Redis服务(适用于SysVinit系统)
# 停止Redis服务
# - 执行停止命令,发送SIGTERM信号给Redis进程
# - 等待Redis优雅关闭(完成持久化操作)
[root@localhost utils]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
# 启动Redis服务
# - 读取配置文件(/etc/redis/6379.conf)
# - 以守护进程模式启动Redis服务器
# - 日志输出到/var/log/redis_6379.log
[root@localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
# 重启Redis服务(先停止再启动)
# - 常用于配置文件修改后重新加载
# - 包含优雅停止和启动的完整流程
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
# 查看服务状态
# - 检查Redis进程是否存在
# - 显示进程ID(PID)和运行状态
# - 若服务未运行,会提示"Redis is not running"
[root@localhost utils]# /etc/init.d/redis_6379 status
Redis is running (12659) # PID为12659的Redis进程正在运行
Redis主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成。与大多数Linux配置文件一样,注释性的文字以"#"开始,包含了对相关配置内容进行的说明和解释。除了注释行与空行以外的内容即为设置行。可根据生产环境的需求调整相关参数如下
[root@localhost utils]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101 ###监听主机地址
port 6379 ###端口号
daemonize yes ###启用守护进程
pidfile /var/run/redis_6379.pid ###指定PID文件
loglevel notice ###日志级别
logfile /var/log/redis_6379.log ###指定日志文件
[root@localhost utils]# /etc/init.d/redis_6379 restart
除了上述配置参数外,Redis 主配置文件中还包含很多其它的配置参数,
# 绑定监听的 IP 地址(默认仅本地访问)
bind 127.0.0.1
# 监听端口(默认 6379)
port 6379
# 是否以守护进程方式运行(默认 no)
daemonize yes
# 进程文件路径
pidfile /var/run/redis_6379.pid
# 日志级别(debug|verbose|notice|warning)
loglevel notice
# 日志文件路径(若为 "" 则输出到标准输出)
logfile /var/log/redis_6379.log
# 数据库数量(默认 16 个,通过 SELECT 命令切换)
databases 16
# 最大内存限制(例如 2GB、512MB)
maxmemory 2gb
# 内存不足时的淘汰策略
maxmemory-policy allkeys-lru # 优先删除最近最少使用的键
# 内存碎片自动整理(Redis 4.0+ 支持)
activedefrag yes # 启用自动碎片整理
active-defrag-ignore-bytes 100mb # 碎片超过 100MB 时触发
active-defrag-threshold-lower 10 # 碎片率超过 10% 时触发
# RDB 持久化配置
save 900 1 # 900 秒内至少 1 次写操作则生成快照
save 300 10 # 300 秒内至少 10 次写操作则生成快照
save 60 10000 # 60 秒内至少 10000 次写操作则生成快照
dbfilename dump.rdb # 快照文件名
dir /var/lib/redis # 数据文件存储目录
# AOF 持久化配置
appendonly yes # 启用 AOF
appendfilename "appendonly.aof"
appendfsync everysec # 每秒同步一次(默认)
no-appendfsync-on-rewrite no # 重写时是否禁止同步
auto-aof-rewrite-percentage 100 # AOF 文件体积比上次重写后增长 100% 时触发重写
auto-aof-rewrite-min-size 64mb # AOF 文件最小重写体积
# 从节点配置(主从复制)
slaveof <masterip> <masterport> # 设置主节点 IP 和端口
masterauth <master-password> # 主节点密码(若有)
# 从节点是否接受读请求(默认 yes)
slave-read-only yes
# 复制积压缓冲区大小(用于断点续传)
repl-backlog-size 1mb
# 设置访问密码(强烈建议生产环境配置)
requirepass your_strong_password
# 重命名危险命令(例如禁用 FLUSHALL)
rename-command FLUSHALL ""
rename-command CONFIG "RENAME_CONFIG" # 重命名后需使用新命令名调用
# 客户端连接空闲超时时间(秒)
timeout 300
# TCP 连接相关参数
tcp-backlog 511 # TCP 连接队列长度
tcp-keepalive 300 # TCP 保活时间(秒)
# 是否开启 TCP_NODELAY(默认 no,关闭 Nagle 算法)
tcp-nodelay no
# 最大客户端连接数
maxclients 10000
# 启用集群模式
cluster-enabled yes
# 集群配置文件(自动生成)
cluster-config-file nodes.conf
# 节点超时时间(毫秒)
cluster-node-timeout 15000
# 集群是否允许手动故障转移
cluster-allow-replica-migration yes
# 慢查询日志阈值(微秒)
slowlog-log-slower-than 10000 # 执行时间超过 10 毫秒的命令记录到日志
# 慢查询日志最多存储的命令数
slowlog-max-len 128
Redis 软件提供了多个命令工具。安装 Redis 服务时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用分别如下所示。
这次我们只使用redis-cli,redis-benchmark命令工具的使用
Redis 数据库系统也是一个典型的 C/S(客户端/服务器端)架构的应用,要访问 Redis 数据库需要使用专门的客户端软件。Redis 服务的客户端软件就是其自带的 redis-cli 命令行工具。使用 redis-cli 连接指定数据库,连接成功后会进入提示符为“远程主机 IP 地址:端口号>”的数据库操作环境,例如“127.0.0.1:6379>”。用户可以输入各种操作语句对数据库进行管理。如执行ping 命令可以检测 Redis 服务是否启动。
[root@localhost utils]# redis-cli ###连接本机redis数据库
127.0.0.1:6379> ping ###检测redis 服务是否启动
PONG
127.0.0.1:6379>
在进行数据库连接操作时,可以通过选项来指定远程主机上的Redis 数据库。命令语法为 redis-cli -h host -p port -a password
,其中-h 指定远程主机、-p 指定 Redis 服务的端口号、-a 指定密码。若不添加任何选项表示,连接本机上的 Redis 数据库;若未设置数据库密码可以省略-a 选项。例如执行以下命令可连接到主机为 192.168.10.161,端口为 6379 的 Redis 数据库,并査看 Redis 服务的统计信息。若要退出数据库操作环境,执行“exit”或“quit”命令即可返还原来的 Shell 环境。
[root@localhost utils]# redis-cli -h 192.168.10.101 -p 6379
在数据库操作环境中,使用help命令可以获取命令类型的帮助。有三种获取命令帮助的方式。
操作如下
[root@localhost utils]# redis-cli
127.0.0.1:6379> help @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
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0
###//省略部分内容
redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试Redis 服务的性能。基本的测试语法为 redis-benchmark [option][optionvalue]。常用选项如下所示。
结合上述选项,可以针对某台Redis服务器进行性能检测,如执行redis-benchmark -h 192.168.10.161-p 6379-c 100-n 100000
命令即可向 IP地址为 192.168.10.161、端口为6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能。
[root@localhost ~]# redis-benchmark -h 192.168.10.101 -p 6379 -c 1000 -n 100
====== PING_INLINE ======
100 requests completed in 0.01 seconds
1000 parallel clients
3 bytes payload
keep alive: 1
1.00% <= 7 milliseconds
25.00% <= 8 milliseconds
///省略
执行 redis-benchmark-h 192.168.10.161-p6379-g-d 100 命令的作用是测试存取大小为 100 字节的数据包的性能。
[root@localhost ~]# redis-benchmark -h 192.168.10.101 -p 6379 -q -d 1000
PING_INLINE: 209643.61 requests per second
PING_BULK: 215982.72 requests per second
SET: 178890.88 requests per second
GET: 205761.31 requests per second
INCR: 219780.22 requests per second
///省略
# 测试连接
PING # 返回 PONG
# 设置键值并检查存在性
SET name "豆包"
EXISTS name # 返回 1(存在)
EXISTS age # 返回 0(不存在)
# 设置过期时间
SET temp_key "临时值"
EXPIRE temp_key 10 # 10秒后过期
TTL temp_key # 返回剩余秒数(如9、8...)
# 删除键
DEL name # 返回 1(删除成功)
GET name # 返回 nil(已删除)
SELECT 1 # 切换到数据库1
SET db1_key "值"
DBSIZE # 返回 1(当前库有1个键)
FLUSHDB # 清空当前库
DBSIZE # 返回 0
FLUSHALL # 清空所有库
# 设置与获取
SET counter 100
GET counter # 返回 "100"
# 批量操作
MSET user:1:name "张三" user:1:age 20
MGET user:1:name user:1:age # 返回 ["张三", "20"]
# 数值增减
INCR counter # 返回 101
INCRBY counter 5 # 返回 106
DECR counter # 返回 105
# 记录页面访问量
INCR page:home:views # 每次访问自增1
# 缓存用户信息(30分钟过期)
SET user:info:123 '{"name":"李四","age":25}' EX 1800
# 存储用户信息
HSET user:100 name "王五"
HSET user:100 age 30
HSET user:100 gender "男"
# 获取单个字段
HGET user:100 name # 返回 "王五"
# 获取所有字段
HGETALL user:100
# 返回:
# 1) "name"
# 2) "王五"
# 3) "age"
# 4) "30"
# 5) "gender"
# 6) "男"
# 批量设置
HMSET product:1 name "手机" price 3999 stock 100
# 获取所有字段名/值
HKEYS product:1 # 返回 ["name", "price", "stock"]
HVALS product:1 # 返回 ["手机", "3999", "100"]
# 生产者入队
RPUSH msg_queue "消息1"
RPUSH msg_queue "消息2"
RPUSH msg_queue "消息3"
# 消费者出队
LPOP msg_queue # 返回 "消息1"
LPOP msg_queue # 返回 "消息2"
LPUSH undo_stack "操作1"
LPUSH undo_stack "操作2"
LPOP undo_stack # 返回 "操作2"(后进先出)
LPUSH logs "日志1"
LPUSH logs "日志2"
LTRIM logs 0 9 # 只保留前10条
# 记录访问用户(自动去重)
SADD visitors:20230624 "user1"
SADD visitors:20230624 "user2"
SADD visitors:20230624 "user1" # 重复添加无效
SCARD visitors:20230624 # 返回 2(用户数)
SMEMBERS visitors:20230624 # 返回 ["user1", "user2"]
# 用户标签
SADD user:1:tags "技术" "编程" "阅读"
SADD user:2:tags "技术" "运动" "音乐"
# 共同标签(交集)
SINTER user:1:tags user:2:tags # 返回 ["技术"]
# 所有标签(并集)
SUNION user:1:tags user:2:tags # 返回 ["技术", "编程", "阅读", "运动", "音乐"]
# 记录用户分数
ZADD leaderboard 100 "用户A"
ZADD leaderboard 200 "用户B"
ZADD leaderboard 150 "用户C"
# 获取前三名(分数从高到低)
ZREVRANGE leaderboard 0 2 WITHSCORES
# 返回:
# 1) "用户B"
# 2) "200"
# 3) "用户C"
# 4) "150"
# 5) "用户A"
# 6) "100"
# 获取用户C的排名
ZREVRANK leaderboard "用户C" # 返回 1(第2名,索引从0开始)
# 记录文章访问时间(时间戳作为分数)
ZADD article:views 1687600000 "article1"
ZADD article:views 1687601000 "article2" # 最新访问
# 获取最近3篇文章
ZREVRANGE article:views 0 2
# 返回: ["article2", "article1"]
# 设置缓存(60秒过期)
SET cache:data '{"key":"value"}' EX 60
# 获取缓存,若不存在则重新生成
GET cache:data
# 若返回 nil,则重新计算数据并 SET
# 获取锁(原子操作)
SET lock:resource "locked" NX PX 10000
# NX: 仅当键不存在时设置
# PX: 过期时间(毫秒)
# 释放锁
DEL lock:resource
# 普通操作(多次网络往返)
SET key1 "value1"
SET key2 "value2"
GET key1
GET key2
# Pipeline(一次往返)
MULTI
SET key1 "value1"
SET key2 "value2"
GET key1
GET key2
EXEC
# 手动触发RDB快照
SAVE # 阻塞服务器
BGSAVE # 后台异步执行
# AOF重写
BGREWRITEAOF