我有一些关于某个问题的投票数据,我想创建一些报告。
我想按照标准显示每个问题的投票结果
年龄 性别 收入 教育 种族
不同的问题可能是堕胎、枪支管制等。
我将如何使用 Redis 存储这些投票数据,然后显示有关它们的报告?这是我正在尝试创建的一份报告。
当我想按年龄查看投票数据时,报告如下所示
https://docs.google.com/spreadsheets/d/1N-C4pNN_fwb1kNGQck44TIrIAEn-jPZEpEsW6qQ8lh8/edit?usp=sharing
我想创建类似的报告,但它们也可以按年龄和性别或年龄和收入或收入和教育程度等。
希望你能理解我想要创造的东西。我想让最终用户在网站上选择不同的标准,并尽快创建动态报告,这就是为什么我不想为此使用 MySQL。我知道 Redis 可以用来解决这个问题,但我只是不知道如何开始。
预先感谢您为我提供的任何入门指南。
最佳答案
确实,这是使用传统 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:age: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 休息一下的绝佳方法。
关于redis - 如何使用Redis存储投票数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23582629/