大厂面试题-Redis存在线程安全问题吗?为什么?

本文分析了Redis线程安全问题,尽管RedisServer本身是线程安全的,但6.0引入的多线程仅用于网络IO。不采用多线程执行指令出于性能考虑和避免客户端并发时的原子性问题。客户端层面可通过原子指令、加锁或Lua脚本确保线程安全,面试中常被关注。
摘要由CSDN通过智能技术生成

其实关于Redis线程安全性的问题并不难理解。

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

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

至于为什么Redis有采用多线程来执行指令,有几个方面的原因

    1、Redis Server本身可能出现的性能瓶颈点无非就是网络IO、CPU、内存。但是CPU不是Redis的瓶颈点,所以没必要使用多线程来执行指令。

    2、如果采用多线程,意味着对于redis的所有指令操作,都必须要考虑到线程安全问题,也就是说需要加锁来解决,这种方式带来的性能影响反而更大。

第二,从Redis客户端层面。

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

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

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

线程安全性确实是开发中非常重要的一个知识点,所以面试的频率会特别高,大家可以重点关注一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值