Redis是什么
Redis (Remote Dictionary Server四,远程字典服务)是一个开源的、基于内存的、支持持久化Q的键值对(Key-Value)存储系统。它通常被归类为 NoSQL 数据库、缓存和消息中间件。基于内存囚 是其高性能的主要原因,数据主要存储在内存中,读写速度极快。 键值对Q 是其基本数据模型,但 Value 支持多种复杂数据结构,这使其远超简单的键值存储。
核心特点
1.极致性能
数据操作主要在内存中完成,配合高效的底层数据结构(如跳跃表、哈希表)和单线程架构(避免上下文切换和竞争条件),使其能达到每秒数十万次的读写性能。
2丰富的数据结构
不仅是简单的字符串(Sting),还支持列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash)、位图(Bitmap)等。这使得开发者可以直接在数据库层完成复杂逻辑,减少应用代码的复杂性。
3. 功能完备
。持久化:支持 RDB(快照)和 AOF(日志)两种方式将内存数据保存到磁盘,防止数据丢失。
。高可用与复制:通过 Redis Sentinel(哨兵)实现自动故障转移,保证服务高可用;通过主从复制实现数据备份和读写分离,。
。事务:支持简单的事务操作,保证一系列命令的原子性执行。
。发布/订阅(Pub/Sub):提供消息发布订阅功能,可用于简单的消息队列场景。
。Lua 脚本:支持执行 Lua 脚本,实现复杂的原子操作。4、单线程与原子性
Redis 的核心网络请求处理模块是单线程的,任何命令操作都是原子性的,无需担心并发问题,简化了开发。
2. Redis 的单线程架构
Redis 的核心业务,对数据的操作始终是单线程的。但在 6.0之后,也使用了额外的线程来处理网络 10。
Redis 在处理网络时利用 1/0 多路复用机制。该机制允许一个线程同时监视多个网络请求,当某 socket 变得可读或可写时,才通知主线程处理。
前提是,该业务场景并不涉及非常频繁的交互,如直播、竞技游戏等。当同一时刻,大部分 socket都是静默的,没有数据传输,I0多路复用就显得非常高效了。Redis 的主线程就是通过这个机制管理数十万的网络连接。
工作流程具体为:
Redis 的主线程使用 epol 这组 /O 多路复用的 API,监听所有连接
当连接真正可读时,主线程将读写网络数据的任务交由10 线程并行处理。
10 线程读完数据后,主线程串行执行全部读取到的命令。
执行完毕,主线程将响应交由 10 线程写入。
所有的网络操作(acceptread、write、close)都不再是传统的阻塞式调用,而是被转换为对事件的监听和回调。主线程只在事件确实发生时(数据就绪)才进行实际操作,避免了在空的网络 I/0 上无谓地等待和阻塞。
因此再来总结 Redis 快的原因
1.纯内存访问。这是 Redis 快的基础。
2.非阻塞 1O.
3.单线程避免线程竞争开销,也无需考虑线程安全问题,Redis 的核心业务基本都是对内存数据的简单操作,不会特别消耗 CPU单线程足以应对。
4.Redis 并没有关系型数据库那样复杂的功能支持。比如关系型数据库中的各种约束。
单线程固然为 Redis 带来许多优势,但缺点也很明显。一旦某个命令执行过长,会导致其他全部命令处于等待,造成客户端的阻这对于 Redis 这种提供高性能服务的中间件是非常致命的。因此说,Redis 是面向快速执行场景的数据库。
上一条:Redis原理
下一条:没有了!