我想为应用程序中发生的事件生成ID。
事件频率取决于用户负载,因此每秒可能发生数十万次。
我不能使用UUID.randomUUID(),因为它可能是在性能上的问题问题-看看这个。
我想到生成ID如下:
System.currentTimeMillis() + ";" + Long.toString(_random.nextLong())
Run Code Online (Sandbox Code Playgroud)
什么时候_random是静态java.util.Random课程?
我的问题是:
我将使用以下内容。
final AtomicLong counter = new AtomicLong(System.currentTimeMillis() * 1000);
Run Code Online (Sandbox Code Playgroud)
和
long l = counter.getAndIncrement(); // takes less than 10 nano-seconds most of the time.
Run Code Online (Sandbox Code Playgroud)
如果您平均每秒少于一百万,那么这在您的系统内和重启之间将是唯一的。
即使以这种速度,该号码也不会在一段时间内溢出。
class Main {
public static void main(String[] args) {
System.out.println(new java.util.Date(Long.MAX_VALUE/1000));
}
}
Run Code Online (Sandbox Code Playgroud)
版画
Sun Jan 10 04:00:54 GMT 294247
Run Code Online (Sandbox Code Playgroud)
为了防止可能的冲突,我建议您以某种方式将用户的唯一 ID 集成到生成的 ID 中。您可以将用户 ID 直接添加到生成的 ID 中
System.currentTimeMillis() + ";" + Long.toString(_random.nextLong()) + userId
Run Code Online (Sandbox Code Playgroud)
或者您可以_random对每个使用用户 id 作为其种子的用户使用单独的。