Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api OAuth2.0在postgres中的授权性能_Api_Security_Postgresql_Rest_Oauth - Fatal编程技术网

Api OAuth2.0在postgres中的授权性能

Api OAuth2.0在postgres中的授权性能,api,security,postgresql,rest,oauth,Api,Security,Postgresql,Rest,Oauth,我正在开发一个RESTful API,并实现了OAuth2.0授权 我的所有客户端通过SSL通过授权标头中的承载令牌发出请求: Authorization: Bearer sdflksd3r4823vgbyerge 目前,我正在Postgres中保存访问令牌和刷新令牌,因此在每个请求中,服务器都必须连接到db并执行SELECT查询。“tokens”表包含大约一百万行,因此性能不是很好,即使该表已被索引。。。我还认为检查每个请求的令牌有效性是相当浪费时间的 我们的令牌现在只是随机的数据字节。我们

我正在开发一个RESTful API,并实现了OAuth2.0授权

我的所有客户端通过SSL通过授权标头中的承载令牌发出请求:

Authorization: Bearer sdflksd3r4823vgbyerge
目前,我正在Postgres中保存访问令牌和刷新令牌,因此在每个请求中,服务器都必须连接到db并执行SELECT查询。“tokens”表包含大约一百万行,因此性能不是很好,即使该表已被索引。。。我还认为检查每个请求的令牌有效性是相当浪费时间的

我们的令牌现在只是随机的数据字节。我们考虑使用自编码令牌,这样令牌就可以在不进行数据库查找的情况下进行解码和验证,但问题是令牌必须是用户可以撤销的,因此这不是一个解决方案

我有什么选择

我在考虑使用Redis而不是Postgres:阅读速度应该快得多。 另一个选项是检查令牌有效性,将响应缓存在Memcached中15分钟,这样后续请求就不需要数据库查找


有什么想法吗?

我试着轻轻地戳戳一些真实的数字。由于您不准备说明您的“ec2微实例”在可用GHz/RAM/磁盘I/O方面的实际情况,因此我们必须尝试另一种方法

CREATE TABLE tokens(tok text, username text);
INSERT INTO tokens SELECT md5(i::text), 'User number ' || i FROM generate_series(1,1000000) i;
SELECT * FROM tokens WHERE username LIKE '%01' LIMIT 19;
-- Now check the timings on some of returned tokens
EXPLAIN ANALYSE SELECT username FROM tokens WHERE tok = '38b3eff8baf56627478ec76a704e9b52';
                                                 QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Index Scan using tokens_pkey on tokens  (cost=0.42..8.44 rows=1 width=18) (actual time=0.099..0.101 rows=1 loops=1)
   Index Cond: (tok = '38b3eff8baf56627478ec76a704e9b52'::text)
 Total runtime: 0.133 ms
(3 rows)
正如你所看到的,我的车跑得太快了,时间可能毫无意义。如果我在意的话,我会从10个并行进程中运行10000个进程,其间会有随机等待。我不知道-它不到1ms,甚至在我期望的最慢的虚拟机上也不到5ms

那么,你的申请有什么问题吗?不知道-你没有提供细节

这是你的框架吗?不知道-你不会说的

现在是转接时间吗?不知道

是查询本身吗?不知道

然而,PostgreSQL使用索引从一个100万行的小表中读取一行并没有任何问题


祝你好运

我试着轻轻地戳一些真实的数字。由于您不准备说明您的“ec2微实例”在可用GHz/RAM/磁盘I/O方面的实际情况,因此我们必须尝试另一种方法

CREATE TABLE tokens(tok text, username text);
INSERT INTO tokens SELECT md5(i::text), 'User number ' || i FROM generate_series(1,1000000) i;
SELECT * FROM tokens WHERE username LIKE '%01' LIMIT 19;
-- Now check the timings on some of returned tokens
EXPLAIN ANALYSE SELECT username FROM tokens WHERE tok = '38b3eff8baf56627478ec76a704e9b52';
                                                 QUERY PLAN                                                      
---------------------------------------------------------------------------------------------------------------------
 Index Scan using tokens_pkey on tokens  (cost=0.42..8.44 rows=1 width=18) (actual time=0.099..0.101 rows=1 loops=1)
   Index Cond: (tok = '38b3eff8baf56627478ec76a704e9b52'::text)
 Total runtime: 0.133 ms
(3 rows)
正如你所看到的,我的车跑得太快了,时间可能毫无意义。如果我在意的话,我会从10个并行进程中运行10000个进程,其间会有随机等待。我不知道-它不到1ms,甚至在我期望的最慢的虚拟机上也不到5ms

那么,你的申请有什么问题吗?不知道-你没有提供细节

这是你的框架吗?不知道-你不会说的

现在是转接时间吗?不知道

是查询本身吗?不知道

然而,PostgreSQL使用索引从一个100万行的小表中读取一行并没有任何问题


祝你好运

请注意,令牌上应该有一个索引,Richard的响应省略了该索引。在创建索引之前,我的查询运行时间约为200毫秒。创建索引之后,它下降到0.1毫秒。(对不起,我会直接评论他的帖子,但我没有足够高的分数)。

请注意,令牌上应该有一个索引,Richard的回答忽略了这一点。在创建索引之前,我的查询运行时间约为200毫秒。创建索引之后,它下降到0.1毫秒。(对不起,我会直接评论他的帖子,但我的分数不够高)。

短语“性能不是很好”实际上并没有告诉我们多少。你看什么时候能查到代币?为什么服务器只是为了这一个查询而连接到数据库?memcache之类的东西非常适合检查身份验证令牌。Hi@RichardHuxton在实现oauth之前,对我的api的“典型请求”的响应时间为0.200秒……现在,相同的请求大约需要0.800秒。显然,这些响应时间并不糟糕,它们还可以……但我想至少尝试减少它们,所以我想,也许postgres不是存储令牌的最佳解决方案……对于一个简单的查询来说,600ms听起来并不合适。由于您尚未提供任何硬数据或设置的详细信息,因此无法确定。如果你有一个5美元/年的盒子运行在与你的应用程序不同的大陆上,那么它的速度相当快。@RichardHuxton我使用的是一个ec2微实例,db与应用程序服务器在同一台机器上。“性能不是很好”这句话实际上并没有告诉我们多少。你看什么时候能查到代币?为什么服务器只是为了这一个查询而连接到数据库?memcache之类的东西非常适合检查身份验证令牌。Hi@RichardHuxton在实现oauth之前,对我的api的“典型请求”的响应时间为0.200秒……现在,相同的请求大约需要0.800秒。显然,这些响应时间并不糟糕,它们还可以……但我想至少尝试减少它们,所以我想,也许postgres不是存储令牌的最佳解决方案……对于一个简单的查询来说,600ms听起来并不合适。由于您尚未提供任何硬数据或设置的详细信息,因此无法确定。如果您的应用程序中有一个5美元/年的盒子在不同的大陆上运行,那么它的速度相当快。@RichardHuxton我使用的是ec2微实例,db与应用程序服务器在同一台机器上。谢谢您的帮助,我将再次检查我的代码并发布任何更新!嗨@richardhuxton我终于解决了这个问题:这个bug出现在应用服务器上,而不是Postgres查询中!我现在可以在不到3毫秒的时间内从200万个表中提取一行。因此,博士后的表现不再是一个问题。现在…回到原来的问题!这样做对吗?每次客户端发出请求时都在数据库上执行查询对吗?将查询结果缓存在memcache中有意义吗?或者根本不使用db,而是使用nosql?谢谢你的帮助:)做最简单有效的事情。查询数据库直到