Redis概述
Remote Dictionary Server(远程字典服务器)
是一款开源高性能的(Key/Values)分布式内存数据库
也可以被视为一个缓存数据库
支持数据持久化(定期把内存里数据存储到硬盘)
支持多种数据类型:字符、列表、散列、集合
支持master-slave模式数据备份
默认监听端口是TCP/6379
中文网站www.redis.net.cn
- Redis特点
在大数据、高并发场景下具有广泛的应用前景
- 高性能:Redis的数据都存储在内存中,读写速度非常快。
- 持久化:支持数据的持久化存储,可以通过RDB快照和AOF日志两种方式进行数据备份,保证数据的安全性和可靠性。
- 支持多种数据类型:包括字符串、哈希、列表、集合,能够满足不同的业务需求。
- 支持分布式部署:通过集群方式实现数据的高可用性、负载均衡等功能。
- 丰富的功能:支持事务、发布订阅、Lua脚本、管道等功能,能够满足各种应用场景的需求
- Redis作为分布式内存数据库
特点
- 分布式:Redis Cluster 支持分布式存储,通过槽位(Slot)机制将数据分布在多个节点上。
- 高性能:Redis 使用内存存储,提供高速的数据读写操作。
- 持久化:Redis 支持持久化功能,可以将内存中的数据保存到磁盘,以防止数据丢失。
- 数据一致性:通过主从复制和哨兵机制(Redis Sentinel),Redis 可以实现数据一致性和高可用性。
适用场景
- 需要高性能和高可用性的应用场景。
- 需要分布式存储和数据冗余的应用场景。
- 需要持久化数据的应用场景。
示例
- 在一个分布式系统中,Redis 可以用作主数据库,存储用户数据和系统状态。
- 在一个电子商务平台中,Redis 可以用作订单系统的主数据库,确保数据一致性和高可用性。
- Redis 作为缓存数据库
特点
- 高性能:Redis 使用内存存储,提供高速的数据读写操作。
- 多数据结构:Redis 支持多种数据结构,包括字符串(Strings)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、哈希(Hashes)等。
- 缓存:Redis 可以用作缓存层,存储热点数据,减少数据库的负载。
适用场景
- 需要高性能和低延迟的缓存层应用。
- 需要存储热点数据和频繁访问的数据的应用。
- 需要减少数据库负载的应用。
示例
- 在一个电子商务平台中,Redis 可以用作缓存层,存储用户登录状态和购物车数据,减少数据库的负载。
- 在一个社交平台中,Redis 可以用作缓存层,存储热门帖子和用户消息,提高数据访问速度。
- Redis应用场景
- 计数器和排行榜:Redis的AtomicIncrement命令可以实现高效的计数器,而有序集合可以轻松实现排行榜功能。
- 分布式锁:Redis的SETNX命令和EXPIRE命令可以实现分布式锁,避免多个线程同时修改同一个资源。
- 实时消息系统:Redis的发布/订阅模式和Stream数据结构可以实现高效的实时消息系统,适用于在线聊天、推送等场景。。
- 日志收集:Redis的List数据结构可以轻松实现消息队列,用于日志收集等场景。
- 会话管理:Redis的数据结构和高性能可以用于实现高效的Session管理,提高Web应用程序的性能
常用命令
命令 | 作用 |
info | 获取Redis服务器的详细信息 |
set | 存储一个key值 |
mset | 存储多个key值 |
mget | 获取多个key值 |
select | 切换库 |
keys | 显示key名 |
exists | 测试key名是否存在 |
ttl | 查看key生存时间 |
type | 查看key类型 |
move | 移动key到指定库 |
expire | 设置key有效时间 |
del | 删除指定的key |
flushall | 删除内存里所有key |
flushdb | 删除所在库的所有key |
lpush | 将一个或多个值插入列表 |
lrange | 获取列表中指定范围内的元素 |
Redis槽位
在 Redis 中,槽位(Slot)是一个关键的逻辑概念,用于实现数据分片(Sharding)和分布式存储。槽位是 Redis Cluster(Redis 集群)中的核心概念,它将整个数据集划分为多个槽位,每个槽位负责管理一部分数据。通过槽位,Redis 可以实现数据的横向扩展和高可用性。
- 槽位的基本概念
- 槽位的数量:
- Redis Cluster 中有 16384 个槽位,编号从 0 到 16383
- 每个槽位负责管理一部分数据
- 数据分片:
- 每个键值对(Key-Value Pair)都会被分配到一个槽位中
- 数据的分配是通过对键(Key)进行哈希计算(CRC16 算法),然后将哈希值对 16384 取模,得到的结果就是该键值对所属的槽位
- 槽位分配:
- 在 Redis Cluster 中,每个节点(Node)负责管理一部分槽位
- 节点之间可以通过配置文件或命令行工具动态分配槽位
专业术语
- redis雪崩
在某个时间段内,Redis节点集群中大量的缓存数据同时过期或者失效,导致瞬间来了大量的请求,从而引发Redis服务性能异常下降甚至瘫痪的现象
- redis击穿
在某个时间点上,针对某一个特定的key大量请求到来,而该key恰好又不存在或者已经失效,导致请求全部落到数据库上,从而引发数据库压力过大,性能异常降甚至瘫痪的现象
- redis穿透
是指针对某个key的请求,在缓存和数据库中都不存在,导致每次请求都必须查询数据库,从而引发数据库压力过大,性能异常下降甚至瘫痪的现象
redis集群
Redis集群(Redis Cluster)是Redis提供的一种分布式数据存储解决方案,用来提高系统的扩展性、高可用性和性能。Redis集群通过数据分片(Sharding)和数据复制(Replication)机制,将数据分布在多个节点上,确保数据的高效存储和访问。
主从复制
Redis的主从复制是一种数据冗余机制,它允许将一台Redis服务器(主节点Master)的数据复制到其他Redis服务器(从节点Slave)。这种机制不仅提高了数据的可用性和容错性,还通过读写分离来提高性能。
- 主从复制的基本概念
- 主服务器(Master):负责处理写操作,并将这些操作同步给从服务器。
- 从服务器(Slave):只读服务器,默认情况下不允许写操作。从服务器会定期从主服务器获取最新的数据更新,并保持与主服务器的数据一致。
- 数据流向:数据的复制是单向的,只能由主服务器到从服务器。从服务器不能将数据写回主服务器
- 工作原理
- 从节点向主节点发送sync命令,请求复制数据
- 主节点收到sync命令后,启动一次后台的子进程,该子进程在后台执行数据复制和传输的操作
- 主节点子进程将该节点在复制缓冲区中的数据记录到RDB快照中,并将快照和接下来所有的写操作日志写入到内存缓冲区中,随后将快照发送给从节点
- 从节点收到快照并载入数据到内存中,之后主节点子进程将内存缓冲区中的写操作日志发送给从节点,让从节点执行相同的操作,从而达到主从节点数据同步的目的
- 相关命令
命令 | 功能 |
replicaof | 指定主服务器ip地址和端口 |
info replication | 查看主从复制信息 |
config rewrite | 保存配置到/etc/redis.conf末尾 |
replicaof no one | 恢复为master角色主机 |
- 配置带验证的主从复制相关命令
命令 | 功能 |
config get requirepass | 查看redis服务密码 |
config set requirepass | 设置redis服务密码 |
auth | 输入redis服务密码 |
config rewrite | 保存密码到配置文件末尾 |
config set masterauth | 指定连接master角色redis服务密码 |
config get masterauth | 查看连接master角色redis服务密码 |
哨兵服务
Redis Sentinel 是 Redis 官方提供的高可用性解决方案,主要用于监控 Redis 主从复制集群中的各个节点的状态,并在主服务器宕机时自动进行主从切换,确保服务的连续性和数据的可用性
- 哨兵的工作原理
哨兵的工作原理可以分为以下A B C D四个阶段
- 监控
- 连接建立:哨兵节点会与所有的主从节点建立网络连接,并定期发送心跳检测命令(如PING)。
- 状态监控:哨兵节点会定期检查主从节点的状态,记录其响应时间和状态信息。
- 信息共享:哨兵节点会将监控信息共享给其他哨兵节点,确保所有哨兵节点的状态一致。
B.通知
- 故障检测:当哨兵节点检测到主节点不可达时,会将其标记为主观下线(Subjectively Down)。
- 通知其他哨兵:哨兵节点会向其他哨兵节点发送通知,要求他们也检查主节点的状态。
C.故障判定
- 客观下线:当足够多的哨兵节点(超过一半)认为主节点不可达时,哨兵节点会将主节点标记为客观下线(Objectively Down)。
- 领导者选举:哨兵节点会通过Raft协议选举出一个领导者哨兵节点,负责执行故障转移。
D.故障转移
- 选举新主节点:领导者哨兵节点会从从节点中选举出一个新的主节点。
- 更新配置:领导者哨兵节点会将所有从节点的配置更新为新的主节点。
- 通知客户端:哨兵节点会通知所有的客户端,更新主节点的地址。
- 总结
- Redis主从复制哨兵:主要用于提供高可用性和自动故障转移,适用于需要高可用性和读写分离的场景。
- Redis集群:主要用于数据的分片和高可用性,提高系统的扩展性和可靠性,适用于需要处理大规模数据和高并发请求的场景。
持久化
- RDB(RedisDataBase)
RDB 持久化是通过创建数据库的快照来实现的。这种方式会在指定的时间间隔内生成数据集的时间点快照,并保存到磁盘上的 RDB 文件中
优点:
- RDB持久化方式可以将当前Redis内存中的数据保存到硬盘上,防止数据丢失,保证数据的可靠性。
- RDB持久化方式适用于数据量比较大,但是又需要快速备份和恢复数据的场景,因为RDB方式的二进制文件包含了Redis数据集合的全部信息,所以恢复数据非常快速。
- RDB持久化方式可以在后台异步执行,在备份或者恢复过程中不会阻塞当前Redis服务的正常运行,提高了系统的可用性和性能
缺点:
- RDB方式虽然可以保证数据的可靠性,并快速备份和恢复数据,但是在数据备份和恢复过程中,需要占用一定的系统资源,会影响当前Redis服务的性能。
- RDB方式是将Redis的数据集合进行整体化备份,当Redis数据比较频繁时,可能会造成数据丢失。可以考虑使用AOF来补充数据备份策略
- AOF
AOF 持久化是通过记录每次写操作来实现的,将所有对数据库进行修改的命令追加到一个日志文件中。
优点:
- 可以最大程度的保证数据的完整性和持久性。因为AOF方式记录了每个写操作的详细日志,保证了即使服务器突然岩机,只要AOF文件没有损坏,数据也可以迅速恢复。
- AOF更新数据的方式是追加(类似于写操作的日志),因此即使频繁的写入操作也不会影响到Redis的性能,而且当AOF文件变得太大时,可以通过重写AOF文件来删除其中的冗余信息,
- AOF具有良好的可读性和可操作性,可以通过简单的文本文件操作对特定的键进行还原操作
缺点:
- AOF文件体积通常要大于对应的RDB文件,因为AOF会记录每个写入操作,而频繁的写入操作会导致AOF文件迅速增大,占用磁盘空间。
- AOF方式的持久化需要以追加的形式写入磁盘,频繁写入磁盘会对服务器的性能产生负面影响,因此AOF持久化的速度比RDB慢。
- 适用场景
RDB
- 适用于数据量较大且变化较少的场景:由于RDB文件包含了某一时刻的所有数据,适用于数据量较大且变化较少的场景。
- 适用于快速恢复数据的场景:由于RDB文件的恢复速度较快,适用于需要快速恢复数据的场景。
AOF
- 适用于数据变化频繁且需要高安全性的场景:由于AOF文件记录了所有写操作,确保数据的最高安全性,适用于数据变化频繁且需要高安全性的场景。
- 适用于需要实时持久化的场景:由于AOF文件是只追加文件,写操作会实时记录到文件中,确保数据的实时持久化。
数据类型
Redis 常见的数据类型主要有以下五种:
- 字符串类型
- 列表类型
- Hash类型
- 无序集合类型
- 有序集合类型