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脚本来实现多个指令的操作等等。
线程安全性确实是开发中非常重要的一个知识点,所以面试的频率会特别高,大家可以重点关注一下。好了,今天的分享就到这里,在面试的时候大家还有遇到哪些比较难的问题,欢迎在评论区留言。