我已经学习了如何使用本教程http://www.kdelemme.com/2014/08/16/token-based-authentication-with-nodejs-redis/
中的节点创建基于令牌的身份验证的教程我把它全部解决了,但我遇到了一个问题。
我存储令牌的方式是:
KEY = TOKEN
VALUE = UserData(用户名,电子邮件等)
为了保护多个设备登录,我想使现有令牌无效,并生成新的令牌。在登录期间,我想检查用户的令牌是否已经存在。但是,我需要找到Key by Value。 (我需要通过电子邮件找到TOKEN)。但是当我查看Redis文档时,我找不到任何关于按值查找Key的行。
非常感谢:)
答案 0 :(得分:2)
您基本上必须选择以下两种方法之一:完整扫描数据库或索引。完全扫描,如在这个问题的另一个答案中所提出的,将是非常低效的 - 您将遍历整个密钥空间(或至少所有令牌)并且需要获取每个密钥空间,直到找到与电子邮件的匹配。
索引将允许您以更快的速度获得查询答案,但代价是RAM和管理开销。虽然Redis不提供开箱即用的索引功能,但您可以使用常规Redis数据结构和操作轻松设计它们。例如,完成所需内容的直接方法是为每个令牌存储另一个键,其名称是电子邮件,其值是令牌。这将允许您通过单个GET操作发送令牌,但电子邮件。
请注意,此索引方法将有效地使与令牌相关的键的数量加倍,因此为了优化您的RAM消耗,您可能需要考虑其他类型的索引结构(例如,使用Hash对电子邮件令牌对进行分组,其中用作桶。)
答案 1 :(得分:1)
您必须执行某种SCAN并遍历键,搜索每个值。 redis
模块支持这些命令,但如果您需要/想要SCAN的流接口,至少有几个模块可以做到这一点:redis-scanstreams
和redisscan
(技术上使用)回调方法,所以不是真正的流实现。)