Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
Node.js Redis:通过电子邮件删除用户令牌(按值查找密钥)_Node.js_Express_Redis - Fatal编程技术网

Node.js Redis:通过电子邮件删除用户令牌(按值查找密钥)

Node.js Redis:通过电子邮件删除用户令牌(按值查找密钥),node.js,express,redis,Node.js,Express,Redis,我在本教程中学习了如何使用节点创建基于令牌的身份验证 我把一切都解决了,但我有一个问题 我存储令牌的方式是: 密钥=令牌 值=用户数据(用户名、电子邮件等) 为了保护多个设备登录,我想使现有令牌无效,并生成一个新的令牌。在登录期间,我想检查用户的令牌是否已经存在。但是,我需要按值查找键。(我需要通过电子邮件找到令牌)。但当我浏览Redis文档时,我找不到任何一行关于按值查找键的内容 非常感谢:)您必须进行某种类型的搜索,并遍历键,搜索每个值。redis的模块支持这些命令,但如果您需要/想要一个用

我在本教程中学习了如何使用节点创建基于令牌的身份验证

我把一切都解决了,但我有一个问题

我存储令牌的方式是:

密钥=令牌

值=用户数据(用户名、电子邮件等)

为了保护多个设备登录,我想使现有令牌无效,并生成一个新的令牌。在登录期间,我想检查用户的令牌是否已经存在。但是,我需要按值查找键。(我需要通过电子邮件找到令牌)。但当我浏览Redis文档时,我找不到任何一行关于按值查找键的内容


非常感谢:)

您必须进行某种类型的搜索,并遍历键,搜索每个值。redis的
模块支持这些命令,但如果您需要/想要一个用于扫描的流接口,至少有几个模块可以做到这一点:而且(技术上使用回调方法,因此不是真正的流实现)。

您基本上必须选择两种方法之一:完全扫描数据库或索引。正如在这个问题的另一个答案中所建议的那样,完全扫描将是非常低效的-您将检查整个密钥空间(或至少所有令牌),并且需要获取每个密钥,直到找到与电子邮件匹配的密钥

索引将使您能够更快地获得查询的答案,而代价是一些RAM和管理开销。虽然Redis不提供现成的索引功能,但您可以使用常规的Redis数据结构和操作轻松设计它们。例如,实现您想要的功能的简单方法是为每个令牌存储另一个密钥,该密钥的名称是电子邮件,其值是令牌。这将允许您通过一个GET操作让令牌发送电子邮件


注意,这种索引方法将有效地使令牌相关密钥的数量增加一倍,因此,为了优化RAM消耗,您可能需要考虑其他类型的索引结构(例如,使用散列来分组电子邮件令牌对,其中使用的是桶)。这种方法的性能不会太好,因为它需要一个完整的数据库扫描和获取。为数据编制索引似乎是解决此问题的更好方法。当然,如果您想保持这一点,那么我将为每个人提供2个键值对,对吗?例如,123456=>abc@abc.com及abc@abc.com => 123456. 我将对此进行优化研究(在您提到索引之后,我发现了关于索引Redis的很棒的教程,这对其他人应该也有帮助。这是它的链接)谢谢!)感谢您的友好反馈,如有任何问题,请随时联系:)