使用 Redis 作为分布式锁用于简单的用例

我最近遇到了一个系统问题,我们编写的一些作为 Ruby​​ Rake 任务的批处理作业会出现重复调用,进而导致数据库中出现重复记录或在 Slack 中出现重复警报。这肯定是一个基础设施问题,但在从基础设施方面修复它之前,我需要从编码角度找到一种解决方法。尝试将所有内容重写为尽可能幂等的不太现实,增强应用程序级别验证或数据库唯一性约束也不是一个选择,因为并非所有作业都可以是幂等的,也并非所有作业都会写入数据库,此外问题是由竞争条件引起的,不是来自两个线程,而是来自两个进程。经过一些研究和实验,我决定使用“Redis”作为一个简单的分布式锁解决方案,它已经在我们的应用程序中可用,不需要任何额外的设置,而且它是一个单一实例,因此没有复制同步问题。“Redis”是单线程架构,因此无论有多少并发客户端尝试写入它,它都可以保证是顺序和原子的。我发现可以利用这种性质来解决面临的问题。

Redis 数据库迁移

用于快速迁移 redis 的命令列表。