我正在开发RESTful API,并且我已经实施了OAuth 2.0授权。
我的所有客户端都通过SSL在Authorization标头中传递承载令牌:
Authorization: Bearer sdflksd3r4823vgbyerge
目前我在Postgres中保存访问令牌和刷新令牌,因此在每个请求中,服务器必须连接到db并执行SELECT查询。 “令牌”表包含大约一百万行,因此性能不是很好,即使表已被索引...我还认为在每个请求上检查令牌有效性都是浪费时间。
我们的令牌现在只是随机字节数据。我们考虑使用自编码令牌,因此可以在没有数据库查找的情况下解码和验证令牌,但问题是令牌必须可撤销来自用户,因此这不是解决方案。
我有什么选择?
我在考虑使用 Redis 而不是Postgres:读取速度要快得多。 另一种选择可能是检查令牌有效性,在Memcached中缓存响应 15分钟,因此后续请求不需要数据库查找。
有什么想法吗?
答案 0 :(得分:3)
我试过轻轻地刺激一些真实的数字。既然你不准备说出你的“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,其间有随机等待。我没有 - 它不到1毫秒,甚至在我期望的最慢的虚拟机上< 5毫秒。
那么 - 你的申请是个问题?不能说 - 你没有透露细节。
这是你的框架吗?不能说 - 你不会说。
是连接时间吗?不能说......
是查询本身吗?不能说......
尽管如此,PostgreSQL使用索引从 tiny 100万行表读取单行是否有任何问题。
祝你好运!答案 1 :(得分:0)
请注意,令牌上应该有一个索引,Richard的响应被省略了。在创建索引之前,我的查询运行时间约为200毫秒。创建索引后,它下降到0.1毫秒。 (对不起,我直接对他的帖子发表评论,但我得分不够高。)