如何使用Redis存储投票数据

时间:2014-05-10 15:05:08

标签: redis

我有一些关于我想要创建一些报告的问题的投票数据。

我想按照条件

显示每个问题的投票结果

年龄 性别 收入 教育 种族

不同的问题可能是堕胎,枪支控制等。

我如何使用Redis存储此投票数据,然后在其上显示报告?这是我试图创建的一份报告。

以下是我想按年龄查看投票数据时的报告内容

https://docs.google.com/spreadsheets/d/1N-C4pNN_fwb1kNGQck44TIrIAEn-jPZEpEsW6qQ8lh8/edit?usp=sharing

我想创建类似的报告,但也可以按年龄和性别或年龄和收入或收入和教育等进行。

希望你能理解我想要创造的东西。我想让最终用户在网站上选择不同的标准,并尽可能快地创建这个动态报告,这就是为什么我没有'想要使用MySQL。我知道Redis可以用来解决这个问题,但我还不确定如何开始。

提前感谢您为我提供的任何指示。

1 个答案:

答案 0 :(得分:1)

真的,这是一个传统的RDBMS最容易解决的问题,比如PostgreSQL / MySQL。

但是,有几种方法可以在Redis中执行此操作。

一种方法是简单地在散列中存储每个投票的属性。

redis.hmset "vote:123", "age", 26, "abortion", "yes", "gun_control", "undecided" #, ...

您还需要一个包含所有投票ID的redis SET(即:" all_votes"),因此您不必使用redis.keys来搜索投票。

下一步是制作其他套装。如果您希望能够快速查找年龄范围,您可能需要为每个年龄范围构建一个SET(即:" vote_indexes:年龄:18-22"),并使用ID填充它在该年龄范围内的任何投票。每次添加投票或删除投票时,您都需要在all_votes SET中添加或删除它们以及相应的年龄范围SET以及您构建的任何其他索引SET。如果这听起来很像数据库索引,那就完全一样了。除非你必须自己维护它们,所以这是一个额外的代码,你不必用RDBMS编写。

现在您已拥有索引集,您可以执行这些集的交集以进行一些查询。

redis.sinter("indexes:age:18-22", "indexes:abortion:yes").count
# => 20

不是手动维护自己的手工构建的索引,而是可以通过简单地遍历每个投票并随时构建报告,希望一次通过。在您的应用程序中实现这将非常缓慢。性能最佳的选项可能是使用在redis中运行的Lua脚本。基本上你的Lua脚本将通过过滤器参数传递给redis,它将遍历所有投票并进行过滤,返回匹配结果甚至是最终报告。

那当然意味着你必须学习Lua。它是一个很好的小语言,不难发现,但它比你可能已经知道的语言更难:SQL。

我爱Redis,但不确定你是否需要它。一个特殊的报告系统是SQL的字面意思。在拥有它们之前,不要担心性能问题。你会惊讶地发现SQL能带给你什么程度。如果你确实遇到了一些性能问题,Redis是一种缓存SQL结果并让你的RDBMS休息的好方法。