1、介绍
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统。它可以用作数据库、缓存和消息代理。Redis 支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。
2、数据类型及操作
(1)字符串
字符串是 Redis 中最基本的类型。一个键对应一个值,值可以是字符串、整数或浮点数。
常用命令:
SET key value
:设置键的值。GET key
:获取键的值。INCR key
:将键的值增1(假设值为整数)。DECR key
:将键的值减1(假设值为整数)。MGET key1 key2 ... keyN
:获取多个键的值。
(2)列表
列表是一个有序的字符串集合,按照插入顺序排序。可以用作队列(FIFO)或栈(LIFO)。
常用命令:
LPUSH key value
:将值插入列表头部。RPUSH key value
:将值插入列表尾部。LPOP key
:移除并返回列表头部的元素。RPOP key
:移除并返回列表尾部的元素。LRANGE key start stop
:获取列表的指定范围元素。
(3)集合
集合是一个无序的字符串集合,不允许重复元素。
常用命令:
SADD key member
:向集合添加元素。SREM key member
:移除集合中的元素。SMEMBERS key
:获取集合中的所有元素。SISMEMBER key member
:判断元素是否在集合中。
(4)有序集合
有序集合类似于集合,但每个元素都会关联一个分数,元素按分数排序。
常用命令:
ZADD key score member
:向有序集合添加元素及其分数。ZREM key member
:移除有序集合中的元素。ZRANGE key start stop
:按分数排序获取指定范围的元素。ZRANGEBYSCORE key min max
:按分数范围获取元素。
(5)哈希
哈希是一个键值对集合,适用于存储对象。
常用命令:
HSET key field value
:设置哈希表中的字段值。HGET key field
:获取哈希表中的字段值。HMSET key field1 value1 field2 value2 ...
:设置多个字段值。HGETALL key
:获取哈希表中的所有字段和值。
(6)stream 流
Redis 5.0 引入了新的数据类型:流(Stream)。流是一种日志数据结构,非常适合处理时间序列数据、消息队列等应用场景。流数据类型允许以日志的形式追加数据,并且支持消费组(Consumer Group)的概念,方便实现消息队列的功能。
- 流(Stream):一个有序的键值对集合,每个条目都有一个唯一的 ID,ID 由时间戳和序列号组成。
- 条目(Entry):流中的每一项数据,由一个唯一的 ID 和一个字段-值对组成。
- 消费组(Consumer Group):用于实现消息队列的功能,多个消费者可以共同消费一个流。
常用命令
-
添加条目到流:
XADD mystream * field1 value1 field2 value2
-
创建消费组:
XGROUP CREATE mystream mygroup $
-
消费者读取条目:
XREADGROUP GROUP mygroup consumer COUNT 1 STREAMS mystream >
-
确认条目已处理:
XACK mystream mygroup 1609459200000-0
(7)消息队列
3、事务
(1)Redis如何支持事务
- MULTI:标记一个事务块的开始。
- EXEC:执行事务块中的所有命令。
# 开始事务
MULTI
# 添加一些命令到事务块
SET key1 "value1"
SET key2 "value2"
INCR counter
# 执行事务
EXEC
(2)Redis 事务的特点
- 原子性:事务中的命令按顺序执行,Redis 保证在
EXEC
命令执行时,事务中的所有命令要么全部执行,要么全部不执行。 - 隔离性:Redis 事务没有复杂的隔离级别,事务中的命令在
EXEC
之前不会被实际执行,因此不会产生中间状态。 - 一致性:事务执行前后,Redis 保证数据的一致性。
- 持久性:如果 Redis 配置了持久化机制(如 RDB 或 AOF),事务提交的结果会被持久保存。
注意⚠️:redis事务中其中一条命令执行失败,其他命令还会继续执行
4、持久化
(1)为什么要持久化?
基于内存的数据库,如果没无持久化,断电时数据会丢失
(2)如何持久化?
Redis 提供了两种主要的持久化机制来确保数据在内存之外的存储设备上保存
1)RDB(Redis Database)快照
RDB 是一种在指定时间间隔内生成数据集快照的持久化方式。它会将 Redis 内存中的数据以二进制格式保存到磁盘中。RDB 文件可以用于数据备份、灾难恢复等场景。
优点
- 性能高:RDB 文件是在指定时间间隔内生成的,因此对 Redis 的性能影响较小。
- 恢复速度快:RDB 文件是紧凑的二进制格式,加载速度快。
- 适合备份:RDB 文件非常适合用于定期备份(比如每天一次)。
缺点
- 数据丢失风险:由于 RDB 是在指定时间间隔内生成快照,若 Redis 崩溃,可能会丢失最近一次快照之后的数据。
- 生成快照时的性能开销:生成 RDB 文件时会进行 fork 操作,可能会对性能产生短暂的影响,特别是当数据集非常大时。
# 每 900 秒(15 分钟)如果有至少 1 个键被修改,则生成快照
save 900 1
# 每 300 秒(5 分钟)如果有至少 10 个键被修改,则生成快照
save 300 10
# 每 60 秒(1 分钟)如果有至少 10000 个键被修改,则生成快照
save 60 10000
2)AOF(Append-Only File)日志
AOF 是通过记录每个写操作来实现持久化的。Redis 将每个写操作追加到 AOF 文件中,可以通过重放 AOF 文件中的命令来重建数据集。
优点
- 更高的数据安全性:AOF 可以配置为每次写操作都进行同步(
appendfsync always
),因此可以最大程度地减少数据丢失。 - 可调的持久化策略:AOF 提供了多种同步策略,可以在性能和数据安全性之间进行权衡。
- 文件格式可读:AOF 文件是基于 Redis 命令的文本格式,便于分析和修改。
缺点
- 文件大小较大:由于记录了每个写操作,AOF 文件可能比 RDB 文件大。
- 恢复速度较慢:重放 AOF 文件中的所有命令可能比加载 RDB 文件慢。
- 性能开销:频繁的写操作可能会影响 Redis 的性能,特别是在同步策略为
always
时。
(3)混合持久化
Redis 4.0 引入了混合持久化模式,可以结合 RDB 和 AOF 的优点。在这种模式下,Redis 会在生成 RDB 文件的基础上追加 AOF 日志。这种方式既能保证数据恢复的速度,又能减少数据丢失的风险。
# 启用混合持久化
aof-use-rdb-preamble yes
(4)数据恢复
- RDB 恢复:只需将 RDB 文件放置到 Redis 数据目录(通常是
/var/lib/redis
)并命名为dump.rdb
,然后重启 Redis 即可。 - AOF 恢复:只需将 AOF 文件放置到 Redis 数据目录并命名为
appendonly.aof
,然后重启 Redis 即可。
(5)总结
- RDB:适用于需要定期备份和快速恢复的场景,性能较高,但在崩溃时可能会丢失一些数据。
- AOF:适用于需要最大限度减少数据丢失的场景,文件较大且恢复速度较慢,但提供了更高的数据安全性。