在Redis(Json或多数据结构)中存储和读取通知的最佳方法?

时间:2013-04-04 09:11:56

标签: database json database-design data-structures redis

我想在一个有序集或Redis列表中存储我的应用程序的通知(也是一个链接缩短器,也有通知)。我有不同类型的通知,所以我不能像普通字符串那样存储它们。例如,如果我想存储:

  • 通知文字
  • 通知类型

我有两种方法。一种是将Json序列化并像普通字符串一样存储,并在我想要使用它时反序列化。或者另一种方法是将密钥保存在列表中,然后再次将Redis命中到另一个数据结构,以通过列表中存储的密钥获取通知哈希值。

与通知系统一样,系统将一直读写

所以在几行反序列化和序列化VS分割数据和多个数据库命中?

我对这类决策没有太多经验,所以也许某人已经面对这个并且知道什么是效率和可扩展性方面的最佳方法,或者至少可以解释我如何做出决策,因为很多事情,我/我的应用程序的决定不是其他人/其他应用程序的决定。

谢谢:)

1 个答案:

答案 0 :(得分:4)

在做了一些测试之后,最好的分数会转到Json序列化数据案例。我想这也取决于序列化结构。在测试用例中,它只序列化了2个字段结构。

一些结果(以秒为单位的时间):

Users: 600
Notifications per user: 1200
--------------------
#### With Json in Set structure ####
Write time: 93.0
Read time: 6.65
dbsize (number of keys): 600
Memory: 150.60M
#### With set and hash data structures ####
Write time: 367.72
Read time: 40.2
dbsize (number of keys): 721200
Memory: 224.17M

我将解释一下测量的测试(我使用Python):

对于Json序列化案例,我使用了一个有序集(zset)(每个用户的通知zset),它的得分是unix时间戳(浮点数)。它序列化了一个2字段哈希(Python dict)并将字符串添加到有序集合中。

对于检索,我得到了所有zset字符串,然后逐个反序列化数据。

对于Hash方法,我使用了3种数据结构:

  • 最简单的一个是每个通知zset的计数器,用于创建 每个通知的唯一密钥(我也测试了uuids,结果或多或少相同,所以差别不大)
  • 另一个数据结构是zsets,与Json案例相同,但我们不存储Json数据,而是存储通知哈希键
  • 最后一个是包含所有数据字段的通知哈希

并检索数据。与json案例大致相同,我从每个zset获取所有键,然后逐个获得所有通知。

我知道这个案例不是我面临的情况,因为通常我不会检索所有通知,而且测试可能有错误或者有更好的方法来应对这种情况。

无论如何,这里有一些measurements and the test script