我使用线性同余生成器 ( http://en.wikipedia.org/wiki/Linear_congruential_generator ) 来生成暴露给用户的 ID。
nextID = (a * LastID + c) % m
现在我想在 Redis 中实现 LCG。这就是问题所在:获取当前 ID 并在 Redis 外部生成下一个 ID 不是多用户安全的。Redis 有 2 个可用于简单计数器的命令:INCRBY 和 INCRBYFLOAT,但不幸的是,Redis 本身不支持模运算。目前我看到的唯一方法是使用 EVAL 命令并编写一些 lua 脚本。
更新1:
一些lua类似物
INCRBY LCG_Value ((LCG_Value*a+c)%m)-LCG_Value
似乎是实现这一目标的一种巧妙方法。