0

我有以下网站:

用户输入一些数据,服务器根据这些数据生成大量结果,这些结果需要显示给用户。我正在使用php计算数据,将其存储在MySQL DB中,并通过服务器端处理将其显示在Datatables中。数据需要在有限的时间内保存 - 每隔一小时,整个表都会被删除并重新创建。

观察到的最大负载为:每天 7000 个会话/用户,一次最多 400 个用户。每小时我们在主表中插入超过 5000 万条记录。我们正在使用带有 Intel i7 和 24GB 内存、HDD 磁盘的专用服务器。

问题是当更多的人(一次> 100人)使用该站点时,MySQL无法处理负载并且MySQL +硬盘成为瓶颈。即使有几千个结果,用户也必须等待几分钟。磁盘是 HDD,目前没有放置 SSD 的选项。

问题:

  1. 用 Redis 代替 MySQL 能提高性能,能提高多少?

  2. 如何将生成的数据存储在 redis 中,以便我可以为 1 个用户检索它并按任何值对其进行排序并过滤它?

我在php中有以下数据

$user_data = array (
   array("id"=>1, "session"="3124", "set"=>"set1", "int1"=>1, "int2"=>11, "int3"=>111, "int4"=>1111),
   array("id"=>2, "session"="1287", "set"=>"set2", "int1"=>2, "int2"=>22, "int3"=>222, "int4"=>2222)...
)

$user_data 可以是长度从 1 到 1-2 百万的数组(我正在计算它并以 10000 的块插入数据库)

我需要为至少 400 个这样的用户存储 redis 数据,并且能够以 10/20 的块为分页检索特定用户的数据。我还需要能够按任何字段集(字符串)、int1、int2 ...(我有大约 22 个 int 字段)进行排序,并且还需要按任何整数字段进行过滤(类似于 sql WHERE 子句 9000 < int4 < 100000)。

  1. redis 也可以制作类似于 SQLs WHERE set LIKE '%value%' 的东西吗?
4

2 回答 2

1

如果您可以将所有数据保存在内存中,Redis 可能非常适合您的问题。但是你必须重新考虑你的数据结构。Redis 与关系型数据库有很大的不同,没有直接迁移。

至于你的问题。

  1. 可能它可以帮助提高性能。多少,取决于您的用例和数据结构。您的约束将不再是硬盘,但可能是别的东西。

  2. Redis 没有类似于 ORDER BY 或 WHERE 作为 SQL 的概念。您将负责维护您的索引和过滤器。

我会为每个“记录”创建一个 HSET,然后使用几个 ZSET 来创建该记录的索引。(如果您真的需要在任何字段上订购,那么您将需要每个字段一个 ZSET)

至于过滤器,用于索引的 ZSET 可能对过滤 int 值范围很有用。

不幸的是,对于 LIKE 查询,我真的没有答案。当我需要高级搜索功能时,我通常使用 ElasticSearch(结合 redis 和/或 mysql)

于 2016-02-09T23:06:52.863 回答
0

1、用Redis代替MySQL能提高性能,能提高多少?

是的,Redis 可以提高你的基本读/写性能,因为它将信息直接存储在内存中。这篇文章描述了性能提高了 3 倍,但这篇文章的日期是 2009 年,因此从那以后数字可能已经改变。

但是,只要您有足够的内存,这种性能提升才有意义。一旦超过分配的内存量,您的服务器将开始交换到磁盘,从而大大降低 Redis 性能。

要记住的另一件事是,默认情况下,存储在 Redis 中的信息不能保证是持久的——数据集仅每 60 秒存储一次,或者至少有 1000 个键发生变化。其他更改将在服务器重新启动或断电时丢失。

2.如何将生成的数据存储在redis中,以便我可以为1个用户检索它并按任何值对其进行排序并过滤它?

Redis 数据存储方式与传统关系型数据库不同。它不提供复杂的排序,但可以通过sorted setsSORT 命令完成基本排序。这必须由 PHP 服务器完成。

Redis 确实有任何搜索支持——它必须由您的 PHP 服务器实现。

三、结论

在我看来,处理您所要求的最佳方法是使用 Redis 服务器进行缓存,使用 MySQL 服务器存储您需要持久的信息(如果您没有任何必须持久的信息,您可以只拥有 Redis 服务器)。

你之前这么说

数据需要在有限的时间内保存 - 每隔一小时,整个表都会被删除并重新创建。

这对于 Redis 来说是完美的。Redis 支持通过对键执行EXPIRE命令的TTL,它会在设定的时间后自动删除一个键。这样您就不需要删除和重新创建任何表——Redis 会为您完成。

于 2016-02-10T00:13:38.967 回答