Redis是多线程的吗

Redis是多线程的吗?

很多面试官在面试的时候会问:redis在业务处理的时候是多线程还是单线程的?,仅仅回答是多线程或者是单线程都不是很恰当,所以在文章的后面总结出一个简洁的回答。

本次总结是针对Redis5.X的,不是刚刚2020-05-02号上线的Redis6.X的版本,值得注意的是这次6.X版本中新增了I/O threads

一、redis5.x的安装(centos6.x)

1mkdir ~/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是多线程的吗_第1张图片
Redis是多线程的吗_第2张图片
Redis是多线程的吗_第3张图片
Redis是多线程的吗_第4张图片
2:redis是采用的k-v的方式,性能为王,worker线程是单线程的,采用epoll io 来解决并发访问的问题。首先通过epoll来获取哪些客户端有数据发送过来,第二步就是redis串行化的去读取客户端发来的数据,第三部就是redis自己来计算数据。
Redis是多线程的吗_第5张图片
Redis是多线程的吗_第6张图片
上面的模型中存在一个问题,就是只有一个CPU被worker线程使用,多个CPU的话,其他CPU就会闲着,导致资源利用不充分。所以redis在2020-05-02号,发布了6.X版本,如下图,将5.x中的串行读写IO改成了使用IO的threads来并行处理了。但是工作线程还是单线程的
Redis是多线程的吗_第7张图片

3、redis的使用场景
redis的五大value数据类型为:String ,list ,hash,set,zset(stored set)
Redis是多线程的吗_第8张图片
Redis是多线程的吗_第9张图片
Redis是多线程的吗_第10张图片

4、redis的持久化

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

5、redis的分布式集群
Redis是多线程的吗_第11张图片
补充:针对redis的压力过大的问题,可以采用分片的技术,将不同的业务逻辑拆分到不同的redis节点中去,也可以针对每一份分片节点做HA的一些设计。

你可能感兴趣的:(大数据,redis)