大数据|Redis是多线程的吗

Redis是多线程的吗? 很多面试官在面试的时候会问:redis在业务处理的时候是多线程还是单线程的?,仅仅回答是多线程或者是单线程都不是很恰当,所以在文章的后面总结出一个简洁的回答。
本次总结是针对Redis5.X的,不是刚刚2020-05-02号上线的Redis6.X的版本,值得注意的是这次6.X版本中新增了I/O threads 。
一、redis5.x的安装(centos6.x) 1 :mkdir ~/redis && cd redis 创建redis的安装目录。
2:yum install wget && wget http://download.redis.io/releases/redis-5.0.7.tar.gz
3:tar -xvf redis-5.0.7.tar.gz
4:cd redis-5.0.7 && cat README.md :到redis的解压目录下阅读安装指导文档
5:make
6:要是报错gcc不存在则需要安装gcc:yum install gcc -y
7:make distclean 要是之前安装失败了,需要执行该命令清空之前安装的数据,进行重新安装,要是没有报错,此步骤可以略过。
8:make :编译
9:make PREFIX=/home/redis5 install 将编译好的redis安装到/home/redis5目录下
10:配置redis的环境变量:vi /etc/profile 然后source /vi /etc/profile
11: cd ./utils 然后执行 install_server.sh 使用service redis_6379 status 来验证redis是否启动成功。
二、redis5.x的基础理论 1:linux的内核发展:BIO -> NIO ->多路复用epoll:这个过程是随着linux的内核的发展而发展的。而redis就采用的是epoll的多路复用的方式,下面总结一下epoll出现的发展历程。
大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

2:redis是采用的k-v的方式,性能为王,worker线程是单线程的,采用epoll io 来解决并发访问的问题。首先通过epoll来获取哪些客户端有数据发送过来,第二步就是redis串行化的去读取客户端发来的数据,第三部就是redis自己来计算数据。
大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

上面的模型中存在一个问题,就是只有一个CPU被worker线程使用,多个CPU的话,其他CPU就会闲着,导致资源利用不充分。所以redis在2020-05-02号,发布了6.X版本,如下图,将5.x中的串行读写IO改成了使用IO的threads来并行处理了。但是工作线程还是单线程的。
大数据|Redis是多线程的吗
文章图片

3、redis的使用场景
redis的五大value数据类型为:String ,list ,hash,set,zset(stored set)
大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

大数据|Redis是多线程的吗
文章图片

4、redis的持久化
【大数据|Redis是多线程的吗】RDB:快照,恢复的速度快,但是由于快照是周期性的,丢失的数据比较多。
AOF:操作日志:数据比较完整,但是恢复的效率比较低。但是也会有冗余量(使用重写的方式来处理数据的冗余)
混合使用:归档 + 日志 :假如7:00开始持久化,那么先快速生成一个RDB,然后将此时刻7:00之后的操作增量的记录在AOF文件中。那么当redis重启时,系统首先会去加载RDB,然后增量的执行AOF文件。这样就是集成了RDB和ADF的优点,规避了他们各自的缺点。
5、redis的分布式集群
大数据|Redis是多线程的吗
文章图片

补充:针对redis的压力过大的问题,可以采用分片的技术,将不同的业务逻辑拆分到不同的redis节点中去,也可以针对每一份分片节点做HA的一些设计。

    推荐阅读