【问题标题】:How to store sorted set of objects in redis?如何在redis中存储排序的对象集?
【发布时间】:2015-02-21 06:39:40
【问题描述】:

我想知道如何在 Redis 中存储对象列表。那就是我有这样的钥匙。

users:pro
{ 
name: "Bruce", age: "20", score: 100,
name: "Ed", age: "22", score: 80
}

我希望将哈希列表存储为特定键的值。我想使用score 字段作为排序集中的分数字段。我怎么能做到这一点?

我见过为一个键写一个单独的散列,但是如果我想要多个散列并且其中一个散列字段必须充当排序集的分数字段怎么办?

【问题讨论】:

  • 存储就行了……redis不关心类型是什么。
  • @Jasen 怎么存储呢?命令HSET only 只能存储一个hash,现在如何在同一个key中存储多个hash?
  • 也许你可以将整个列表存储在一个哈希下...... redis 不做多个索引。
  • @Jasen 你能回答这个问题吗?我无法理解,因为我是Redis的新手

标签: redis hash sortedset


【解决方案1】:

使用单个键来存储所有哈希将需要一些序列化,因为 Redis 不支持嵌套数据结构。结果如下:

key: users:pro
         |
         +-----> field       value
                 name:Bruce  "age: 20, score: 100"
                 name:Ed     "age: 22, score: 80"

> HMSET users:pro name:Bruce "age: 20, score: 100" name:Ed "age:22, score:80"

相应的排序集是:

key: users:pro.by_scores
         |
         +---> scores:    80           100
         +---> values: "name:Ed"   "name:Bruce"

> ZADD users:pro.by_scores 80 "name:Ed" 100 "name:Bruce"

注意 1:这种方法要求每个用户使用唯一的 ID,目前使用的 name 属性可能会出现问题。

注意 2:为避免序列化(和反序列化),您可以考虑为每个用户使用专用密钥。这意味着:

key: users:pro:Bruce
         |
         +-----> field       value
                 age         20
                 score       100

key: users:pro:Ed
         |
         +-----> field       value
                 age         22
                 score       80

> HMSET users:pro:Bruce age 20 score 100
> HMSET users:pro:Ed age 22 score 80

key: users:pro.by_scores
         |
         +---> scores:      80                100
         +---> values: "users:pro:Ed"   "users:pro:Bruce"

> ZADD users:pro.by_scores 80 "users:pro:Ed" 100 "users:pro:Bruce"

【讨论】:

  • 所以我必须使用users:pro:101 而不是users:pro:Ed,其中101 是唯一ID。
  • 是的 - 绝对是一种更好、更安全的方法。我还建议在哈希本身中包含 id 作为单独的字段(即HSET users:pro:101 id 101) - 尽管有“非规范化”,这使得处理数据变得更加容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多