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

Che*_*eng 7 php multithreading race-condition redis

我计划使用 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
Run Code Online (Sandbox Code Playgroud)

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

但是,对于 PHP Web 应用程序呢?

Ita*_*ber 9

假设您要生成顺序 ID,您可以使用 Redis 和INCR命令而不必担心竞争条件。由于Redis(大部分)是单线程的,您可以放心,每个请求都会从中获得自己的唯一ID。

此外,您不需要检查 id 键的存在/初始化它,因为 Redis 会为您做这件事(即,如果您 INCR 一个不存在的键,它将首先创建并自动设置为 0)。