当前位置:   article > 正文

【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构_redis线程模型底层实现

redis线程模型底层实现

【重难点】【Redis 01】为什么使用 Redis、Redis 的线程模型、Redis 的数据类型及其底层数据结构

一、为什么使用 Redis

Redis 是一个非常高效的非关系型数据库

随着互联网的发展,传统的关系型数据库已经不能满足所有的业务场景了,比如电商秒杀活动时候数据库需要瞬间处理大量的请求,非常容易造成数据库崩溃,所以需要引入缓存中间件。开源市场上主流的缓存中间件就是 Redis 和 Memcached,相较之下 Redis 的数据结构更加丰富,扩展性更强,并且原生支持集群模式

Redis 为什么高效

  1. 完全基于内存操作,无需进行磁盘 I/O
  2. 以单线程的方式处理请求,避免了不必要的线程上下文切换和锁竞争
  3. 使用 I/O 多路复用程序分派 Socket
  4. 底层数据结构进行过专门的设计

二、Redis 的线程模型

Redis 是一个由事件驱动的程序,因此 Redis 最重要的线程是它的文件事件处理器,这个文件事件处理器是以单线程的方式运行的,但可以通过 I/O 多路复用程序来监听多个 Socket,多路复用程序再将 Socket 交给文件事件分派器,分派器来选择对应的事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)对 Socket 上的事件进行处理

I/O 多路复用程序工作原理

一个 Redis 服务器通常会连接多个 Socket 的,所以会有多个事件并发出现的情况。I/O 多路复用程序会将所有产生事件的 Socket 放在一个队列里面,然后通过这个队列,以有序、同步、每次一个 Socket 的方式向文件事件分派器传送套接字,当上一个 Socket 产生的事件背处理完毕之后,I/O 多路复用程序才会继续传送下一个 Socket

不同的操作系统有不同的多路复用函数,比如 Linux 的 select、poll、epoll。Redis 底层会判断当前操作系统的型号,并且调用性能最好的多路复用函数

三、Redis 的数据类型及其底层数据结构

1.数据类型及其应用场景

String

  1. 用作缓存,可以加快系统读写速度,还可以降低数据库压力
  2. 用作计数器,可以快速实现计数并提供实时查询,最终还可以根据需求落库
  3. 用作分布式会话存储,解决了分布式会话不统一的问题

Hash

应用场景比较少,需要根据实际业务细节来使用

List

  1. 用作消息队列,生产者通过 Lpush 从头部插入数据,消费者通过 BRpop 从尾部竞争
  2. 用作分页数据缓存,Redis 的 List 是有序的,并且支持范围查询

Set

  1. 用于分布式去重,如果数据分布在两台 JVM 上,就可以用 Redis 来去重

Sorted Set

  1. 用于实现排行榜
  2. 用于实现优先级队列

2.底层数据结构

简单动态字符串

对 C 语言的字符串进行了封装,增加了 len 字段,在安全性、效率和功能性上优于 C 语言的字符串

双端链表

是 List 键的底层实现

字典

是 Hash 键和数据库的底层实现

跳跃表

跳跃表的节点包含四个属性:level、backward、score 和 obj

是有序集合键的底层实现之一,还在集群节点中用作内部数据结构,此外,跳跃表在 Redis 里面没有其他用途

平均查询时间复杂度为 O(logn)、最差为 O(n)

整数集合

是 Set 键的底层实现之一

压缩列表

压缩列表是为了节约内存开发的,是一块连续的内存,类似于数组

是 Lish 键和 Hash 键的底层实现之一,当元素较少时就会使用压缩列表

对象

Redis 并不是直接使用上述数据结构实现键值对数据库的,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串键、哈希键、列表键、集合键和有序集合键盘。并且 Redis 的对象带有访问时间记录信息,可以用于计算该对象的空转时长

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/157354
推荐阅读
相关标签
  

闽ICP备14008679号