เปเบˆเบเบขเบฒเบเบเบฒเบ™เบฅเบฑเบญเบเป‚เบ”เบเปƒเบŠเป‰ Redis

Hey Habr!

เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบกเบฒเปƒเบซเป‰เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบเบฑเบšเบเบฒเบ™เปเบ›เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” locking เปเบˆเบเบขเบฒเบเป‚เบ”เบเปƒเบŠเป‰ Redis เปเบฅเบฐเป€เบŠเบตเบ™เบ—เปˆเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ”เปƒเบชเบ”เป‰เบฒเบ™เบ‚เบญเบ‡ Redis เป€เบ›เบฑเบ™เบซเบปเบงเบ‚เปเป‰. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบšเบปเบš Redlock เปƒเบ™เบ„เปเบฒเบ–เบฒเบกเบˆเบฒเบ Martin Kleppmann, เบœเบนเป‰เบ‚เบฝเบ™เบซเบ™เบฑเบ‡เบชเบท "เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเป‚เบซเบผเบ”เบชเบนเบ‡", เปƒเบซเป‰ เบ—เบตเปˆเบ™เบตเป‰.

locking เปเบˆเบเบขเบฒเบเปเบกเปˆเบ™เป€เบ›เบฑเบ™ primitive เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบซเบผเบฒเบเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบฎเปˆเบงเบกเบเบฑเบ™เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐเป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™.

เบกเบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” DLM (Distributed Lock Manager) เป‚เบ”เบเปƒเบŠเป‰ Redis, เปเบ•เปˆเปเบ•เปˆเบฅเบฐเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบชเบฐเบซเบ™เบญเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบญเปˆเบญเบ™เป€เบžเบเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เบเบงเปˆเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบญเบฐเบ—เบดเบšเบฒเบ algorithm canonical เบ—เบตเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบเปเบšเบšเปเบˆเบเบขเบฒเบเป‚เบ”เบเปƒเบŠเป‰ Redis. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบš algorithm เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ Redlock, เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบเบ—เบตเปˆเปเบˆเบเบขเบฒเบเปเบฅเบฐ, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ›เบญเบ”เป„เบžเบเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบงเบ›เบปเบเบเบฐเบ•เบด. เบžเบงเบเป€เบฎเบปเบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบŠเบธเบกเบŠเบปเบ™เบˆเบฐเบงเบดเป€เบ„เบฒเบฐเบกเบฑเบ™, เปƒเบซเป‰เบ„เปเบฒเบ„เบดเบ”เป€เบซเบฑเบ™, เปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบทเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™.

เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡ algorithm, เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบซเบผเบฒเบเป†เบขเปˆเบฒเบ‡เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบก. เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡.

  • Redlock-rb (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš Ruby). เบเบฑเบ‡เบกเบต เบชเป‰เบญเบก Redlock-rb, เป€เบŠเบดเปˆเบ‡เป€เบžเบตเปˆเบกเบŠเบธเบ” (เปเบเป‰เบงเบ›เบฐเป€เบชเบตเบ”) เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เปเบˆเบเบขเบฒเบ, เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบฑเป‰เบ™.
  • Redlock-py (เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Python).
  • Aioredlock (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš Asyncio Python).
  • Redlock-php (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš PHP).
  • PHPRedisMutex (เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบญเบทเปˆเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš PHPโ€‹)
  • cheprasov/php-redis-lock (เบซเปเบชเบฐเบซเบกเบธเบ” PHP เบชเปเบฒเบฅเบฑเบšเบฅเบฑเบญเบ)
  • Redsync (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš Go).
  • เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™ (เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš Javaโ€‹)โ€‹.
  • Redis::DistLock (เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš Perlโ€‹)โ€‹.
  • Redlock-cpp (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš C++).
  • Redlock-cs (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš C#/.NET).
  • RedLock.net (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš C#/.NET). เบ”เป‰เบงเบเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ async เปเบฅเบฐ lock extensions.
  • ScarletLock (เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš C# .NET เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹)
  • Redlock4Net (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš C# .NET)
  • node-redlock (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš NodeJS). เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ locks.

เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž เปเบฅเบฐเบ„เบงเบฒเบกเบžเป‰เบญเบก

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบˆเบฐเบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบเบฒเบ™เบญเบญเบเปเบšเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ„เบดเบ”เบงเปˆเบฒเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ‚เบฑเป‰เบ™เบ•เปˆเปเบฒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบเบฐเปเบˆเบเบเบฐเบˆเบฒเบเบขเปˆเบฒเบ‡เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

  1. เบŠเบฑเบšเบชเบดเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž: เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เปƒเบ™เป€เบงเบฅเบฒเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบฅเบนเบเบ„เป‰เบฒเบ„เบปเบ™เบ”เบฝเบงเบชเบฒเบกเบฒเบ”เบ–เบทเบฅเบฑเบญเบเป„เบ”เป‰.
  2. Availability Property A: เบšเปเปˆเบกเบต deadlocks. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเบฐเป€เบซเบกเบตเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบกเบฒเบฅเบฑเบญเบ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบฅเบฑเบญเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบฅเบปเป‰เบกเป€เบซเบฅเบงเบซเบผเบทเบฅเบปเบ‡เปƒเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ‚เบญเบ‡เปเบœเปˆเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.
  3. เบŠเบฑเบšเบชเบดเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆ B: เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”. เบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ‚เปเป‰ Redis เบเปเบฒเบฅเบฑเบ‡เปเบฅเปˆเบ™, เบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเปเบฅเบฐเบ›เปˆเบญเบเบ•เบปเบงเบฅเบฑเบญเบ.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบŸเบทเป‰เบ™เบŸเบนเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเปเบกเปˆเบ™เบšเปเปˆเบžเบฝเบ‡เบžเปเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰
เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡, เปƒเบซเป‰เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบฑเบญเบเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ Redis.

เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบฅเบฑเบญเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เป‚เบ”เบเปƒเบŠเป‰ Redis เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฐเปเบˆเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เบเบฐเปเบˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบกเบตเบŠเบตเบงเบดเบ”เบ—เบตเปˆเบˆเปเบฒเบเบฑเบ”, เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบซเบกเบปเบ”เบญเบฒเบเบธเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™ Redis, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบŠเป‰เบฒเบซเบผเบทเบ•เปเปˆเบกเบฒเบเบฐเปเบˆเบ™เบตเป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ (เบŠเบฑเบšเบชเบดเบ™ 2 เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ). เป€เบกเบทเปˆเบญเบฅเบนเบเบ„เป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบญเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™, เบกเบฑเบ™เบˆเบฐเบฅเบถเบšเบฅเบฐเบซเบฑเบ”.

เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ”เบต, เปเบ•เปˆเบกเบตเบšเบฑเบ™เบซเบฒ: เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบˆเบธเบ”เบ”เบฝเบงเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง. เบˆเบฐเป€เบเบตเบ”เบซเบเบฑเบ‡เบ‚เบถเป‰เบ™เบ–เป‰เบฒ Host Redis เบฅเบปเป‰เบกเป€เบซเบฅเบง? เบ‚เปเปƒเบซเป‰เป€เบžเบตเปˆเบกเบ‚เป‰เบฒเบ—เบฒเบ”! เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบกเบฑเบ™เบ–เป‰เบฒเบœเบนเป‰เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰. เป‚เบ”เบเบเบฒเบ™เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบเปˆเบฝเบงเบเบฑเบšเบŠเบฑเบšเบชเบดเบ™เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เปƒเบ™ Redis เปเบกเปˆเบ™ asynchronous.

เปเบ™เปˆเบ™เบญเบ™, เปƒเบ™เบฎเบนเบšเปเบšเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบชเบฐเบžเบฒเบšเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™:

  1. เบฅเบนเบเบ„เป‰เบฒ A เป„เบ”เป‰เบกเบฒเบฅเบฑเบญเบเปƒเบ™เปเบกเปˆเบšเบปเบ”.
  2. เปเบกเปˆเบšเบปเบ”เบฅเบปเป‰เบกเป€เบซเบฅเบงเบเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบˆเบฐเบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบชเปเบฒเบฅเบญเบ‡.
  3. เบœเบนเป‰เบ•เบดเบ”เบ•เบฒเบกเบ–เบทเบเป€เบฅเบทเปˆเบญเบ™เป€เบ›เบฑเบ™เบœเบนเป‰เบ™เปเบฒ.
  4. เบฅเบนเบเบ„เป‰เบฒ B เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเบฑเบญเบเบขเบนเปˆเปƒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆ A เป„เบ”เป‰เบฅเบฑเบญเบเป„เบงเป‰เปเบฅเป‰เบง. เบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž!

เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบดเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบ—เบตเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบžเบดเป€เบชเบ”, เป€เบŠเบฑเปˆเบ™เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบง, เบฅเบนเบเบ„เป‰เบฒเบซเบผเบฒเบเบ„เบปเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบฅเบฑเบญเบเป„เบ”เป‰เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ”เป‰เบงเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบง

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบญเบปเบฒเบŠเบฐเบ™เบฐเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบงเบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ™เบตเป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เปเบกเปˆเบ™เปƒเบŠเป‰เป„เบ”เป‰เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบšเป„เบ”เป‰เปƒเบ™เบšเบฒเบ‡เป€เบงเบฅเบฒ, เปเบฅเบฐเบเป‰เบญเบ™เบงเปˆเบฒเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เปƒเบ™ เบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบงเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ algorithm เปเบˆเบเบขเบฒเบเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.

เป€เบžเบทเปˆเบญโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš lock เป„เบ”เป‰โ€‹, เป€เบฎเบฑเบ”โ€‹เปเบ™เบงโ€‹เบ™เบตเป‰โ€‹:

SET resource_name my_random_value NX PX 30000

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบฅเบฐเบซเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง (เบ—เบฒเบ‡เป€เบฅเบทเบญเบ NX), เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบกเปˆเบ™ 30000 milliseconds (เบ—เบฒเบ‡เป€เบฅเบทเบญเบ PX). เบฅเบฐเบซเบฑเบ”เบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ โ€œmyrandomvalue" เบ„เปˆเบฒเบ™เบตเป‰เบˆเบฐเบ•เป‰เบญเบ‡เบšเปเปˆเบŠเปเป‰เบฒเบเบฑเบ™เปƒเบ™เบ—เบธเบเบฅเบนเบเบ„เป‰เบฒ เปเบฅเบฐเบ—เบธเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบฅเบฑเบญเบ.
เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบง, เบ„เปˆเบฒเปเบšเบšเบชเบธเปˆเบกเปเบกเปˆเบ™เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เบปเบ”เบฅเป‹เบญเบเบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบž, เป‚เบ”เบเบกเบตเบชเบฐเบ„เบฃเบดเบšเบšเบญเบ Redis: เบžเบฝเบ‡เปเบ•เปˆเป€เบญเบปเบฒเบเบฐเปเบˆเบญเบญเบเบ–เป‰เบฒเบกเบฑเบ™เบกเบตเบขเบนเปˆ เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ•เบฒเบกเบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰. เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบญเบฑเบเบชเบญเบ™ Lua เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰เบฅเบฑเบญเบเบ—เบตเปˆเบ–เบทเป‚เบ”เบเบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™เบญเบญเบเบˆเบฒเบเบเบฒเบ™เป‚เบเบเบเป‰เบฒเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบฅเบนเบเบ„เป‰เบฒเบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš lock, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบเป€เบ›เบฑเบ™เบฅเบฑเบญเบเปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบเบฒเบงเบเบงเปˆเบฒเบฅเบฑเบญเบเบ—เปเบฒเบญเบดเบ” (เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฐเปเบˆเบกเบตเป€เบงเบฅเบฒเบซเบกเบปเบ”เบญเบฒเบเบธ), เปเบฅเบฐเบ•เปเปˆเบกเบฒเป€เบญเบปเบฒเบฅเบฑเบญเบเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบšเบฒเบ‡เบ„เบปเบ™เบงเบฒเบ‡เป„เบงเป‰.
เบเบฒเบ™เปƒเบŠเป‰ DEL เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบเปเบกเปˆเบ™เบšเปเปˆเบ›เบญเบ”เป„เบžเป€เบžเบฒเบฐเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบฅเบฑเบญเบเบ—เบตเปˆเบ–เบทเป„เบงเป‰เป‚เบ”เบเบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™. เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เป€เบกเบทเปˆเบญเปƒเบŠเป‰เบชเบฐเบ„เบดเบšเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปเบ•เปˆเบฅเบฐ lock เปเบกเปˆเบ™ "เป€เบŠเบฑเบ™" เบ”เป‰เบงเบเบชเบฒเบเปเบšเบšเบชเบธเปˆเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบงเบฒเบ‡เป„เบงเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบกเบฑเบ™เบญเบญเบเป„เบ”เป‰.

เบชเบฐเบ•เบดเบ‡เปเบšเบšเบชเบธเปˆเบกเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”? เบ‚เป‰เบญเบเบ„เบฒเบ”เป€เบ”เบปเบฒเบงเปˆเบฒเบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™ 20 bytes เบˆเบฒเบ /dev/urandom, เปเบ•เปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบ—เบตเปˆเบกเบตเบฅเบฒเบ„เบฒเปเบžเบ‡เบซเบ™เป‰เบญเบเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบฐเบ•เบฃเบดเบ‡เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบžเบฝเบ‡เบžเปเบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเปเบเปˆเบ™ RC4 เบเบฑเบš /dev/urandom เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเป‰เบฒเบ‡เบเบฐเปเบช pseudo-random เบˆเบฒเบเบกเบฑเบ™. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ‡เปˆเบฒเบเบเบงเปˆเบฒเบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบฅเบงเบกเป€เบงเบฅเบฒ unix เปƒเบ™เบ„เบงเบฒเบกเบฅเบฐเบญเบฝเบ”เป„เบกเป‚เบ„เบฃเบงเบดเบ™เบฒเบ—เบตเบšเบงเบเบเบฑเบš ID เบฅเบนเบเบ„เป‰เบฒ; เบกเบฑเบ™เบšเปเปˆเบ›เบญเบ”เป„เบžเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ„เบงเบ™, เปเบ•เปˆเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ‚เบถเป‰เบ™เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆ.

เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบญเบฒเบเบธเบ‚เบญเบ‡เบเบฐเปเบˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ "เบญเบฒเบเบธเบเบฒเบ™เบฅเบฑเบญเบ". เบกเบนเบ™เบ„เปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ—เบฑเบ‡เบˆเปเบฒเบ™เบงเบ™เป€เบงเบฅเบฒเบเปˆเบญเบ™เบ—เบตเปˆ lock เบˆเบฐเบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบเปˆเบญเบ™เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™เบชเบฒเบกเบฒเบ”เบฅเบฑเบญเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ™เบฑเป‰เบ™, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเบเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เป€เบงเบฅเบฒ, เป€เบŠเบดเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฑเบญเบเบ–เบทเบเบŠเบทเป‰.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบกเบฒเปเบฅเบฐเบ›เปˆเบญเบ lock เป„เบ”เป‰. เบฅเบฐเบšเบปเบš (เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบšเปเปˆเปเบˆเบเบขเบฒเบเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบงเปเบฅเบฐเบชเบฐเป€เบซเบกเบตเบ—เบตเปˆเบกเบตเบขเบนเปˆ) เปเบกเปˆเบ™เบ›เบญเบ”เป„เบž. เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฐเบซเบเบฒเบเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ™เบตเป‰เป„เบ›เบชเบนเปˆเบฅเบฐเบšเบปเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบ, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ Redlock

เบชเบฐเบšเบฑเบšเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบ‚เบญเบ‡ algorithm เบ–เบทเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบต N Redis masters. nodes เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบ‚เบญเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰ replication เบซเบผเบทเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™ implicit เบญเบทเปˆเบ™เป†. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบเบงเบกโ€‹เป€เบญเบปเบฒโ€‹เปเบฅเป‰เบงโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบขเปˆเบฒเบ‡โ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ›เบปเบ”โ€‹เบฅเบฑเบญเบโ€‹เปƒเบ™โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบ”เบฝเบงโ€‹. เบžเบงเบเป€เบฎเบปเบฒเบเบญเบกเบฎเบฑเบšเบงเปˆเบฒ algorithm, เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบง, เบˆเบฐเปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰เปเบ—เป‰เป†. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ” N เบเบฑเบš 5, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰ 5 Redis masters เปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡ virtual เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเบฑเบญเบ, เบฅเบนเบเบ„เป‰เบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เป„เบ”เป‰เบฎเบฑเบšเป€เบงเบฅเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบ›เบฑเบ™ milliseconds.
  2. เบžเบฐเบเบฒเบเบฒเบกเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฅเบฑเบญเบเบขเบนเปˆเปƒเบ™เบ—เบธเบเบเปเบฅเบฐเบ™เบต N, เป‚เบ”เบเปƒเบŠเป‰เบŠเบทเปˆเบ„เบตเบ”เบฝเบงเบเบฑเบ™ เปเบฅเบฐเบ„เปˆเบฒเบชเบธเปˆเบกเปƒเบ™เบ—เบธเบเบเปเบฅเบฐเบ™เบต. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 2, เป€เบกเบทเปˆเบญเบฅเบนเบเบ„เป‰เบฒเบ•เบฑเป‰เบ‡ lock เบšเบปเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ•เปเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡, เบฅเบนเบเบ„เป‰เบฒเปƒเบŠเป‰เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบกเบฒเบกเบฑเบ™เบชเบฑเป‰เบ™เบžเบฝเบ‡เบžเปเป€เบกเบทเปˆเบญเบ—เบฝเบšเปƒเบชเปˆเบเบฑเบšเป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฑเบญเบเบˆเบฐเบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเป„เบฅเบเบฐเป€เบงเบฅเบฒเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เปเบกเปˆเบ™ 10 เบงเบดเบ™เบฒเบ—เบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเบญเบฒเบ”เบˆเบฐเบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡ ~ 5-50 เบกเบดเบ™เบฅเบดเบงเบดเบ™เบฒเบ—เบต. เบ™เบตเป‰เบเปเบฒเบˆเบฑเบ”เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบšเบฅเบฑเบญเบเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เป€เบžเบทเปˆเบญเบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเบซเบฒเป‚เบซเบ™เบ” Redis เบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบง: เบ–เป‰เบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰, เบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เป„เบงเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบˆเบฐเป„เบงเป„เบ”เป‰.
  3. เป€เบžเบทเปˆเบญเป€เบญเบปเบฒ lock, เบฅเบนเบเบ„เป‰เบฒเบ„เบดเบ”เป„เบฅเปˆเบงเปˆเบฒเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›เป€เบ—เบปเปˆเบฒเปƒเบ”; เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบกเบฑเบ™เบซเบฑเบเบญเบญเบเบˆเบฒเบเบกเบนเบ™เบ„เปˆเบฒเป€เบงเบฅเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 1. เบ–เป‰เบฒเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš lock เปƒเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 3), เปเบฅเบฐเป€เบงเบฅเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒ. เป„เบ”เป‰โ€‹เบฎเบฑเบš lock เป„เบ”เป‰โ€‹, เบซเบ™เป‰เบญเบโ€‹เบโ€‹เปˆโ€‹เบงเบฒโ€‹เป„เบฅโ€‹เบเบฐโ€‹เป€เบงโ€‹เบฅเบฒ lock เป„เบ”เป‰โ€‹, lock เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบžเบดโ€‹เบˆเบฒโ€‹เบฅเบฐโ€‹เบ™เบฒโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹.
  4. เบ–เป‰เบฒเป„เบ”เป‰เบกเบฒเบฅเบฑเบญเบ, เป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฑเบญเบเบˆเบฐเบ–เบทเบเป€เบญเบปเบฒเบกเบฒเป€เบ›เบฑเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฑเบญเบเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบฅเบปเบšเบเบฑเบšเป€เบงเบฅเบฒเบ—เบตเปˆเบœเปˆเบฒเบ™เป„เบ›เบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 3.
  5. เบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบฅเบฑเบญเบเบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡ (เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบฅเบฑเบญเบ N/2+1 instances, เบซเบผเบทเป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฑเบญเบเป€เบ›เบฑเบ™เบฅเบปเบš), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ›เบปเบ”เบฅเบฑเบญเบเบ—เบธเบเบ•เบปเบงเบขเปˆเบฒเบ‡ (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบšเบฅเบฑเบญเบเป„เบ”เป‰. ).

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบšเปเปˆเบเบปเบ‡เบเบฑเบ™เบšเป?

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบงเปˆเบฒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเบกเบตเป‚เบกเบ‡ synchronized เบ—เบตเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบงเบฅเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เปƒเบ™เปเบ•เปˆเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบˆเบฑเบ‡เบซเบงเบฐเบ”เบฝเบงเบเบฑเบ™, เปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบซเบ™เป‰เบญเบเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเป€เบงเบฅเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบฅเบฑเบญเบเปเบกเปˆเบ™. เบ›เปˆเบญเบเบญเบญเบเบกเบฒเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบเบฒเบ™เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ—เบปเปˆเบงเป„เบ›: เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเปเบ•เปˆเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบตเป‚เบกเบ‡เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™, เปเบฅเบฐเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ™เบฑเบšเป„เบ”เป‰เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบงเบฅเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบกเปˆเบ™เบ™เป‰เบญเบ.

เปƒเบ™เบˆเบธเบ”เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เบฎเปˆเบงเบกเบเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบขเปˆเบฒเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡: เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เปเบกเปˆเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเบ–เบท lock เบญเบญเบเบˆเบฒเบเป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฑเบญเบเบ–เบทเบเบ•เป‰เบญเบ‡ (เบ„เปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 3), เบฅเบปเบšเบšเบฒเบ‡เป€เบงเบฅเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก (เบˆเปเบฒเบ™เบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. milliseconds เป€เบžเบทเปˆเบญเบŠเบปเบ”เป€เบŠเบตเบเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เป€เบงเบฅเบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™).

เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบšเบญเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒ: เบเบฒเบ™เป€เบŠเบปเปˆเบฒ: เบเบปเบ™เป„เบเบเบฒเบ™เบ•เป‰เบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบญเบ”เบ„เปˆเบญเบ‡เบ‚เบญเบ‡เปเบ„เบ”เป„เบŸเบฅเปŒเบ—เบตเปˆเปเบˆเบเบขเบฒเบ.

เบฅเบญเบ‡เปƒเบŠเป‰เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบงเบญเบตเบเบ„เบฑเป‰เบ‡

เป€เบกเบทเปˆเบญเบฅเบนเบเบ„เป‰เบฒเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบš lock, เบกเบฑเบ™เบ•เป‰เบญเบ‡เบžเบฐเบเบฒเบเบฒเบกเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเปเบšเบšเบชเบธเปˆเบก; เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญ de-synchronize เบฅเบนเบเบ„เป‰เบฒเบซเบผเบฒเบเบ„เบปเบ™เบ—เบตเปˆเบžเบฐเบเบฒเบเบฒเบกเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš lock เปƒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ”เบฝเบงเบเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ (เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™ "split-brain" เบ—เบตเปˆเบšเปเปˆเบกเบตเบœเบนเป‰เบŠเบฐเบ™เบฐ). เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเบฅเบนเบเบ„เป‰เบฒเบžเบฐเบเบฒเบเบฒเบกเบซเบฒเบ•เบปเบงเบฅเบฑเบญเบเปƒเบ™เบเปเบฅเบฐเบ™เบต Redis เบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเปเบ„เบšเบเบงเปˆเบฒเบ—เบตเปˆเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบชเบฐเบซเบกเบญเบ‡เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป„เบ”เป‰ (เปเบฅเบฐเบซเบ™เป‰เบญเบเบฅเบปเบ‡, เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเปƒเบซเบกเปˆ). เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบฅเบนเบเบ„เป‰เบฒเบ„เบงเบ™เบžเบฐเบเบฒเบเบฒเบกเบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ SET เป„เบ›เบซเบฒ N instances เบžเป‰เบญเบกเบเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ multiplexing.

เบกเบฑเบ™เบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบ™เบฑเป‰เบ™เบซเบ™เบฑเบเป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบŠเบทเป‰ locks เบชเปˆเบงเบ™เปƒเบซเบเปˆเป€เบžเบทเปˆเบญเบ›เบปเบ”เบฅเป‹เบญเบ (เบšเบฒเบ‡เบชเปˆเบงเบ™) เบ—เบตเปˆเป„เบ”เป‰เบกเบฒ, เป€เบžเบทเปˆเบญเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบเบฐเปเบˆเบซเบกเบปเบ”เบญเบฒเบเบธเบเปˆเบญเบ™เบ—เบตเปˆ lock เบเปˆเบฝเบงเบเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เปเบ•เบเปเบเบเบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป€เบเบตเบ”เบ‚เบถเป‰เบ™, เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบชเบนเบ™เป€เบชเบเบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡ Redis, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบˆเปˆเบฒเบเบ„เปˆเบฒเบ›เบฑเบšเป„เบซเบกเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบเบฐเปเบˆเบซเบกเบปเบ”เบญเบฒเบเบธ).

เบ›เปˆเบญเบ lock เป„เบ”เป‰

เบเบฒเบ™เบ›เบปเบ”เบฅเป‹เบญเบเบฅเบฑเบญเบเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบณเป€เบ™เบตเบ™เบเบฒเบ™เบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบปเบ”เบฅเบฑเบญเบเบ—เบธเบเบเปเบฅเบฐเบ™เบต, เป‚เบ”เบเบšเปเปˆเบชเบปเบ™เป€เบฅเบทเปˆเบญเบ‡เบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบˆเบฐเบฅเบฑเบญเบเบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ”เบ™เบถเปˆเบ‡เบขเปˆเบฒเบ‡เบชเบณเป€เบฅเบฑเบ”เบœเบปเบ™เบซเบผเบทเบšเปเปˆ.

เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ›เบญเบ”เป„เบžเบšเป? เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš lock เปƒเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡. เปเบ•เปˆเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฐเบกเบตเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบญเบฒเบเบธเบ”เบฝเบงเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเบ„เบปเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปเบ•เปˆเบฅเบฐเบเบฐเปเบˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเบกเบฑเบ™เบˆเบฐเบซเบกเบปเบ”เบญเบฒเบเบธเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เปเบ•เปˆ, เบ–เป‰เบฒเบเบฐเปเบˆเบ—เปเบฒเบญเบดเบ”เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ™เป€เบงเบฅเบฒเบšเปเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบเบงเปˆเบฒ T1 (เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เปเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เปเบฒเบญเบดเบ”), เปเบฅเบฐเบเบฐเปเบˆเบชเบธเบ”เบ—เป‰เบฒเบเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ™เป€เบงเบฅเบฒเบšเปเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบเบงเปˆเบฒ T2 (เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบญเบšเบฎเบฑเบš. เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบชเบธเบ”เบ—เป‰เบฒเบ), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบซเบกเบฑเป‰เบ™เปƒเบˆเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบŠเบธเบ”เบ—เบตเปˆเบซเบกเบปเบ”เบญเบฒเบเบธเบˆเบฐเบขเบนเปˆเบฅเบญเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. เบเบฐเปเบˆเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเปเบปเบ”เบญเบฒเบเบธเปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบถเปˆเบ‡เบชเบฒเบกเบฒเบ”เปเบฑเป‰เบ™เปƒเบˆเป„เบ”เป‰เบงเปˆเบฒเบเบฐเปเบˆเบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเปƒเบŠเป‰เป„เบ”เป‰เบžเป‰เบญเบกเบเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบขเปˆเบฒเบ‡เปœเป‰เบญเบเบ™เบตเป‰.

เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฐเปเบˆเบชเปˆเบงเบ™เปƒเบซเบเปˆเบเบฑเบ‡เบ„เบปเบ‡เปƒเบŠเป‰เป„เบ”เป‰, เบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš lock เป„เบ”เป‰, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ N/2+1 SET NX operations เบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบณเป€เบฅเบฑเบ”เป„เบ”เป‰เบ–เป‰เบฒ N/2+1 key เบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเป„เบ”เป‰ lock เป„เบ”เป‰, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบกเบฒเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ (เบ™เบตเป‰เบˆเบฐเบฅเบฐเป€เบกเบตเบ”เบŠเบฑเบšเบชเบดเบ™เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™).
เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบซเบผเบฒเบเบ„เบปเบ™เบ—เบตเปˆเบžเบฐเบเบฒเบเบฒเบกเบŠเบทเป‰ lock เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™.

เบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเป„เบ”เป‰เบฅเบฑเบญเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปˆเบงเบ™เปƒเบซเบเปˆเป„เบงเป‰เบ›เบฐเบกเบฒเบ™ เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฑเบญเบเบชเบนเบ‡เบชเบธเบ”, เบกเบฑเบ™เบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบฅเบฑเบญเบเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡ เปเบฅเบฐเบ›เบปเบ”เบฅเบฑเบญเบเบเปเบฅเบฐเบ™เบต. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบชเบฐเบเบฑเบ”เบเบฑเป‰เบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™เป€เบงเบฅเบฒเบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบงเบฑเบ™เบซเบกเบปเบ”เบญเบฒเบเบธ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒ MIN_VALIDITY เบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒเปƒเบ”เบ„เบงเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš lock เป„เบ”เป‰. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบฅเบนเบเบ„เป‰เบฒเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบˆเบฐเบชเบฒเบกเบฒเบ”เบฅเบฑเบญเบ N / 2+1 instances เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ (เป€เบŠเบดเปˆเบ‡เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบต 2) เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบฅเบฑเบญเบเบชเปˆเบงเบ™เปƒเบซเบเปˆเบซเบผเบฒเบเบเบงเปˆเบฒเป€เบงเบฅเบฒ TTL, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบฅเบฑเบญเบเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฐเบซเบ™เบญเบ‡เบซเบผเบฑเบเบ–เบฒเบ™เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบŠเบตเป‰เบšเบญเบเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบซเบผเบทเบŠเบญเบเบซเบฒ bug เปƒเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰?

เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡

เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบฒเบกเบฅเบฑเบเบชเบฐเบ™เบฐเบ•เบปเป‰เบ™เบ•เป:

  1. เบ›เบปเบ”เบฅเป‹เบญเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เบเป‰เบญเบ™เบงเปˆเบฒเบเบฐเปเบˆเปเบปเบ”เบญเบฒเบเบธ): เบเบฐเปเบˆเบˆเบฐเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบญเบตเบเบ„เบฑเป‰เบ‡เป€เบžเบทเปˆเบญเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบฅเบฑเบญเบ.
  2. เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบŠเปˆเบงเบเป€เบซเบผเบทเบญเป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เป‚เบ”เบเบเบฒเบ™เบ–เบญเบ” locks เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ lock เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบกเบฒ, เบซเบผเบทเป„เบ”เป‰เบฎเบฑเบšเปเบฅเบฐเบงเบฝเบเป€เบฎเบฑเบ”เบ‡เบฒเบ™เบ—เปเบฒเบชเปเบฒเป€เบฅเบฑเบ”; เบชเบฐเบ™เบฑเป‰เบ™ เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบˆเบณเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบเบฐเปเบˆเปเบปเบ”เบญเบฒเบเบธเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฅเบฑเบญเบเบ„เบทเบ™เปƒเปเปˆ.
  3. เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบ„เบทเบ™เปƒเบซเบกเปˆเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบกเบฒเบฅเบฑเบญเบ, เบกเบฑเบ™เบฅเปเบ–เป‰เบฒเป€เบงเบฅเบฒเบ›เบฝเบšเบ—เบฝเบšเบ—เบตเปˆเบเบฒเบงเบเบงเปˆเบฒเป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบกเบฒเบฅเบฑเบญเบเบชเปˆเบงเบ™เปƒเบซเบเปˆ. เบ™เบตเป‰เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบชเบฐเบซเบกเบญเบ‡เปเบ•เบเบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบตเบเบฒเบ™เบฅเบปเบ‡เป‚เบ—เบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบžเป‰เบญเบกเป€เบ—เบปเปˆเบฒเบเบฑเบš TTL เบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบกเบตเบžเบฒเบเบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเบเบฑเบ™, เบเบฒเบ™เบฅเบปเบ‡เป‚เบ—เบ”เบญเบฒเบ”เบšเปเปˆเบกเบตเบเปเบฒเบ™เบปเบ”. เบญเบฑเบ™เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเป„เบ”เป‰เบฎเบฑเบš lock เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ rips เป„เบ›เบžเบฒเบเบชเปˆเบงเบ™เบญเบทเปˆเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ›เปˆเบญเบเบกเบฑเบ™.

เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบžเบฒเบเบชเปˆเบงเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเบ•เบดเบ”เบเบฑเบ™เบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”, เบฅเบฐเบšเบปเบšเบชเบฒเบกเบฒเบ”เบเบฑเบ‡เบ„เบปเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบฅเบปเป‰เบกเป€เบซเบฅเบงเปเบฅเบฐ fsync

เบซเบผเบฒเบเบ„เบปเบ™เปƒเบŠเป‰ Redis เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ lock เบชเบนเบ‡เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡ latency เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบกเบฒเปเบฅเบฐเบ›เปˆเบญเบ locks, เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบŠเบทเป‰ / เบ›เปˆเบญเบเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต. เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ™เบตเป‰, เบกเบตเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เปเปˆเบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ N Redis เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒ latency. เบ™เบตเป‰เปเบกเปˆเบ™เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™ multiplexing (เบซเบผเบท "เบเบฒเบ™ multiplexing เบœเบนเป‰เบŠเบฒเบเบ—เบตเปˆเบ—เบธเบเบเบฒเบ", เบšเปˆเบญเบ™เบ—เบตเปˆ socket เป„เบ”เป‰เบ–เบทเบเปƒเบชเปˆเปƒเบ™เป‚เบซเบกเบ”เบšเปเปˆเบชเบฐเบเบฑเบ”, เบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐเบญเปˆเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเบกเบฒ, เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบงเบฅเบฒเป„เบ›เบเบฑเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเปเบ•เปˆเบฅเบฐ instance เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™). .

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป„เบฅเบเบฐเบเบฒเบงเบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบกเบตเบเบฒเบ™เบŸเบทเป‰เบ™เบŸเบนเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบˆเบฒเบเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบง.

เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบง, เป€เบžเบทเปˆเบญเบŠเบตเป‰เปเบˆเบ‡เบšเบฑเบ™เบซเบฒ, เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบซเบ™เบปเบ”เบ„เปˆเบฒ Redis เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป„เบฅเบเบฐเบเบฒเบงเบ—เบฑเบ‡เบซเบกเบปเบ”. เบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบšเบฅเบฑเบญเบ 3 เปƒเบ™ 5 เบเปเบฅเบฐเบ™เบต. เบซเบ™เบถเปˆเบ‡เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบ„เบธเป‰เบกเบ„เบญเบ‡เป€เบžเบทเปˆเบญเบšเบฅเบฑเบญเบเปเบกเปˆเบ™ restarted, เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰เบกเบต 3 เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ”เบฝเบงเบเบฑเบ™, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบšเบฅเบฑเบญเบ, เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™เบชเบฒเบกเบฒเบ”, เบชเบฐเบเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ, เบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบŠเบฑเบšเบชเบดเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ—เบตเปˆ. เบ–เบทเบงเปˆเบฒเบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบฅเบฑเบญเบ.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ (AOF), เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบกเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป‚เบ”เบเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ SHUTDOWN เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ. เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบซเบกเบปเบ”เบญเบฒเบเบธเปƒเบ™ Redis เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเป€เบงเบฅเบฒเบเบฑเบ‡เบชเบทเบšเบ•เปเปˆเป„เบซเบผเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ–เบทเบเบ›เบดเบ”, เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ”เบต. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบดเบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบเบฒเบ™เบ›เบดเบ”เบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™. เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปเบ™เบงโ€‹เปƒเบ”โ€‹เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เป„เบŸโ€‹เบŸเป‰เบฒโ€‹เบซเบกเบปเบ”โ€‹? เบ–เป‰เบฒ Redis เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบ”เป‰เบงเบ fsync synchronizing เปƒเบ™เปเบœเปˆเบ™เบ—เบธเบเป†เบงเบดเบ™เบฒเบ—เบต, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบ restart เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปƒเบ™เบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต, เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฅเบฑเบญเบเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบดเบ”เป€เบ›เบตเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบ„เบงเบ™เบˆเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰ fsync=always เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป„เบฅเบเบฐเบเบฒเบง. เบ™เบตเป‰เบˆเบฐเบ‚เป‰เบฒเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เบฅเบปเบ‡เป€เบ–เบดเบ‡เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš CP เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบกเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบฐเปเบˆเบเบเบฐเบˆเบฒเบเบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบž.

เปเบ•เปˆเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปเบกเปˆเบ™เบ”เบตเบเปˆเบงเบฒเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡ algorithm เปเบกเปˆเบ™เบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเป€เบกเบทเปˆเบญ instance เบ–เบทเบ restart เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบกเบตเบชเปˆเบงเบ™เบฎเปˆเบงเบกเปƒเบ™ lock เปƒเบ”เป†เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.

เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง, เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฑเบ‡เบ„เบปเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบเบตเบ™ TTL เบชเบนเบ‡เบชเบธเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰. เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบงเบฑเบ™เบซเบกเบปเบ”เบญเบฒเบเบธเปเบฅเบฐเบเบฒเบ™เบ›เปˆเบญเบเบฅเบฐเบซเบฑเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบง.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบŠเบฑเบเบŠเป‰เบฒ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบฅเบธเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบ„เบปเบ‡เบ—เบปเบ™เปƒเบ™เป„เบฅเบเบฐเบเบฒเบงเปƒเบ”เป†เปƒเบ™ Redis. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ›เบฑเบšเป„เบซเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบเปเบฅเบฐเบ™เบตเบชเปˆเบงเบ™เปƒเบซเบเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบง, เบฅเบฐเบšเบปเบšเบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบ—เบปเปˆเบงเป‚เบฅเบเบชเปเบฒเบฅเบฑเบš TTL (เปเบฅเบฐเบšเปเปˆเบกเบตเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เปƒเบ”เป†เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเบฐเบเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰).

เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡ algorithm: เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡

เบ–เป‰เบฒเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบฅเบฑเบญเบเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เบฅเบฑเบญเบ. เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ–เป‰เบฒเบฅเบนเบเบ„เป‰เบฒเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‰เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เบซเบกเบปเบ”เบญเบฒเบเบธเบ‚เบญเบ‡เบฅเบฑเบญเบเปเบกเปˆเบ™เบ•เปเปˆเบฒเบซเบผเบฒเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบชเบฐเบ„เบดเบš Lua เป„เบ›เบซเบฒเบ—เบธเบเป†เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‚เบฐเบซเบเบฒเบ TTL เบ‚เบญเบ‡เบเบฐเปเบˆเบ–เป‰เบฒเบเบฐเปเบˆเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบ„เปˆเบฒเบชเบธเปˆเบกเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป€เบกเบทเปˆเบญ. lock เป„เบ”เป‰เบกเบฒ.

เบฅเบนเบเบ„เป‰เบฒเบ„เบงเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบฅเบฑเบญเบเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบกเบฒเปƒเบซเบกเปˆเบ–เป‰เบฒเบกเบฑเบ™เป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบฅเบฑเบญเบเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบžเบฒเบเปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เปƒเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™, เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเปเบฒเบ™เบงเบ™เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบŠเป‰เปเบฒเบเบฑเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰ locks เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบˆเปเบฒเบเบฑเบ”, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบˆเบฐเบ–เบทเบเบฅเบฐเป€เบกเบตเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com