文章目录
1. 认识 Redis
1.1 Redis是什么
Redis(Remote Dictionary Server,远程字典服务)是一个开源的、基于内存的、支持持久化的键值对(Key-Value)存储系统。它通常被归类为 NoSQL 数据库、缓存和消息中间件。
基于内存 是其高性能的主要原因,数据主要存储在内存中,读写速度极快。键值对是其基本数据模型,但 Value 支持多种复杂数据结构,这使其远超简单的键值存储。
1.2 核心特点
- 极致性能
数据操作主要在内存中完成,配合高效的底层数据结构(如跳跃表、哈希表)和单线程架构(避免上下文切换和竞争条件),使其能达到每秒数十万次的读写性能。 - 丰富的数据结构
不仅是简单的字符串(String),还支持列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash)、位图(Bitmap)等。这使得开发者可以直接在数据库层完成复杂逻辑,减少应用代码的复杂性。 - 功能完备
- 持久化:支持 RDB(快照)和 AOF(日志)两种方式将内存数据保存到磁盘,防止数据丢失。
- 高可用与复制:通过 Redis Sentinel(哨兵)实现自动故障转移,保证服务高可用;通过主从复制实现数据备份和读写分离。
- 事务:支持简单的事务操作,保证一系列命令的原子性执行。
- 发布/订阅(Pub/Sub):提供消息发布订阅功能,可用于简单的消息队列场景。
- Lua 脚本:支持执行 Lua 脚本,实现复杂的原子操作。
- 单线程与原子性
Redis 的核心网络请求处理模块是单线程的,任何命令操作都是原子性的,无需担心并发问题,简化了开发。
1.3 典型应用场景
| 应用场景 | 说明与举例 |
|---|---|
| 缓存(Cache) | 最主要、最经典的应用。将热点数据(如数据库查询结果、页面片段)存放在 Redis 中,极大减轻后端数据库的压力,提升应用响应速度。例如:电商网站的商品信息、社交媒体的用户动态。 |
| 会话存储(Session Storage) | 在分布式或微服务架构中,将用户登录会话(Session)集中存储在 Redis 中,实现多台应用服务器共享会话,解决状态同步问题。 |
| 排行榜/计数器 | 利用有序集合(Sorted Set) 可以轻松实现实时排行榜,如游戏积分榜、商品销量榜。利用 INCR/DECR 命令实现原子性的计数器,如文章阅读量、点赞数。 |
| 消息队列(Message Queue) | 利用列表(List) 的阻塞弹出操作(BLPOP/BRPOP或发布/订阅(Pub/Sub)功能,可以实现轻量级的消息队列、异步任务处理,缓解系统高峰期压力。 |
| 布式锁(Distributed Lock) | 在分布式系统中,利用Redis的 SETNX(Set if not exists)命令可以实现简单的分布式锁,用于控制多个进程对共享资源的并发访问。 |
注意:
- 数据容量:由于数据存储在内存中,成本较高,不适合存储超大规模(如 TB 级别)的冷数据。
- 持久化权衡:RDB 持久化可能丢失最后一次快照后的数据,AOF 持久化会影响写入性能,需要根据业务场景进行配置和权衡。
2. 安装与配置
2.1 在Linux上安装 Redis
这里介绍两种最常用的安装方法:使用包管理器安装(简单快捷,适合大多数用户)和编译源码安装(能获取最新版本,更灵活),Linux以 Ubuntu/Debian 为例。
2.1.1 方法一:使用包管理器安装
- 更新软件包列表
sudo apt update
- 安装Redis
sudo apt install redis-server
这个命令会自动安装 Redis 服务器及其依赖项,并将其配置为系统服务。
- 运行Redis
# 检查运行状态
sudo systemctl status redis-server
# 启动 Redis 服务
sudo systemctl start redis-server
# 停止 Redis 服务
sudo systemctl stop redis-server
# 重启 Redis 服务(修改配置后常用)
sudo systemctl restart redis-server
# 设置开机自动启动
sudo systemctl enable redis-server
2.1.2 方法二:编译源码安装
- 安装编译依赖
sudo apt update
sudo apt install build-essential tcl
- 下载并解压源码(访问 Redis.io 获取最新稳定版链接)
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
- 编译与安装
make
sudo make install
编译成功后,Redis 的可执行文件(如 redis-server, redis-cli)会被安装到 /usr/local/bin/ 目录下。
- 运行Redis
- 前台直接启动(适用于测试)
redis-server
Redis 服务器将在当前终端前台运行,所有日志信息会直接打印在屏幕上。按 Ctrl + C 即可停止服务。
- 使用配置文件后台启动
# 复制配置文件(建议)
sudo mkdir -p /etc/redis
sudo cp redis.conf /etc/redis/
# 编辑配置文件,将 daemonize 参数改为 yes,使其在后台运行
sudo nano /etc/redis/redis.conf
# 找到 daemonize no 这一行,将其修改为:daemonize yes
# 指定配置文件启动
redis-server /etc/redis/redis.conf
# 停止后台运行的 Redis
# 首先找到进程号(PID)
ps aux | grep redis-server
# 然后使用 命令结束进程
kill PID
# 或者使用redis-cli命令安全关闭
redis-cli shutdown
- 配置为系统服务
为了方便管理,可以手动为源码安装的Redis创建 systemd 服务文件
(1)创建服务文件:sudo nano /etc/systemd/system/redis.service
(2)创建用户:sudo adduser --system --group --no-create-home redis
(3) 输入以下内容(可能需要根据您的实际路径调整)
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
(3)重新加载 systemd 并启用服务
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis
之后就可以systemctl 命令来管理了。
2.2 使用 Redis 命令行客户端
- 连接服务器:
# 连接本地默认服务器(127.0.0.1:6379)
redis-cli
# 连接远程服务器或指定端口
redis-cli -h your_host -p your_port -a your_password
- 进行基本操作
# 设置一个键值对
SET mykey "Hello, Redis!"
# 获取键对应的值
GET mykey
# 判断键是否存在
EXISTS mykey
# 删除一个键
DEL mykey
# 查看所有键(生产环境慎用,数据量大时可能阻塞服务)
KEYS *
# 使用完后,退出客户端
QUIT
2.3 主配置文件 redis.conf
Redis 的配置非常灵活,几乎全部通过 redis.conf 文件管理。理解关键参数是进行生产环境配置的基础。
配置文件位置:通常位于 /etc/redis/redis.conf(包管理器安装)或解压目录的根目录(源码安装)。
配置文件修改后需要重新Redis生效配置: sudo systemctl restart redis-server。
redis.conf重要参数:
| 参数 | 默认值/示例 | 说明 |
|---|---|---|
port | 6379 | Redis 服务器监听的端口号。 |
bind | 127.0.0.1 | 允许连接的 IP 地址。127.0.0.1 表示仅允许本地连接。如需远程连接,需改为 0.0.0.0(允许所有IP)或指定IP,但这会带来安全风险,必须设置密码。 |
daemonize | no | 是否以守护进程(后台)方式运行。改为 yes 即可后台运行。 |
requirepass | foobared | 连接密码。默认被注释(即无密码)。生产环境必须设置强密码。 |
dir | ./ | 工作目录,RDB 持久化文件和 AOF 文件会写入这个目录。通常改为 /var/lib/redis。 |
dbfilename | dump.rdb | RDB 持久化数据文件的名称。 |
appendonly | no | 是否开启 AOF 持久化模式。yes 为开启,能提供更好的持久化保证。 |
appendfilename | appendonly.aof | AOF 持久化文件的名称。 |
3. 五大核心数据结构与命令
3.1 String(字符串)
特点:最基本的数据类型,一个 Key 对应一个 Value。Value 不仅是字符串,也可以是数字(整数或浮点数)甚至是二进制数据(如图片序列化),最大容量为 512MB。
常用命令:
| 命令 | 语法 | 描述 | 示例 |
|---|---|---|---|
| SET | SET key value [EX seconds] [PX milliseconds] | 设置键值对,可设置过期时间。 | SET username "zhangsan" EX 3600 (设置用户名,1小时后过期) |
| GET | GET key | 获取指定 Key 的值。 | GET username → "zhangsan" |
| INCR | INCR key | 将 Key 中储存的数字值增一。原子性操作。 | SET views 10 INCR views → 11 |
| DECR | DECR key | 将 Key 中储存的数字值减一。原子性操作。 | DECR stock |
| MSET | MSET key1 value1 key2 value2 ... | 同时设置多个键值对。 | MSET k1 v1 k2 v2 |
| MGET | MGET key1 key2 ... | 同时获取多个 Key 的值。 | MGET k1 k2 → 1) "v1" 2) "v2" |
| STRLEN | STRLEN key | 返回 Key 所储存的字符串值的长度。 | STRLEN username → 8 |
应用场景:
- 缓存:缓存数据库查询结果、页面片段。
- 计数器:文章阅读量、用户点赞数、网站访问量。
- 分布式 Session:存储用户登录凭证。
- 存储小规模二进制数据。
3.2 List(列表)
特点:一个有序的字符串列表,元素可以重复。按照插入顺序排序,可以在列表的头部(左边)或尾部(右边)进行添加或删除操作,底层实现是双向链表。
常用命令:
| 命令 | 语法 | 描述 | 示例 |
|---|---|---|---|
| LPUSH | LPUSH key element [element ...] | 将一个或多个值插入到列表头部(左边)。 | LPUSH tasks "task1" |
| RPUSH | RPUSH key element [element ...] | 将一个或多个值插入到列表尾部(右边)。 | RPUSH tasks "task5" |
| LPOP | LPOP key | 移除并返回列表的头部(第一个)元素。 | LPOP tasks → "task1" |
| RPOP | RPOP key | 移除并返回列表的尾部(最后一个)元素。 | RPOP tasks → "task5" |
| LRANGE | LRANGE key start stop | 返回列表中指定区间内的元素,0 表示第一个元素,-1 表示最后一个元素。 | LRANGE tasks 0 -1 (获取所有元素) LRANGE tasks 0 2 (获取前3个元素) |
| LLEN | LLEN key | 获取列表长度。 | LLEN tasks |
应用场景:
- 消息队列:使用
LPUSH(生产消息)和BRPOP(阻塞式消费消息)实现。 - 最新列表:如朋友圈时间线、最新新闻,用
LPUSH加入新元素,用LTRIM限制长度。 - 记录操作日志。
3.3 Hash(哈希表)
特点:一个 String 类型的 Field 和 Value 的映射表,特别适合用于存储对象。可以将一个 Hash 结构理解为关系型数据库中的一行数据。
常用命令:
| 命令 | 语法 | 描述 | 示例(存储用户信息) |
|---|---|---|---|
| HSET | HSET key field value [field value ...] | 设置哈希表中一个或多个字段的值。 | HSET user:1001 name "Alice" age 30 |
| HGET | HGET key field | 获取哈希表中指定字段的值。 | HGET user:1001 name → "Alice" |
| HGETALL | HGETALL key | 获取哈希表中所有字段和值。 | HGETALL user:1001 → 1) "name" 2) "Alice" 3) "age" 4) "30" |
| HMSET | HMSET key field value [field value ...] | 已弃用,HSET 已具备相同功能。 | 同 HSET |
| HDEL | HDEL key field [field ...] | 删除哈希表中的一个或多个字段。 | HDEL user:1001 age |
| HKEYS | HKEYS key | 获取哈希表中的所有字段名。 | HKEYS user:1001 → 1) "name" |
| HLEN | HLEN key | 获取哈希表中字段的数量。 | HLEN user:1001 → 1 |
应用场景:
- 存储对象:用户信息、商品信息、配置信息等。比将对象序列化成 JSON 字符串更灵活,可以单独修改某个字段。
3.4 Set(集合)
特点:String 类型的无序集合,集合成员是唯一的,不允许重复。支持丰富的集合运算,如交集、并集、差集。
常用命令:
| 命令 | 语法 | 描述 | 示例 |
|---|---|---|---|
| SADD | SADD key member [member ...] | 向集合添加一个或多个成员。 | SADD tags "java" "redis" "python" |
| SMEMBERS | SMEMBERS key | 返回集合中的所有成员。 | SMEMBERS tags → 1) "java" 2) "python" 3) "redis" (无序) |
| SISMEMBER | SISMEMBER key member | 判断 member 元素是否是集合 key 的成员。 | SISMEMBER tags "java" → 1 (表示存在) |
| SINTER | SINTER key1 [key2] | 返回所有给定集合的交集。 | SINTER user:1001:tags user:1002:tags (求用户1001和1002的共同标签) |
| SUNION | SUNION key1 [key2] | 返回所有给定集合的并集。 | SUNION user:1001:tags user:1002:tags |
| SREM | SREM key member [member ...] | 移除集合中一个或多个成员。 | SREM tags "python" |
| SCARD | SCARD key | 获取集合的成员数。 | SCARD tags → 2 |
应用场景:
- 标签系统:给用户、文章打标签。
- 共同好友/关注:求两个用户的共同好友。
- 抽奖/随机推荐:使用
SRANDMEMBER随机获取元素。 - 数据排重:确保数据唯一性。
3.5 Sorted Set(有序集合 / ZSet)
特点:与 Set 类似,也是 String 类型元素的集合,且不允许重复。但每个元素都会关联一个 double 类型的分数(Score)。Redis 正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但分数可以重复。
常用命令:
| 命令 | 语法 | 描述 | 示例(游戏排行榜) |
|---|---|---|---|
| ZADD | ZADD key [NX|XX] [CH] [INCR] score member [score member ...] | 向有序集合添加一个或多个成员,或更新已存在成员的分数。 NX 仅添加新成员,不更新已存在的成员 与 XX 互斥 XX 仅更新已存在的成员,不添加新成员 与 NX 互斥 CH 返回被更改(新添加或更新)的成员数量 默认只返回新添加数量 INCR 将 ZADD 的行为改为类似 ZINCRBY,即增加分数 此时只能指定一个分数-成员对 | ZADD leaderboard 1000 "Alice" 800 "Bob" |
| ZRANGE | ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员(低分到高分)。 | ZRANGE leaderboard 0 -1 WITHSCORES (查看整个排行榜) ZRANGE leaderboard 0 2 (查看前三名) |
| ZREVRANGE | ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低。常用于排行榜。 | ZREVRANGE leaderboard 0 2 WITHSCORES (查看得分最高的前三名) |
| ZRANK | ZRANK key member | 返回指定成员的排名(从 0 开始),按分数从低到高。 | ZRANK leaderboard "Bob" → 0 (排名第一,因为分数最低) |
| ZREVRANK | ZREVRANK key member | 返回指定成员的排名(从 0 开始),按分数从高到低。 | ZREVRANK leaderboard "Alice" → 0 (排名第一,因为分数最高) |
| ZSCORE | ZSCORE key member | 返回指定成员的分数。 | ZSCORE leaderboard "Alice" → "1000" |
| ZINCRBY | ZINCRBY key increment member | 为指定成员的分数增加增量 increment。原子性操作。 | ZINCRBY leaderboard 50 "Bob" (Bob 得分增加 50) |
应用场景:
- 排行榜:游戏积分榜、热搜榜、销量榜。
- 带权重的队列:分数代表优先级。
- 范围查找:如处理价格区间、时间线数据。
1058

被折叠的 条评论
为什么被折叠?



