我有以下要求:
- 序列对于主机是唯一的(不需要共享增量)
- 序列必须是单调递增的
- 序列必须在进程之间保持持久性
- 在多个进程同时处理序列的情况下,递增序列必须是原子的
- 大多数情况下,文件将被更新,并在更新后读取新值。但是,也应该可以在不更新的情况下读取当前值
我可以破解perl代码,大致可以做到这一点,但我想要一个更优雅的解决方案。
将序列号存储在文件中,并使用flock
确保只有一个进程可以访问它:
sub set { # seed the sequence number file
my ($file, $number) = @_;
open my $fh, '>', $file;
print $fh $number;
} # implicit close
sub get {
my $file = shift;
my $incr = @_ ? shift : 1; # get($f) is like get($f,1)
open my $lock, '>>', "$file.lock";
flock $lock, 2;
open my $fh, '<', $file;
my $seq = <$fh>;
close $fh;
set($file, $seq+$incr) if $incr; # update sequence number
close $lock;
return $seq;
}
您可以将其称为get($file,0)
来检索序列号,而无需更改它。
系统时间提供了一个单调递增的序列,它处理(2):
perl -MTime::HiRes=time -lwe "print time"
直到有人重置时钟。。。
持久性(3)和增量的原子性(4)似乎需要一个锁定数据库。伯克利DB浮现在脑海中。但你可能正在寻找更简单的东西,除非你已经在使用它了。读取而不更新(5)不会有问题。单调递增序列(2)也不是。
我不知道你说的"主机唯一"one_answers"共享增量"是什么意思(1)。如果来自不同主机的序列元素具有相同的值是可以的,那么您可以将这种方法乘以所有服务器。否则,您只能有一个序列,其他序列必须可以通过网络访问。