type
status
date
slug
summary
tags
category
icon
password
AI 摘要
概念
REmote Dictionary Server,key-value 存储系统,是跨平台的非关系型数据库
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、
Key-value
数据库,并提供多种语言的 API特点
- 支持数据的持久化
- 除了简单的
key-value
类型的数据,同时还提供以下数据结构的存储 - list
- set
- zset
- hash
- 支持数据的备份,即
master-slave
模式的数据备份
zset 数据结构
有序数据集合:保存一个集合,并为集合中的每个元素分配一个分数(score),相比于普通集合,有序集合中的元素可以根据分数进行排序。
类似于 Set 和 Hash 的复合数据结构
底层使用跳跃表(Skip List)来实现
—— 跳表 = 多层链表 + 二分查找
使用场景:
- 排行榜:得分作为排序的 key
- 计数器:数目作为 key
应用场景
- 缓存:Redis 缓存能够提高应用的响应速度,减轻数据库的压力。
- 计数器:Redis 可以用来做计数器,比如网站的 UV,PV 等。
- 排行榜:Redis 可以用来做排行榜,比如微博的热门微博排行榜,微信的热门文章排行榜等。
- 社交网络:Redis 可以用来做社交网络的好友关系,比如微博的关注,粉丝等。
- 消息队列:Redis 可以用来做消息队列,比如秒杀系统中的下单队列,支付队列等。
- 分布式锁:Redis 可以用来做分布式锁,比如秒杀系统中的分布式锁。
- 分布式 Session:Redis 可以用来做分布式 Session,比如网站的购物车,购物记录等。
- 其他:还有很多应用场景,比如:分布式 ID 生成器,分布式任务调度等。
- Redis 的应用场景还在不断的扩展中,比如:Redis 可以用来做分布式任务调度,比如
Celery
,Resque
等。
关于社交网络
Redis 可以通过使用 Sorted Set 数据结构来存储用户之间的好友关系。每个用户都被视为一个元素,而他们之间的关系则通过分数字段进行表示。
例如,如果用户 A 关注了用户 B,那么可以将 A 的 ID 作为 Sorted Set 中的一个元素,将 B 的 ID 作为另一个元素,然后将 B 的 ID 分配给 A 的元素作为分数字段,这样就可以表示出 A 关注了 B 这个关系。
同时,还可以使用 Sorted Set 的交集运算和并集运算等功能来实现好友推荐、查找共同好友等高级功能。
关于消息队列
Redis 在消息队列(Message Queue)中的应用主要是通过实现 Redis List 来实现的。Redis List 可以看做是一个支持双向插入和删除操作的链表,它可以存储多个字符串元素,并且可以快速地从两端插入或者弹出元素。
利用 Redis List 的这些特性,我们可以将其作为消息队列的底层数据结构。具体地,当生产者需要发送消息时,它可以将消息写入到 Redis List 的尾部;而消费者则可以从 Redis List 的头部获取消息并进行处理。由于 Redis 的高效读写以及原子操作的支持,可以保证消息队列的高吞吐量和低延迟。
除了基本的消息传送功能,Redis 还支持一些其他的高级特性,例如:
- Pub/Sub:Redis 支持发布/订阅模式,它可以让多个客户端同时监听同一个消息频道,并且实时地接收到新发布的消息。
- 消息持久化:Redis 提供了多种消息持久化方式,包括 RDB 快照、AOF 日志等,可以确保消息在重启或者故障恢复后不会丢失。
- 阻塞式操作:Redis 提供了阻塞式操作,例如 BRPOP 和 BLPOP 命令,可以让消费者在没有消息可处理时自动等待并阻塞,避免了轮询和忙等待的开销。
优缺点
- 优点:
- 性能极高 – Redis 能读的速度是
110000 次/s
,写的速度是81000 次/s
。 - 丰富的数据类型 – Redis 支持二进制案例的
Strings
,Lists
,Hashes
,Sets
及Ordered Sets
数据类型操作。 - 原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis 还支持
publish
/subscribe
, 通知, key 过期等等特性。
- 缺点:
- 单线程 – Redis 的所有操作都是单线程的,这样会导致在高并发的情况下,Redis 会成为性能的瓶颈。
- 不支持复杂的查询 – Redis 虽然提供了丰富的数据类型,但是还是不支持复杂的查询。
- 数据不是真正的删除,而是被清除 – Redis 删除某个 key 后,会立即释放内存,但是对于大 key 来说,内存释放会比较慢。
扩展
Redis 的持久化
- RDB:Redis 默认的持久化方式,会在指定的时间间隔内将内存中的数据集快照写入磁盘。
- AOF:Redis 的另一种持久化方式,会将每个收到的写命令追加到文件中,Redis 重启时会重新执行这些命令来恢复数据。
- 混合持久化:
RDB
和AOF
两种持久化方式的结合。
Redis 内部的数据结构
- Redis 的数据结构主要有三种:简单动态字符串(
SDS
)、双端链表(deque
)、字典(dict
)。
- SDS:简单动态字符串,是 Redis 的基本数据结构,是 Redis 的字符串实现。
- deque:双端链表,是 Redis 的基本数据结构,是 Redis 的列表实现。
- dict:字典,是 Redis 的基本数据结构,是 Redis 的哈希实现
Redis 的主从复制
主从复制是 Redis 的高可用方案,主从复制的原理是:主节点会将数据同步到从节点,从节点可以是只读的,也可以是可读可写的。
- 主从复制的优点:
- 读写分离:主节点负责处理写请求,从节点负责处理读请求,从而实现读写分离。
- 高可用:主节点宕机后,从节点会自动提升为主节点,从而实现高可用。
- 数据冗余:主从复制可以实现数据冗余,从而实现数据的安全。
- 主从复制的缺点:
- 主从复制的延迟:主从复制的延迟是主节点写入数据后,从节点才能读到数据的时间差。
- 主从复制的数据不一致:主从复制的数据不一致是指主节点和从节点的数据不一致。
- 主从复制的故障转移:主从复制的故障转移是指主节点宕机后,从节点提升为主节点的过程
哨兵模式
哨兵模式是 Redis 的高可用方案,哨兵模式的原理是:哨兵会监控主节点和从节点的运行状态,当主节点宕机后,哨兵会自动将从节点提升为主节点,从而实现高可用