gpt4 book ai didi

database - 从同时包含数字列表的文件中获取唯一数字

转载 作者:搜寻专家 更新时间:2023-10-30 22:18:23 25 4
gpt4 key购买 nike

我在文件中有一个唯一编号列表。每当我网站的用户发出请求时,我需要从该列表中获取一个值,这样其他用户就不会获得相同的值。可能有很多并发请求,因此主要问题是保证没有两个用户获得相同的值。我并不关心性能,因为用户在发出请求后不希望得到任何回复,因此一切都可能在后台发生。据我所知,这可以使用文件锁来实现,或者我可以将数据存储在数据库中并使用数据库锁。我只是想知道做这件事的最好方法是什么。我正在使用 postresql 作为我的数据库,并且想知道这是否可以使用我在序列中存储当前行号的序列来完成,以便我的程序知道从数据库中读取哪一行。但是我再次不确定如何防止多个进程在其中任何一个有机会更新它之前读取同一行。

最佳答案

数据库实际上并没有做很多事情,但是它们所做的事情却做得很好。特别是,它们处理对数据的并发访问。您可以利用这一优势:

  • 创建表:create table special_number (id serial, num varchar(100) not null);
  • 确保唯一性:在 special_number(num) 上创建唯一索引 special_number_num;
  • 使用COPY 将您的数字加载到表中,让 id 自动从 1 开始计数
  • 创建一个序列:create sequence num_seq;
  • 利用 postgres 的 nextval 函数保证并发安全的事实来安全地从列表中选择一个数字: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 上测试并按预期工作。

关于database - 从同时包含数字列表的文件中获取唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7791321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com