Redis_概述_特性_IO模型

Redis是一个高性能的内存数据库,支持多种数据结构如String、List、Set等。NoSQL数据库的一种,用于解决大规模数据存储问题。Redis提供缓存功能,有实时同步和阶段性同步两种模式。其特点是高性能、简单稳定、持久化和高可用集群。从Redis6.0开始支持多线程IO模型,提高处理能力。

本章要点

  • 掌握NoSql数据库的概念和与sql数据库的区别
  • 初步了解Redis内存数据库
  • 了解Redis内存数据库的优点及其原因
  • 掌握Redis的多线程IO模型
  • 学习Redis的安装和配置

Redis简介

Redis 全称 Remote Dictionary Server 远程字典服务! 使用C语言编写,支持网络,可基于内存也可以持久化的日志型,NoSQL开源内存数据库,其提供多种语言的API Redis是一个key-value存储系统,支持存储的val类型很多,String,List,Set,Zset(sorted set--有序集合) 和Hash

NoSQL

NoSQL (not noly sql) 泛指非关系型数据库.产生主要为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题

种类

我们根据存储的方式有不同的NoSQL数据库种类

  • 键值存储数据库

就像map一样key-value对 代表 Redis

  • 列存储数据库

我们知道关系型数据库是典型的行存储数据库,因为行存储数据库在物理层面上占用的是连续存储空间,不适合海量数据存储,而列存储方式可以实现分布式存储,适合海量存储 代表 Hbase

  • 文档型数据库

就是NoSQL和关系型数据库的结合!最像关系型数据库的NoSQL.代表MongoDB

  • 图形(Graph)数据库

用于存放节点关系的数据库.列如描述不同人间的关系.典型代表 Neo4J

Redis用途

Redis是内存数据库,相比于磁盘存储就是一个快字,所以一般用于做数据缓存!即我们客户端从数据库DBMS查询的数据首先写入到Redis中,然后当下次再有客户端需要访问该条数据,我们只需要直接读取Redis即可!,不仅减少了RT一次http的往返时间,还减少了DBMS的压力!

缓存数据划分: 我们根据Redis缓存于DBMS中数据的同步性划分为2类

  • 实时同步缓存

就是一些实时性数据当DBMS更新后,Redis缓存中的相关数据会立即清楚,当下次请求来临先到DBMS中获取,然后再写入到Redis中

  • 阶段性同步缓存

当DBMS持久层数据更新后,Redis缓存中存放的相关数据并不会立即清除, 允许一段时间Redis缓存中的数据和DBMS中的数据不完全一致!这个时间段就是缓存数据的过期时间!

Redis特性

能够做缓存的技术中间件这么多,我们为何要选择Redis Redis的过人之处在哪呢?

  • 性能极高

Redis的性能是极高,Redis的读操作速度可达到 11w 次/s,写的速度可达到 8w次/s 原因:1.Redis的所有操作都是在内存中进行的 2.Redis用C语言开发 3.Redis源码非常精细

  • 简单稳点

Redis源码很少,早期自由2w行左右,从3.0加入集群功能后代码变成5w行只有.可维护性也高

  • 持久化

虽然Redis是内存数据库,但是也支持持久化操作. 有2种方式 RDB和AOF

  • 高可用集群

Redis提供了高可用的主从集群,可以保证系统的安全性

  • 丰富的数据类型

支持存储的value类型很多.包括 String,List,Set,Zset(sorted set) 和Hash 还有BitMap,HyperLogLog,Geospatial类型 BitMap:一般用于大数据的二值性统计 HyperLogLog:用于数据量庞大的日志做去重操作 Geospatial:地理空间,主要提供地理位置的相关计算

  • 强大的功能

Redis提供了数据过期功能,发布/订阅功能,简单事务功能,还支持Lua脚本扩展功能.

  • 客户端语言广泛

Redis提供了简单的TCP通信协议,编程语言可以方便的接入Redis.

  • 支持ACL权限控制

之前的权限控制十分笨拙,从Redis6开始引入了ACL模块,可以给不同的用户指定不同的权限 ALC: Access Control List 访问控制列表,是一种细粒度的权限控制策略,可以针对任意用户和组进行权限控制, UGO是一种粗粒度的权限控制操作策略

  • 支持多线程IO模型: Redis之前版本采用的是单线程模型,从6.0开始支持多线程模型

Redis的IO模型

Redis客户端提交的请求,然后由Redis处理请求所采用的处理架构,称为Redis的IO模型,不同版本的IO模型不同

单线程模型

对于Redis3.0及之前版本,Redis的IO模型就是纯粹的单线程模型,所有客户端的请求由一个线程处理!

Redis的单线程采用了多路复用技术!

对于多路选择算法参见的有3种:select模型,poll模型,epoll模型

  • poll模型:采用轮询方式,该模型对客户端的就绪处理是有延迟的
  • epoll模型: 采用的是回调的方式

每个客户端如果要向Redis提交请求,需要先建立一个socket连接,并向事件分发器注册一个事件.一旦该事件发生说明该链接已经就绪.然后事件分发器就可以感知到.然后获取到客户端发送的请求,然后放入任务队列,等待处理线处理! 事件分发器会根据不同的事件将任务交给不同的时间处理器处理

混合线程模型

Redis4.0开始就加入了多线程元素,虽然处理客户端请求仍是单线程模型.但是对于一些比较耗时并且不影响客户端响应的操作交给后台其他线程处理 例如持久化操作,对AOF的rewrite,对失效链接的处理等

多线程模型

Redis6.0版本开始,才是真正意义的多线程模型.因为客户端请求的处理采用的是多线程模型

多线程IO模型中的多线程仅仅是用来解析客户端请求,然后解析出请求放入到任务队列.对于具体任务的处理还是右主线程处理!这样用户就无需考虑线程安全问题.无需考虑事务控制.以及像LPUSH/LPOP执行顺序问题.

优缺点总结

  • 单线程模型
  • 优点:可维护性高,性能高.不存在并发读写情况.所以不存在执行顺序的不确定性,不存在切换线程的开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁开销
  • 缺点:性能受到影响,由于单线程自会用到一个处理器,所以会有处理器的浪费
  • 多线程模型
  • 优点:其结合了单线程和多线程的优点,并且避开了他们的不足 缺点:该模型没有显示不足.如果非要说缺点的话,他并非是真正意义上的多线程模型,因为真正处理任务的线程仍然是单线程.所以性能有些许影响!

作者:bug郭
链接:https://juejin.cn/post/7220359399898185783。

### Redis 线程模型的工作原理 #### 单线程模型Redis 6.0 之前) 在 Redis 6.0 版本发布前,其采用的是完全基于单线程的处理模型。这意味着所有的客户端请求都由同一个主线程负责接收、解析以及响应[^1]。尽管如此,由于 Redis 结合了高效的内存管理和 I/O 多路复用技术,即使是在高并发环境下也能保持良好的性能表现。 具体来说,Redis 的单线程并非单纯地按顺序逐一执行每个请求,而是通过事件驱动的方式运行。在这种模式下,Redis 利用了操作系统提供的 I/O 多路复用功能(如 `epoll` 或 `kqueue`),从而可以同时监听多个文件描述符上的事件并作出快速反应[^3]。 #### 多线程模型(自 Redis 6.0 起) 然而,随着现代计算机网络硬件的发展速度加快,原有的单线程架构逐渐暴露出一些局限性——尤其是当面对极高吞吐量的数据传输需求时,单一工作线程可能无法及时完成所有必要的网络读写操作。因此,在 Redis 6.0 中引入了一种新的多线程机制来优化这部分流程[^4]。 新加入的多线程特性主要用于分担原本属于主线程的部分职责,即 **网络 IO 数据的读取与写入** 和 **协议解析** 这两方面内容。这些任务被分配给若干个辅助线程去独立完成;而核心逻辑部分,比如实际命令的具体执行过程,则依旧保留于原来的那个唯一存在的主线程之中不变。 这样的设计既解决了因频繁进行低效阻塞型 IO 导致的整体效率下降问题,又很好地继承了过去版本里简单明了易于维护的优点,同时也规避掉了可能出现的各种复杂的同步锁竞争状况等问题[^2]。 以下是简化版伪代码展示如何区分不同类型的作业交给不同的组件处理: ```python def handle_client_request(client_socket): data = read_from_network_thread_pool(client_socket) # 使用多线程池读取数据 command, args = parse_protocol(data) # 解析协议仍可放在主线上或子线程视情况定 result = execute_command_in_single_main_thread(command, *args) # 所有命令最终交予单一线程执行 write_to_network_thread_pool(result, client_socket) # 将结果回传利用多线程写入 ``` 以上就是关于 Redis 不同阶段所采取的不同线程策略及其背后的设计考量概述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值