redis - 如何使用Redis存储投票数据

标签 redis

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

我想按照标准显示每个问题的投票结果

年龄 性别 收入 教育 种族

不同的问题可能是堕胎、枪支管制等。

我将如何使用 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/

相关文章:

node.js - 使用 Redis Cloud 和 Heroku 正确配置 Node session 存储

java - 如何在 Redis 中存储值列表?

node.js - 如何从在 docker 容器中运行的应用程序连接在我的机器上运行的 redis

python - 在redis中使用数据库作为键前缀

json - node-redis 错误 : Deprecated: The SET command contains a argument of type Object

python - scrapy-redis程序不会自动关闭

redis - Redis中如何批量删除几十万个带有特殊字符的key

python - 我的 celery redis 任务在 heroku 服务器上的 django 应用程序中不起作用

python - 为什么 Flask 限速解决方案使用 Redis?

redis - 配置redis作为缓存