龙空技术网

「面试普通人VS高手系列」Redis存在线程安全问题吗?为什么?

跟着Mic学架构 905

前言:

而今姐妹们对“多线程访问redis 线程安全吗”都比较珍视,我们都需要分析一些“多线程访问redis 线程安全吗”的相关内容。那么小编在网摘上收集了一些有关“多线程访问redis 线程安全吗””的相关资讯,希望小伙伴们能喜欢,同学们一起来了解一下吧!

一个工作了5年的粉丝私信我。

他说自己准备了半年时间,想如蚂蚁金服,结果第一面就挂了,非常难过。

问题是: “Redis存在线程安全问题吗?”

关于这个问题,看看普通人和高手的回答。

视频加载中...

需要高手面试文档(附赠阿里内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。

普通人:

嗯。。。。。。。

高手:

好的,关于这个问题,我从两个方面来回答。

第一个,从Redis 服务端层面。

Redis Server本身是一个线程安全的K-V数据库,也就是说在Redis Server上执行的指令,不需要任何同步机制,不会存在线程安全问题。

虽然Redis 6.0里面,增加了多线程的模型,但是增加的多线程只是用来处理网络IO事件,对于指令的执行过程,仍然是由主线程来处理,所以不会存在多个线程通知执行操作指令的情况。

为什么Redis没有采用多线程来执行指令,我认为有几个方面的原因。

Redis Server本身可能出现的性能瓶颈点无非就是网络IO、CPU、内存。但是CPU不是Redis的瓶颈点,所以没必要使用多线程来执行指令。如果采用多线程,意味着对于redis的所有指令操作,都必须要考虑到线程安全问题,也就是说需要加锁来解决,这种方式带来的性能影响反而更大。

第二个,从Redis客户端层面。

虽然Redis Server中的指令执行是原子的,但是如果有多个Redis客户端同时执行多个指令的时候,就无法保证原子性。

假设两个redis client同时获取Redis Server上的key1, 同时进行修改和写入,因为多线程环境下的原子性无法被保障,以及多进程情况下的共享资源访问的竞争问题,使得数据的安全性无法得到保障。

当然,对于客户端层面的线程安全性问题,解决方法有很多,比如尽可能的使用Redis里面的原子指令,或者对多个客户端的资源访问加锁,或者通过Lua脚本来实现多个指令的操作等等。

以上就是我对这个问题的理解。

总结

关于线程安全性问题,是一个非常重要,非常重要的知识。

虽然我们在实际开发中很少去主动使用线程,但是在项目中线程无处不在,比如Tomcat就是用多线程来处理请求的

如果对线程安全不了解,那么很容已出现各种生产事故和莫名其妙的问题。

这也是为什么大厂一定会问多线程并发的原因。

本期的普通人VS高手面试系列就到这里结束了。

需要高手面试文档(附赠阿里内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。

标签: #多线程访问redis 线程安全吗