基础理论#
概况#
Redis (Remote Dictionary Server) 是一个开源的、支持网络、基于内存、可选持久性的键值对数据库。它支持多种类型的数据结构,如字符串(strings)、列表(lists)、集合(sets)、有序集合(sorted sets)以及散列(hashes)、位图(bitmaps)、超日志(hyperloglogs)和地理空间(geospatial)索引半径查询。
特点包括:
- 高性能:因为数据主要在内存中进行操作,读写速度非常快。
- 丰富的数据类型:提供多种数据结构来满足不同场景下的需求。
- 原子性:所有操作都是原子性的,支持事务(通过MULTI/EXEC命令)。
- 丰富的功能:支持发布订阅、Lua脚本、事务等。
数据结构#
Redis提供的数据结构包括: Redis 支持多种数据类型,以下是一些常用的数据类型以及它们的简要描述和使用场景:
| 数据类型 | 描述 | 使用场景 |
|---|---|---|
| String | 二进制安全字符串,最大可以存储 512MB | 存储文本或二进制数据,如缓存用户个人信息等 |
| List | 有序集合,按插入顺序排序 | 消息队列、时间线、最新消息列表 |
| Set | 无序集合,元素不重复 | 标签、社交网络中的朋友关系等 |
| Sorted Set | 有序集合,元素不重复,并且每个元素都会关联一个浮点数分数 | 排行榜、带权重的集合 |
| Hash | 键值对集合,适用于存储对象 | 存储、访问和修改对象属性 |
| Bitmaps | 通过位来表示数据的数据类型,适合做计数统计 | 在线状态、特性标志、统计等 |
| HyperLogLog | 近似去重计数的数据结构 | 大数据量的计数,如统计独立 IP 访问数量 |
| Geospatial | 存储地理位置信息,并进行相关地理操作 | 储存经纬度,查询附近的地点 |
| Streams | Redis 5.0 新增的数据类型,是一个可持久化的日志数据结构 | 实现消息队列,发布/订阅模式,日志记录 |
Redis 之所以快速,主要原因有以下几点:#
- 内存存储:Redis 将所有数据存储在内存中,内存的读写速度远高于硬盘。
- 数据结构简单:Redis 的数据结构设计简单直观,易于高效操作。
- 非阻塞 IO:Redis 使用非阻塞 IO 和多路复用技术,可以处理多个并发连接。
- 单线程模型:Redis 大部分操作是单线程执行,避免了多线程的上下文切换开销。
Redis高性能IO模型#
Redis的IO模型使用的是非阻塞IO复用技术,主要是epoll作为IO多路复用技术的实现方式。它通过单线程事件循环来处理所有客户端请求,确保绝大部分请求都是非阻塞的,并且使用异步编程模式来提高性能。
引用一些数据的话,可以提及以下几点:
- 内存读写速度:NVMe SSD 的 IOPS 可以达到数十万到数百万,而内存的 IOPS 可以达到千万级别,延迟通常小于100微秒。相比之下,内存的速度通常是硬盘的数千倍甚至更高。
- 性能表现:根据 Redis 官方给出的数据,在一个标准 Linux 系统上,Redis 可以达到每秒10万级别的读写操作(这个数字可能因配置、数据类型和具体操作而异)。
以上数据只是为了说明 Redis 为什么快速,具体的性能指标会根据使用环境、硬件配置以及具体的工作负载而有所变化。