一位工作5年的粉丝私信我。他说自己准备了半年,想像蚂蚁金服一样,结果第一面就失败了,非常难过。问题是:“Redis是否存在线程安全问题?”关于这个问题,看看普通人和专家的回答。普通人:嗯。...........师父:那我从两个方面来回答这个问题。第一个来自Redis服务器级别。RedisServer本身是一个线程安全的K-V数据库,也就是说在RedisServer上执行的指令不需要任何同步机制,不会有线程安全问题。Redis6.0虽然增加了多线程模型,但增加的多线程只是用来处理网络IO事件。指令的执行过程还是由主线程处理,所以不会有多个线程去通知操作指令的执行情况。为什么Redis不使用多线程来执行指令,我觉得有几个原因。RedisServer本身可能存在的性能瓶颈无非就是网络IO、CPU、内存。但是CPU并不是Redis的瓶颈,所以没必要用多线程来执行指令。如果采用多线程,意味着redis的所有指令操作都必须考虑线程安全问题,也就是说需要加锁来解决,这种方式带来的性能影响更大。第二个来自Redis客户端级别。RedisServer中虽然指令的执行是原子的,但是如果有多个Redis客户端同时执行多条指令,原子性就无法保证。假设两个redisclient同时获取RedisServer上的key1,同时修改和写入,因为多线程环境下的原子性无法保证,多进程情况下共享资源访问的竞争问题使得数据安全得不到保障。当然,客户端层面的线程安全问题有很多解决方案,比如在Redis中尽可能使用原子指令,或者锁定多个客户端的资源访问,或者通过Lua脚本实现多条指令的操作等。以上是我对这个问题的理解。总结线程安全的问题是一个非常重要,非常重要的知识。虽然我们在实际开发中很少主动使用线程,但是线程在项目中无处不在。例如,Tomcat使用多线程来处理请求。如果不懂线程安全,很容易出现各种生产事故和莫名其妙的问题。这也是为什么大厂肯定会问多线程并发的原因。需要专家面试资料(内含阿里巴巴内部10万字面试资料)或者想咨询不懂的技术面试题的可以私信或者关注同名公众号。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
