Redis作为唯一的原子id生成器-线程安全的方式,为web应用程序避免竞争条件


Redis as unique atomic id generator - Thread safe way for web app to avoid race condition

我计划使用redis作为唯一的原子id生成器。然而,我担心可能会有来自多个浏览器的同步web请求。我想知道,使以下操作原子化的常见做法是什么?

get id from redis
if id is not found
    insert id as 0 into redis
else
    store the id in a variable
    increase id by one
    store the new id back to redis

如果我在桌面应用或移动应用,我会使用Java中的synchronized关键字来避免竞争条件。

然而,对于PHP web应用程序呢?

假设您希望生成顺序id,您可以使用Redis和INCR命令,而不必担心竞争条件。因为Redis(大部分)是单线程的,你可以保证每个请求都会得到它自己唯一的id。

此外,你不需要检查id键是否存在/初始化它,因为Redis会为你做这些(例如,如果你INCR一个不存在的键,它会首先被创建并自动设置为0)。