【中间件】Redis
一、什么是Redis
- Redis是一个开源(BSD许可),
内存存储
的数据结构服务器,可用作数据库,高速缓存和消息队列代理
。 - 它支持
字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型
。 - 内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
二、Redis优势
-
高性能:Redis以
内存
作为数据存储介质,因此读写速度非常快。它使用单线程
模型,避免了多线程带来的上下文切换开销,进一步提高了性能。 -
数据结构丰富:Redis支持多种数据结构,如
字符串、列表、哈希、集合、有序集合
等,这使得开发人员可以更方便地存储和操作数据。 -
持久化支持:Redis可以将数据持久化到磁盘,以便在重启后恢复数据。它提供了两种持久化方式:
RDB(Redis Database)和AOF(Append Only File)
,开发人员可以根据需求选择适合的方式。 -
高可用性:Redis支持主从复制、哨兵和集群等机制,以实现
高可用性和数据的容错性
。主从复制可以实现数据的读写分离,提高系统的并发处理能力;哨兵可以监控主节点的状态,并在主节点宕机时自动切换为新的主节点;集群则可以将数据分布在多个节点上,提供更高的吞吐量和可扩展性。 -
支持事务和Lua脚本:Redis支持事务,可以将多个命令打包成一个事务进行
原子性
的执行。此外,它还支持通过Lua脚本执行复杂的操作,进一步提高了开发的灵活性。 -
缓存功能:作为一种常见的
缓存
方案,Redis可以将热门数据存储在内存中,加快读写速度,并减轻后端数据库的压力。 -
分布式锁支持:Redis可以使用其原子性操作的特性实现
分布式锁
,解决并发场景下的资源竞争问题。 -
丰富特性:支持 publish/subscribe, 通知, key 过期等等特性。
三、Redis的5种基本数据类型
- String(字符串):最基本的数据类型,可以存储任意类型的数据,例如整数、浮点数、JSON字符串等。
- 缓存数据:将经常访问的数据存储在Redis的String类型中,加速读取速度。
- 计数器:使用INCR命令可以实现自增或自减操作,可以用于记录网站的访问量或用户的积分。
# 设置键为"key1"的值为"hello"
SET key1 "hello"
# 获取键为"key1"的值
GET key1
- Hash(哈希):类似于字典或关联数组,用于存储键值对的集合。可以对某个键的单个字段进行操作,也可以对整个哈希对象进行操作。
- 用户信息存储:将用户的基本信息存储在一个Hash类型的键中,每个字段存储一个属性,方便查询和修改。
- 商品信息存储:将商品的各个属性(名称、价格、库存等)存储在一个Hash类型的键中,方便获取商品详情。
# 设置键为"user"的哈希对象的字段和值
HSET user name "John"
HSET user age 25
# 获取键为"user"的哈希对象的字段值
HGET user name
HGET user age
- List(列表):有序的字符串列表,可以在列表的两端进行插入和删除操作。常用于实现队列、栈等数据结构。
- 消息队列:将需要处理的任务或消息作为列表中的元素,通过LPUSH和RPOP等操作进行任务的发布和消费。
- 历史记录:将用户的操作记录存储在列表中,可以通过向列表头部或尾部插入元素来记录最新的操作。
# 在列表的头部插入值
LPUSH fruits "apple"
LPUSH fruits "banana"
# 获取列表中的所有值
LRANGE fruits 0 -1
- Set(集合):无序的字符串集合,不允许重复的元素。可以进行交集、并集、差集等集合操作。
- 好友列表:将用户的好友关系存储在一个集合中,通过SADD和SREM等操作来添加或删除好友。
- 唯一值存储:可以用集合存储唯一的标签、用户标识等,通过SADD命令来保证元素的唯一性。
# 添加元素到集合
SADD colors "red"
SADD colors "blue"
# 获取集合中的所有元素
SMEMBERS colors
- Sorted Set(有序集合):类似于Set,但每个成员都关联着一个分数,用于进行排序。可以根据分数进行范围查询和按分数排序。
- 排行榜:将用户的分数作为有序集合的分数,用户的ID作为成员,通过ZADD和ZREVRANGE命令来实现排名查询。
- 任务调度:将需要按照优先级执行的任务存储在有序集合中,通过ZADD和ZRANGE命令来按优先级获取任务。
# 添加带有分数的元素到有序集合
ZADD scores 90 "Alice"
ZADD scores 85 "Bob"
# 获取有序集合中分数最高的元素
ZREVRANGE scores 0 0
这些数据类型除了支持基本的操作(如读取、写入、删除),还提供了一系列丰富的操作方法,例如对字符串进行自增、对列表进行范围查询、对集合进行交集运算等。
除了这些基本数据类型,Redis还提供了其他高级数据结构,如位图(Bitmap)、布隆过滤器(Bloom Filter)、HyperLogLog等,用于解决特定的问题和优化性能。
四、Redis的持久化机制
数据在重启或异常情况下的可恢复性:RDB(Redis Database)和AOF(Append Only File)。
- RDB持久化:
- RDB持久化通过将Redis内存中的数据快照(Snapshot)写入磁盘来进行持久化。RDB文件是一个二进制文件,包含了当前数据库的数据状态。
- RDB持久化可以手动或自动触发,手动触发可以使用SAVE或BGSAVE命令,自动触发可以通过配置设置定期保存快照的时间。
- RDB持久化的优点是快速、紧凑和经济,适合用于备份数据、离线分析等。
- RDB持久化的缺点是在发生故障时会丢失最后一次快照之后的数据。
- AOF持久化:
- AOF持久化通过将Redis的写命令追加到AOF文件的末尾来进行持久化。AOF文件是一个文本文件,记录了对Redis服务器进行写操作的命令。
- AOF持久化可以以三种方式进行:关闭(关闭持久化),每秒同步(每秒同步一次AOF文件),文件追加(每条写命令追加到AOF文件)。
- AOF持久化的优点是在故障恢复时有更好的数据完整性,可以通过AOF文件重放恢复所有写操作。
- AOF持久化的缺点是相对于RDB持久化,AOF文件会更大,恢复时间更长。
可以根据业务需求选择合适的持久化机制,也可以同时使用两种机制来提供更好的数据保护。
AOF和RDB一起使用的好处:
- AOF:每个写操作都以追加方式记录,可以实现
较高的写性能
,保证较高的数据安全性
。 - RDB:保存数据的快照,
恢复速度更快
,适用于定期备份和灾难恢复
注:两种方式全部开启的话,Redis重启时会默认使用AOF的方式重新构建数据
AOF和RDB的优势对比:
*
表示相对有优势的点
优势 | AOF | RDB |
---|---|---|
数据安全性 | * 增量持久化,每个写操作以追加方式记录,保证数据安全性 | 快照备份,保存整个数据集,确保数据的完整性 |
写入性能 | 相对较慢,因为需要将每个操作追加到AOF文件中 | * 相对较快,因为只需要在特定间隔生成一次RDB文件 |
恢复速度 | 相对较慢,需要执行AOF日志文件中的所有写操作恢复数据 | * 相对较快,只需要加载RDB文件即可恢复数据 |
文件大小 | AOF文件通常会比RDB文件更大,因为记录每个写操作 | * RDB文件通常比AOF文件更小,因为只保存数据的快照 |
适用场景 | * 适用于数据安全性要求较高的场景,如金融、电商等 | * 适用于对性能和存储空间要求较高的场景,如游戏、社交媒体等 |
容灾备份 | * 提供增量备份,记录数据修改操作,确保数据的完整性 | * 提供快照备份,方便定期备份和灾难恢复 |
恢复点选择 | * 可以选择恢复到任意的AOF文件位置,灵活度更高 | 只能恢复到最近生成的RDB文件,不如AOF灵活 |
内存效率 | 略低,因为需要记录每个写操作到AOF文件中 | * 较高,因为RDB文件保存了数据的快照,不需要记录每个操作 |
使用复杂度 | 相对较高,需要更多的配置和监控,如AOF重写,文件合并等 | * 相对较低,只需定期生成RDB文件 |
五、Redis具体业务场景的使用示例
-
缓存:Redis最常见的使用场景是作为缓存层,将频繁读取的数据存储在Redis中,以减轻数据库的压力。
例如,将热门商品、用户登录信息、验证码等缓存到Redis中,可以大幅提高访问速度和系统的扩展性。 -
会话管理:Redis可用于存储用户会话数据
例如用户登录状态、购物车信息等。通过将会话数据存储在Redis中,可以实现分布式系统下多台服务器之间实时共享用户的登录状态和购物车数据。 -
分布式锁:Redis提供了原子性操作和高性能的特点,非常适合实现分布式锁。
在分布式系统中,可以使用Redis的 SETNX 命令来实现分布式锁,以保证在多个进程或服务器之间互斥地访问共享资源。 -
计数器、排行榜:Redis的原子性操作和高性能特点使其成为实现计数器和排行榜的理想选择。
例如,可以使用Redis的 INCRBY 命令来实现实时计数器,记录网站的访问量或用户的点赞数;使用有序集合来存储用户的积分信息,并根据积分进行排行。 -
消息队列:Redis的发布/订阅功能可以用于实现简单的消息队列。
消息发布者将消息发布到指定的频道,而订阅者可以订阅感兴趣的频道并接收消息,从而实现简单的消息通信和任务分发。 -
实时更新:Redis的高性能和持久化功能使其非常适合处理实时更新的场景
例如实时聊天、实时数据分析等。通过将实时数据存储在Redis中,并使用Redis的发布/订阅功能或数据持久化功能,可以实现实时更新和处理实时数据。
分布式锁,分布式缓存,lau脚本,数据类型详解等待后续补充