Redis系列第一讲:Redis是单线程吗

733 阅读4分钟

Redis是什么

Redis是互联网技术领域使用最为广泛的存储中间件,全称“Remote Dictionary Service”(远程字典服务)。 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

Redis支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability

Redis中文官网: redis.cn/

Redis英文官网:redis.io/

Redis可以做什么

提到Redis 大多数人的第一想法就是做缓存,但是如果作为开发人员的我们,对于Redis的作用只停留在做缓存上,那么是不合格的。Redis还具有许多其他用途,例如:分布式锁,分布式系统唯一序列号生成器,计数器等等。

在不同的场景下,我们应该选择Redis不同的数据结构进行处理

Redis是单线程吗

Redis的演变历程

1、Redis 4之前的版本是单线程

2、Redis 4.x 版本不是严格意思的删除,处理客户端请求的是单线程,添加了异步删除的功能

3、Redis 5.x 版本采用多线程解决问题

Redis的单线程指什么

Redis 单线程主要指的是网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求的时候包括获取(Socket),解析,执行,内容返回(Socket写)等由一个顺序串行的主线程处理,这即为单线程 但Redis的其它功能,比如持久化,异步删除,集群数据同步等等,都是由额外的线程执行的,是多线程 即Redis工作线程是单线程的,但是,整个Redis来说是多线程的

Redis单线程为什么很快

1、基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别

2、数据结构简单:Redis的数据结构简单,查找和操作时间大部分时间复杂度是O(1)

3、多路复用和非阻塞:Redis使用多路复用功能来监听多个Socket链接客服端,这样可以一个线程处理多个请求,减少线程切换带来的开销,同时也避免了IO阻塞操作

4、避免上下文切换:因为是单线程模型,因此避免了多线程切换和多线程竞争,减少时间和性能的消耗

Redis之前为什么采用单线程

1、单线程易于开发和维护

2、单线程模型也可以并发处理多客户端的请求,主要使用多路复用和非阻塞IO

3、对于Redis来说,主要的性能瓶颈是内存或者网络IO而不是CPU

Redis为什么要引用多线程

大key删除可以会造成Redis主线程卡顿 当被删除的key是一个非常大的对象时,例如几十兆的对象时,那么删除将是一个非常耗时的操作,其他命令将会不能执行发生阻塞,造成Redis主线程卡顿。如果是在一个高并发的环境下,将会产生十分严重的问题。

这就是redis3.x单线程时代最经典的故障,大key删除的头疼问题。

那么如何解决大key删除问题呢

1、惰性删除

2、当删除大key时,因为是单线程,所以会造成Redis服务卡顿,于是在4.0版本新增了多线程的模块用于解决删除数据效率低的问题。处理读写请求仍然只是一个线程

3、unlink key 、flushdb async 、flushall async 异步删除,新起子线程进行删除工作

引入多线程后能够解决大key删除阻塞问题吗

如果是同步删除,那么同样会面临阻塞问题。因为Redis的工作线程(执行命令)任然是单线程。因此在实际工作中应该避免大key的出现

Redis系列计划

目前本人计划不定期更新Redis系统文章,大概会按照如下的目录进行,你们的点赞也是我学习和分享的一大动力,愿大家共同进步。

image-20211119005825406

\