关于这个问题,从两个方面回答
第一个,从Redisd的服务端层面,Redis Server本身是一个线程安全的K-V数据库,也就是说在Redis Server端去执行指令的时候,不需要任何的同步机制,它不会存在任何线程安全的一个问题,虽然Redis 6.0里面增加了多线程的模型,但是增加了多线程模型呢只是去处理网络的IO事件,对于指令的执行过程,仍然是采用主线程来处理的,所以它并不会存在多个线程同时去执行操作指令的一个情况,为什么Redis没有采用多线程来执行指令,我认为呢,有几个方面的原因,首先呢Redis本身可能出现性能瓶颈的点,无非就是IO,CPU和内存嘛,但是CPU又不是Redis本身的一个性能瓶颈点,所以没有必要去使用多线程来执行指令,其次啊如果使用多线程,意味着对于Redis里面的所有指令操作,都必须要去考虑到线程安全性的问题,也就是说需要去通知加锁来解决,那么这种方式呢会带来性能上的影响,反而会导致问题更大。
第二个,从Redis 的客户端层面来说,虽然Redis Server中的指令操作是原子的,但是如果有多个Redis 客户端同时执行多个指令的情况下呢,就无法去保证原子性,假设两个redis client在同时去获取Redis Server的key1,同时去进行修改和写入,因为多线程环境下的原子性呢无法被保证以及多线程的情况下共享资源访问的一个竞争问题,使得数据的安全性无法得到保障。
当然啊,对于线程安全性的问题呢,解决的方法有很多,比如说,尽可能的使用Redis里面的原子指令,或者对于多个客户端的资源访问去加锁,再或者我们可以通过lua脚本,来实现多个指令的执行操作,从而去满足它的一个原子性

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐