>  기사  >  데이터 베이스  >  프로젝트의 동시성을 높이는 방법은 무엇입니까? 대기열 순서를 보장하려면 ID 자동 증가를 사용하세요.

프로젝트의 동시성을 높이는 방법은 무엇입니까? 대기열 순서를 보장하려면 ID 자동 증가를 사용하세요.

零下一度
零下一度원래의
2017-05-06 14:57:071775검색

시나리오 분석

빨간 봉투 잡기 시나리오를 예로 들어 요구 사항은 다음과 같습니다.

    1.红包有个数限制,假设红包的个数限制为X。
    2.红包金额上线限制,假设金额上线为Y。
    3.要求用户抢红包的时候,不超过红包的个数限制X。
    4.要求用户抢红包的时候,不超过红包的金额Y。
    5.每个用户一次红包活动只能抢一个。

기존 아이디어

가장 일반적인 아이디어는 다음과 같습니다.

    1.在用户抢红包时,检查当前发出去红包数量和金额,并加锁。
    2.检查红包数量和金额正常的后,随机用户红包金额。
    3.然后修改红包发出去的数量和金额,并给用户赠送红包,然后解锁。

기존 아이디어의 장점과 단점

첫 번째 장점

    1.思路简单
    2.编不下去了。。。

그럼 단점도 있습니다

    1.锁数据回造成大量进程等待,造成浪费资源。
    2.锁造成的等待,用户体验奇差。
    3.对于锁机制不太了解的同学会产生一定的危险性。

최적화 아이디어

먼저 분석해 보면 기존 아이디어는 왜 느린가요?

    1.在抢红包的时候,每次都需要检查红包的上限 X 和 Y。
    2.锁会造成大量进程卡顿。
    3.生成红包的金额时还需要检查与上限 X 跟 Y 是否有冲突。

최적화 솔루션

빨간 봉투 생성 전제 조건

예를 들어 빨간 봉투 개수 상한은 X이고 수량 상한은 Y입니다. .
그런 다음 이벤트 전에 X개의 빨간색 봉투를 데이터베이스에 삽입하고
일련 번호 HB1, HB2, HB3을 생성합니다. . . . HBX

사실 사용자는 이 질서정연한 빨간 봉투 대기열만 순서대로 받으면 됩니다.
이 작업을 수행하면 당시 온라인으로 수행하게 될 계산이 많이 줄어듭니다. 가장 중요한 점은 전체 활동을 간단하고 효과적으로 제어할 수 있다는 것입니다.

빨간 봉투를 잡는 단계는 다음과 같습니다

    1.活动创建之前,创建一张ID生成表,ID从 1 开始自增,且 user_id 唯一。
    2.活动开始,用户开始抢红包操作。
    3.抢红包之前,先插入ID表,获取插入ID,如果ID > X,通知用户已被抢完。
    4.如果 ID <= X,那么恭喜了,去红包表领取序号为 ID 的红包,并走异步发红包过程。
    5.活动结束之后,把相关用户领取信息存储在红包表,删除ID生成表。

솔루션의 장점

    1.不需要代码实现锁机制。
    2.逻辑简单。
    3.mysql保证每个用户只能拿到一个,且有序。

더 많은 생각

어떤 친구들은 Redis 대기열을 사용할 수 있다고 언급했습니다. 하지만 실제로 Redis는 더 많은 메모리를 차지합니다. 장기간 데이터를 저장해야 한다면 mysql에 저장하는 것이 가장 좋습니다. 실제로 여기에서 redis의 incr 명령을 사용하면 위에서 언급한 ID 생성 테이블과 유사한 기능을 얻을 수 있습니다. 이는 더 빠르고 엄격하게 증분적이며 전체 프로젝트의 동시성을 높일 수 있습니다.

[관련 추천]

1.

무료 mysql 온라인 동영상 튜토리얼

2.MySQL 최신 매뉴얼 튜토리얼

3. 데이터베이스 설계에 관한 사항

위 내용은 프로젝트의 동시성을 높이는 방법은 무엇입니까? 대기열 순서를 보장하려면 ID 자동 증가를 사용하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.