我有一个文件中唯一编号的列表。每当我网站的用户发出请求时,我都需要从该列表中获取一个值,这样其他用户就不会获得相同的值。可能有许多并发请求,因此主要问题是保证没有两个用户获得相同的值。我并不关心性能,因为用户在发出请求后不会期望任何回复,因此一切都可能在后台发生。根据我的阅读,这可以使用文件锁来实现,或者我可以将数据存储在数据库中并使用数据库锁。我只是想知道做这件事的最佳方法是什么。我正在使用 postresql 作为我的数据库,并且想知道这是否可以使用我在序列中存储当前行号的序列来完成,以便我的程序知道从数据库中读取哪一行。
1 回答
3
数据库实际上并没有做很多事情,但是他们所做的事情,他们做得很好。特别是,它们处理对数据的并发访问。你可以利用它来发挥你的优势:
- 创建表:
create table special_number (id serial, num varchar(100) not null);
- 确保唯一性:
create unique index special_number_num on special_number(num);
- 使用 将您的数字加载到表中
COPY
,让 id 自动从 1 开始计数 - 创建一个序列:
create sequence num_seq;
nextval
使用 postgres 的函数保证并发安全的事实来安全地从列表中选择一个数字:select num from special_number where id = (select nextval('num_seq'));
.null
如果您的数字用完,这将返回。
这种方法是 100% 安全和简单的 - postgres 作为数据库的内部优势可以完成所有繁重的工作。
这是从上面提取的 SQL:
create table special_number (id serial, num varchar(100) not null);
create unique index special_number_num on special_number(num);
copy special_number(num) from '/tmp/data.txt'; -- 1 special number per file line
create sequence num_seq;
select num from special_number where id = (select nextval('num_seq'));
此 SQL 已在 postgres 上进行了测试,并且可以按预期工作。
于 2011-10-17T09:41:40.177 回答