【问题标题】:Efficient way to store all users into Redis instead of marshalling an array将所有用户存储到 Redis 中而不是编组数组的有效方法
【发布时间】:2016-11-05 21:17:49
【问题描述】:

我目前使用 Rails.cache.fetch,cache_store 使用 redis-store gem(修改为使用 YAML 而不是正常编组)。现在,我有以下代码:

    Rails.cache.fetch("foobar", expires_in: 1.week) do
      User.all.to_a.each do |user|
       user.email = "foobar"
      end
    end

这会将用户的 ruby​​ 数组的 YAML 版本存储到单个键值中。我想有效地将​​这个列表分解为多个键,以便以后能够检索所有值而不是访问数据库。

我应该怎么做?我在考虑一个哈希列表,但它似乎效率不高,因为我仍然需要在列表中查找特定的哈希来更新一个用户。

【问题讨论】:

  • 您能否详细说明为什么您认为不希望以给定方式保存所有用户?您改变方法的目标(指标)是什么?你需要什么来分解列表?您的问题没有说明限制和措施。
  • @PavelBulanov 基本上,从我在 Redis 上收集到的信息来看,这并不意味着将大量数据存储到一个字符串中。相反,它应该使用列表。 Redis-store 仅支持将所有内容编组为字符串,而不支持列表和哈希。我想使用 Redis 客户端手动缓存它,但不确定组织可能有数千个用户的数组的有效方法是什么。我需要能够通过属性查找任何用户,并通过 Redis 获取其余数据。
  • 要深入回答,请提供有关您为什么要使用缓存的解释。你的读取查询是什么,为什么是 Redis 而不是常规数据库,你为什么要使用缓存(你的请求慢吗?哪一个?)。
  • 通常情况下,如果您只需要单个用户(即每个对象读取和写入),为什么不使用常规数据库?你可以使用 redis 来缓存一些广泛使用的查询结果,例如前 10 名用户(不是每次都查询 DB)等

标签: ruby-on-rails ruby performance redis marshalling


【解决方案1】:

我从您的评论中了解到:

我需要能够通过属性查找任何用户,并通过 Redis 获取他们的其余数据。

您想通过某个属性在商店中查找用户,假设它将是电子邮件。 所以你可以使用redis hash data 结构来完成你的任务。

有两个简单的命令可以处理结构:

  1. HGETO(1) 中工作
  2. HSET 适用于 O(1)

所以你可以看到性能很好。

redis-cli 示例:

hmset user:1000 username antirez birthyear 1977 verified 1 => OK
hget user:1000 username => antirez

Redis gem(我检查过 3.2.1 版本)具有使用此结构的接口。

具有几个字段(其中很少意味着最多一百个左右)的哈希是 以占用很少空间的方式存储,因此您可以存储 一个小型 Redis 实例中的数百万个对象。

使用哈希时 主要用于表示对象,它们能够存储许多 元素,因此您也可以将哈希用于许多其他任务。每一个 hash 最多可以存储 232 - 1 个字段值对(超过 40 亿个)。

【讨论】:

  • 好的,在我最近的尝试中,这正是我所做的。现在我的问题是:为每个用户拥有一个密钥是否一定“不好”?我应该做一些复杂的哈希散列,还是让一个键作为每个用户数据的映射足够好?以下是数据的样子:imgur.com/wVMUcXn 每个内部都是我需要的数据映射,例如胜负。
  • 在 Redis 中存储许多条目是可以的,查看here 以获得极端示例。同时,再一次,重新考虑一下为什么要迁移到缓存而不是常规数据库。
  • @njny 为每个用户存储一个哈希值。
  • @PavelBulanov 我将其存储在缓存中,因为这些是每周的统计数据,并且每周都会完全刷新以再次开始跟踪。如果缓存发生某些事情并且它会丢失,这也并不重要。它需要快速,因为网站会一次访问所有内容。
  • @farhatmihalko 所以在我链接的图片中,这是每个用户一个哈希值,对吗?还是我做了不同的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多