ruby-on-rails - 如何获取 Redis 中的所有设置键按其 SCARD 排序?

标签 ruby-on-rails redis

我正在使用 redis 来存储收件箱之类的东西。每个键都有特定组的消息。

在 Rails 中,我需要获取它并将按消息计数排序的组带入。

user:1:inbox:group:1: a, b, c
user:1:inbox:group:2: a, b
user:1:inbox:group:3: a

SCARD user:1:inbox:group:1 = 3
SCARD user:1:inbox:group:2 = 2
SCARD user:1:inbox:group:3 = 1

同样,我想获取所有组 ID,在本例中为:1、2、3,但它们必须按照元素的集合数量按 DESC 顺序排列。换句话说,消息较多的群组将排在列表的第一位。

我知道我能做到:

REDIS.keys("user:1:inbox:group:*")

它返回这些键的数组。但无法确定实现该目标是否可能或正确的方法...

欢迎任何帮助和想法。 谢谢!

最佳答案

重要提示:请勿使用 KEYS 命令 - 它仅用于非生产目的。参见 the doc page ,具体来说:

Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code.

此外,KEYS 不保证结果的顺序 - 正如您自己发现的那样:)

我可以建议三种可能的方法来应对挑战:

  1. 排序集:您可以使用排序集来存储每个用户的收件箱组,并将每个组的分数设置为基数/计数(天真地,ZADD user:1:收件箱:组 3“1”2“2”1“3”)。然后您可以使用 ZRANGE/ZREVRANGE等得到排序的结果。

  2. SORT Command :Redis的SORT相当强大。例如,您可以为每个用户的组使用一个列表/集合,并将权重(基数)保存在单独的键中。完成后,您可以使用以下内容检索列表:

    SORT user:1:inbox:groups DESC BY user:1:inbox:group_card_*

  3. 自己动手:有时在数据库外部执行排序更简单/更有效。当然,这取决于您的数据模型和要求,但请注意,之前的两个建议都需要 Redis 空间和计算能力,而 DIY 方法可以将部分成本委托(delegate)给应用程序/客户端。

关于ruby-on-rails - 如何获取 Redis 中的所有设置键按其 SCARD 排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23528094/

相关文章:

django - 如果内容在缓存 TTL 到期之前发生更改,则更新缓存

python - Django redis 缓存重建

javascript - Rails - jQuery 地理编码和地点自动完成插件不工作

node.js - redis session 在服务器上不工作

ruby-on-rails - 使用 Devise after_sign_in_path_for 重定向循环

sql - 如何按多个行值分组?

java.lang.NoSuchMethodError : in redisson and netty integration 错误

php - 使用 Predis 使用 Laravel-5.4.32 配置 AWS ElasticCache redis Cluster-3.2.4

ruby-on-rails - 为什么这条评论会在 Ruby on Rails 上产生编译错误?

ruby-on-rails - 如何将多个对象传递到rails中的邮件/电子邮件内容中