分布式状态下高并发问题处理方案之redisson的引入(理论)

在日常开发项目的过程中,我们的项目系统由于用户量增加,特别是用户访问量特别大的情况下,用户去请求操作我们的系统资源,往往会导致我们后台系统会在高并发的情况下,发生数据错乱的问题,那这些问题要该如何去解决呢?下面我会根据不同状态下的场景,由浅入深来解决我们实际开发过程中遇到的问题。

通过一个简单的例子来让大家更直观的感受:

用户对库存的操作

不做任何处理

在多线程的环境下,多个线程直接访问我们的系统资源,在我们直接操作库存的那一部分代码中,未作任何处理的情况下由于线程执行的顺序不确定,可能导致资源数量被重复修改或超卖。

使用synchronized做处理

使用synchronized的话,我们会发现数据错乱的问题解决了,synchronized使得多个线程如果要操作某一资源的话需要排队进行,让我们的库存作为一个原子操作执行,避免了线程之间的相互干扰。这时解决了数据错乱的问题。但是由于我们的系统用户量增加,使得对库存操作这一模块所消耗的时间非常长,导致整个系统的性能下降。那又该如何去解决这个问题呢?

对服务进行扩展,并进行负载均衡处理

上面我们了解到使用synchronized方式虽然能够保证我们数据的正确性,但是导致了我们的系统整体性能的下降,我们可以将我们的服务进行水平扩展为若干个服务并使用nignx做负载均衡,减轻了单个服务的压力,提高整个系统的性能。想到这里可能很多人会认为问题已经基本解决,可以正常使用了,其实不然,我们使用的仍然是synchronized的方式去解决并发问题,但是我们却忽略了,synchronized是处于jvm层面的并发处理机制,但是在分布式状态下,各个服务只等锁住单个线程,其他服务的线程无法控制,这时又会导致系统的数据错乱,那这个问题又该如何去解决呢?

使用redis的setNX分布式锁去处理分布式并发问题

我们先来普及一下setnx的功能

SETNX 是 Redis 数据库中的一个原子性操作命令,用于设置一个键的值,仅当该键不存在时才设置成功。SETNX 是 "SET if Not eXists" 的缩写。

命令格式:

SETNX key value

参数:

  • key:键名
  • value:要设置的值

返回值:

  • 当键不存在时,设置成功并返回 1。
  • 当键已经存在时,设置失败并返回 0。

SETNX 命令可以用于实现分布式锁的简单机制。通过将某个键作为锁,多个客户端可以使用 SETNX 命令来竞争获取锁。只有一个客户端能够成功设置该键,即获取到锁,而其他客户端则会设置失败。

例如,以下示例展示了如何使用 SETNX 命令实现简单的分布式锁:

SETNX lock_key 1

如果返回值为 1,表示成功获取到锁;如果返回值为 0,表示锁已经被其他客户端获取。在完成任务后,客户端可以使用 DEL 命令来释放锁:

DEL lock_key

我们可以利用当该键不存在时才设置成功这一特性可以实现分布式锁,当一个线程进入某一个服务时发现setnx没有设置值,此时可以获取到锁对库存进行操作,需要注意的是setnx所设置的键需要设置过期时间,因为没有设置过期时间的话,假设获取锁的那个服务突然宕机了,此时setnx并没有设置过期时间,并一直不释放锁,导致其他服务无法获取锁,一直处于阻塞状态,只有该服务释放锁其他服务才有机会获取锁。等到所有的问题都解决完了之后,往往又会出现新的问题。如果设置了过期时间,但是我们的业务处理时间大于过期时间,也就是说过期时间到了,业务还没有处理完,锁已经被释放了,这是其他的线程又会获取锁,又会导致数据错乱的问题那又该如何解决呢?

 

问题产生:

  1. 业务未处理完,锁已经释放。
  2. 当业务处理完之释放的是其他服务的锁。

解决思路:

  1. 使用一个子线程,专门去监控锁是否到了过期时间,每隔几秒就去判断是否过期,如果没有过期的话,就将过期时间重置,相当于延长过期时间,这样就保证了在业务处理完之前不会将锁释放,就解决了第一个问题
  2. 给锁加上一个唯一的标识,如果不是当前服务的锁,就不会释放。

但是这一系列的操作过于繁琐易出错,此时redis就提出了redisson组件去解决以上问题。

使用redisson实现分布式锁

redisson在给线程加锁的过程中会自动给每一个锁附上一个唯一的标识,再使用redisson的看门狗机制给我们锁的过期时间延长 。如果redis是集群状态下使用的主从复制,主节点获取到锁之后会直接返回加锁成功,如果在加锁的过程中主节点宕机了,还未同步到从节点又会出现问题。此时redisson又提供了redlock,它的作用是只有当锁在主节点与从节点同步完成之后再返回加锁状态,这就保证了一致性。

以上就是为什么要引入redisson组件的原因了,当然还有其他处理分布式并发问题的机制,实际代码实践请关注我下一篇文章~~~~

  • 56
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 阿里体系的分布式系统可以通过使用集群和分布式计算技术来处理高并发问题。可以采用负载均衡技术,将访问量大的服务器负载均衡到多台服务器上,从而提高系统的处理能力,提高系统的可用性。此外,还可以通过缓存技术减少数据库的查询,从而提高系统的响应速度。 ### 回答2: 基于阿里体系的分布式系统可以通过以下几种方法来处理高并发问题。 1.拆分和分布式:将系统按照功能模块进行拆分和分布式部署,将负载均匀分摊到多个节点上,提高系统的并发处理能力。阿里体系采用了微服务架构,将系统拆分成多个独立的服务,每个服务都可以进行横向扩展,从而提高并发处理能力。 2.负载均衡:通过负载均衡算法,将用户请求均匀地分发到各个服务器上,避免单点故障和资源瓶颈。阿里体系的分布式系统使用了负载均衡器,如Nginx等,通过合理的负载均衡策略,将用户请求分发到各个可用的服务器上,从而提高系统并发能力。 3.缓存技术:通过使用缓存技术,将一些频繁访问的数据存储在高速缓存中,减少对底层数据库的访问压力,提高系统响应速度。阿里体系的分布式系统中广泛使用分布式缓存技术,如Redis等,通过将热点数据放入缓存中,减少对数据库的访问次数,提高系统的并发度。 4.异步处理:将一些耗时长的业务逻辑进行异步处理,将请求放入消息队列中,由后台任务进行处理,避免前端线程的阻塞,提高系统的并发处理能力。阿里体系的分布式系统使用了消息队列技术,如RocketMQ等,通过异步处理消息,解耦前后端的耦合,提高系统的并发性能。 综上所述,基于阿里体系的分布式系统处理高并发问题的方法包括拆分和分布式部署、负载均衡、缓存技术和异步处理等。这些方法可以有效提高系统的并发处理能力,保证系统的稳定性和高性能。 ### 回答3: 基于阿里体系的分布式系统有多种方法来处理高并发问题。首先,它利用了分布式架构的优势,将系统拆分成多个子系统,每个子系统都可以独立处理一部分请求,从而降低了单个系统的并发压力。 其次,阿里体系的分布式系统采用了分布式缓存技术,例如使用Redis等缓存系统,可以将频繁访问的数据缓存在内存中,提高系统的响应速度,降低数据库的压力。 此外,该系统还采用了负载均衡技术,通过将请求分发到多个服务器上,实现了请求的分流,进一步提高了系统的并发处理能力。 还有一个重要的方法是,基于阿里体系的分布式系统采用了分布式数据库技术,例如阿里云的RDS数据库,可以将数据存储在不同的节点上,实现数据的分片和分布,从而提高了数据的读写并发能力。 此外,系统还采用了异步处理和消息队列等技术来解耦请求和处理逻辑,降低了系统的耦合度,提高了系统的并发处理能力。 总之,基于阿里体系的分布式系统通过拆分架构、缓存、负载均衡、分布式数据库、异步处理和消息队列等技术来处理高并发问题,提高了系统的并发处理能力和可伸缩性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值