我有一个私有实例用户模型方法,如下所示: -
def generate_authentication_token
loop do
token = Devise.friendly_token
break token unless self.class.unscoped.where(authentication_token: token).first
end
end
让我们假设,不。用户记录是100万亿。如果我发出上述脚本并且每次迭代生成的令牌与记录匹配,则循环将迭代100万亿次,DBMS也会发生同样的搜索记录。有没有任何解决方案可以通过减少迭代和减少db-hits来快速解决这个问题(假设每次迭代都会给出匹配记录)。说真的,对不起!如果问题没有意义并让我知道,我会尽快删除。谢谢。快乐的编码。
答案 0 :(得分:1)
代码看起来很好。通常首选find_by(authentication_token: token)
来检索单个记录。
确保为authentication_token
列添加索引。如果你有很多记录,这将大大加快查询速度。如果您不了解数据库索引,请参阅this answer。
我不担心优化迭代次数或数据库命中率,因为即使在第一次尝试时你也会找到匹配令牌的机会很小。
答案 1 :(得分:1)
为什么你要使用这样的东西?
token = Digest::MD5.hexdigest (rand.to_s << Time.now.to_i.to_s)
这里我创建一个随机数,并附加当前时间戳,并为该字符串值获取MD5哈希值。这将是非常好的秘密令牌,它将是独一无二的。
如果您仍然对唯一性标准不满意,那么只需在开始时附加用户的ID
即可。
没有涉及查询
答案 2 :(得分:1)
您正在寻找创建随机但唯一的令牌。对我来说听起来像UUID。您可以尝试https://github.com/assaf/uuid
您的方法可行,但对于您所针对的100万亿用户来说效率低下: - )