Redis 入门与实践
1. Redis 基础概念
Redis(Remote Dictionary Server)是一个开源的基于内存的键值存储系统,具有非常高的读写性能,通常用于缓存、会话存储、消息队列等场景。与传统的关系型数据库相比,Redis 是一个非关系型数据库,具有以下特点:
基于内存:Redis 将所有数据存储在内存中,提供了极快的读写速度,非常适合需要高性能的数据访问场景。
数据持久化:虽然 Redis 是内存型数据库,但它支持数据的持久化(RDB 快照和 AOF 日志),可以定期将数据同步到磁盘中。
丰富的数据类型:Redis 支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。
传统的磁盘型数据库由于数据存储在磁盘上,读写性能受限,而内存数据库则能够显著提高数据访问速度。Redis 的典型应用场景包括:
缓存:将频繁访问的数据缓存到内存中,减少对磁盘的读写操作,加快响应速度。
会话存储:将用户的会话信息存储在 Redis 中,方便快速读取和管理。
消息队列:通过 Redis 的列表数据结构,可以实现简单的消息队列功能。
Redis 不仅在基础的键值存储和缓存方面表现出色,它的进阶应用包括事务、持久化、发布/订阅模式、Streams 消息队列、集群管理和 Lua 脚本等功能,使其在分布式系统、高并发场景下具有强大的灵活性和扩展性。
2. Redis 核心操作与 SQL 对比
Redis 的操作类似于 SQL 数据库中的基本操作,但 Redis 使用的是更简洁的命令格式。下面展示一些常用 Redis 命令以及它们与 SQL 的对比。
2.1. 设置键值对
1. Redis
SET key "value"
2. SQL
INSERT INTO table (key, value) VALUES ('key', 'value');
2.2. 获取键值
1. Redis
GET key
2. SQL
SELECT value FROM table WHERE key = 'key';
2.3. 删除键值
1. Redis
DEL key
2. SQL
DELETE FROM table WHERE key = 'key';
2.4. Redis 的多种数据类型
Redis 支持多种数据结构,以下是几个常见的数据类型和它们的基本操作。
2.4.1. 字符串
字符串是 Redis 中最基础的数据类型。可以是文本、数字或二进制数据。
1. 设置字符串
SET mykey "Hello, Redis"
2. 获取字符串
GET mykey
2.4.2. 哈希
哈希类似于 SQL 的表结构,它用于存储键值对集合。
1. 设置哈希
HSET user:1000 name "Alice" age 25
2. 获取哈希值
HGETALL user:1000
2.4.3. 列表
列表是按插入顺序存储的字符串序列,可以用作消息队列。
1. 向列表头部插入元素
LPUSH mylist "item1"
2. 从列表中弹出元素
LPOP mylist
2.4.4. 集合
集合是一个无序的字符串集合,支持集合间的并集、交集等操作。
1. 向集合添加元素
SADD myset "element1"
2. 获取集合中的所有元素
SMEMBERS myset
2.4.5. 有序集合
有序集合与集合类似,但每个元素会关联一个分数,Redis 会按照分数进行排序。
1. 添加元素到有序集合
ZADD myzset 1 "element1"
2. 获取有序集合中的所有元素
ZRANGE myzset 0 -1
3. 用户登录身份存储与 PostgreSQL 集成
在实际项目中,Redis 通常与持久化存储(如 PostgreSQL)一起使用。Redis 可以存储用户的登录状态或会话信息,而 PostgreSQL 则用于存储持久化的用户数据。
3.1. 使用 Redis 存储用户登录会话
在用户登录时,可以将用户的会话信息存储在 Redis 中,以实现快速的会话管理。
1. 设置用户会话
SET user:session:1234 "logged_in"
2. 获取用户会话
GET user:session:1234
3.2. 将 Redis 与 PostgreSQL 集成
我们可以结合 Redis 和 PostgreSQL 来实现用户登录时的身份验证和数据持久化。
1. 在 PostgreSQL 中存储用户的基础数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
2. 在 Redis 中存储用户的登录状态
SET user:1234:session "active"
3. 查询用户数据与会话状态
可以通过 Redis 提供快速的会话验证,同时通过 PostgreSQL 获取用户的详细数据。例如,当用户访问应用时,首先查询 Redis 是否存在会话信息,如果存在则直接从 PostgreSQL 获取用户的其他信息。
4. Redis 进阶应用
4.1. Redis 事务
Redis 提供了简单的事务支持,允许多个命令在事务中顺序执行,并保证命令要么全部执行,要么全部不执行。
Redis 的事务通过 MULTI 和 EXEC 来实现。
1. 使用示例
MULTI
SET key1 "value1"
SET key2 "value2"
EXEC
在事务中,可以连续执行多个命令,直到 EXEC
提交时,所有命令会按顺序执行。
2. 注意事项
Redis 的事务不支持回滚。如果某个命令执行失败,其他命令依然会执行。
如果事务中的某些命令在
EXEC
时失败,Redis 只会返回错误,但不会中断其他命令的执行。
4.2. Redis 持久化
虽然 Redis 是一个内存数据库,但它支持将数据持久化到磁盘,避免数据丢失。Redis 提供了两种持久化方式:RDB快照和 AOF日志。
4.2.1. RDB 持久化
RDB 是将 Redis 数据快照保存为二进制文件的持久化方式,可以定期将数据写入磁盘。RDB 的优点是文件小,适合备份,但它不能实时保存数据。
1. 开启 RDB 持久化
可以通过 save 配置选项指定多久自动生成一次快照,例如:
save 900 1 # 每15分钟至少有1个更改时保存一次快照
save 300 10 # 每5分钟至少有10个更改时保存一次快照
2. 手动触发 RDB 保存
SAVE
4.2.2. AOF 持久化
AOF 是将每条写命令都记录到日志中的持久化方式。AOF 允许 Redis 通过重放日志文件来重建数据库,支持更高的实时性。
1. 开启 AOF 持久化
在 redis.conf 中设置:
appendonly yes
2. AOF 的三种同步策略
appendfsync always:每次写命令都立即同步到磁盘,性能较差,但最安全。
appendfsync everysec:每秒同步一次,权衡了性能与数据安全性。
appendfsync no:不强制同步,由操作系统自行决定何时将数据写入磁盘。
4.3. Redis 发布/订阅
Redis 提供了发布/订阅模式,允许消息发送者将消息发送到一个或多个通道,订阅者可以订阅这些通道来接收消息。
1. 发布消息
PUBLISH mychannel "Hello, Redis!"
2. 订阅频道
在另一个客户端中订阅该频道:
SUBSCRIBE mychannel
当 mychannel 上有新的消息发布时,订阅者会收到该消息。
4.4. Redis 流
Redis Streams 是 Redis 5.0 引入的一个新的数据结构,类似于消息队列。它允许生产者向流中追加消息,消费者从流中读取消息。与发布/订阅不同的是,Streams 可以保留消息历史,因此新加入的消费者可以读取以前的消息。
4.4.1. 创建和使用 Redis 流
1. 添加消息到流
XADD mystream * message "Hello World"
2. 读取消息
XREAD COUNT 2 STREAMS mystream 0
4.4.2. 消费者组
Redis Streams 支持消费者组,使得多个消费者可以同时处理消息,确保每条消息只被其中一个消费者处理。
1. 创建消费者组
XGROUP CREATE mystream mygroup $ MKSTREAM
2. 读取消息
XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream >
4.5. Redis 集群
Redis 集群是通过将数据分布在多个 Redis 实例上,来实现数据的高可用性和扩展性。Redis 集群支持自动分片,并在主节点出现故障时自动进行故障转移。
集群模式安装:
1. 使用 Docker 运行 Redis 集群模式
docker run -d --name redis-node1 redis --cluster-enabled yes --port 7000
docker run -d --name redis-node2 redis --cluster-enabled yes --port 7001
docker run -d --name redis-node3 redis --cluster-enabled yes --port 7002
2. 使用 redis-cli 命令创建集群
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1
集群模式下,Redis 将自动管理数据分片和复制,确保系统的高可用性。