我有以下网站:
用户输入一些数据并根据它生成大量结果,需要将结果显示给用户。我正在使用 php 计算数据,将其存储在 MySQL数据库中,并在服务器端处理的 Datatables 中显示。 数据需要在有限的时间内保存 - 每整个小时,整个表格都会被删除并重新创建。
观察到的最大负载:每天7000个会话/用户,一次最多400个用户。每小时我们都会在主表中插入超过50百万条记录。我们使用的是专用服务器,配备Intel i7和24GB RAM,HDD磁盘。
问题是当更多人(一次超过100个)使用该网站时,MySQL无法处理负载而MySQL +硬盘成为瓶颈。用户必须等待几分钟甚至几千个结果。磁盘是硬盘驱动器,现在没有选择放置SSD。
问题(S):
用Redis替换MySQL可以提高性能和性能吗?
如何将生成的数据存储在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-2milion的数组(我正在计算它并以10000块的形式插入数据库)
我需要为至少400个此类用户存储redis数据,并且能够以10/20的块为特定用户检索数据以进行分页。我还需要能够通过任何字段set(string),int1,int2 ...(我有大约22个int字段)进行排序,并且还可以通过任何整数字段进行筛选(类似于sql WHERE子句9000< int4< 100000)。
答案 0 :(得分:1)
如果您可以将所有数据保存在内存中,则可能Redis非常适合您的问题。但是你必须重新考虑你的数据结构。 Redis与关系数据库非常不同,并且没有直接迁移。
至于你的问题。
可能它对性能有帮助。多少,这取决于您的用例和数据结构。你的约束不再是硬盘了,但可能是别的东西。
Redis没有类似于ORDER BY的概念,或者没有类似SQL的概念。您将负责维护索引和过滤器。
我会为每个"记录创建一个HSET"然后,使用几个ZSET来创建该记录的索引。 (如果你真的需要在任何领域订购,那么你每个领域需要一个ZSET)
对于过滤器,用于索引的ZSET可能对过滤int值的范围很有用。
不幸的是,对于LIKE查询,我真的没有答案。当我需要高级搜索功能时,我通常使用ElasticSearch(与redis和/或mysql结合使用)
答案 1 :(得分:0)
是的,Redis可以提高您的基本读/写性能,因为它将信息直接存储在内存中。 This post将性能提升了3倍,但该帖子的日期为2009年,因此数据可能已经发生了变化。
但是,只要你有足够的内存,这种性能提升才有意义。一旦超过分配的内存量,服务器将开始交换到磁盘,大大降低了Redis的性能。
要记住的另一件事是默认情况下不保证存储在Redis中的信息是持久的 - the data set is only stored every 60 seconds or if at least 1000 keys change。其他更改将在服务器重启或断电时丢失。
Redis数据存储,与传统的关系数据库有不同的方法。它不提供复杂的排序,但可以通过sorted sets和SORT command进行基本排序。这必须由PHP服务器完成。
Redis确实有任何搜索支持 - 它必须由您的PHP服务器实现。
在我看来,处理你要求的最好的方法是使用Redis服务器进行缓存,使用MySQL服务器存储你需要持久保存的信息(如果你没有&#39) ; t有任何必须持久的信息,你可以拥有Redis服务器。)
你说那个
数据需要在有限的时间内保存 - 每小时一次 使用它的整个表格已删除并重新创建。
这对Redis来说非常完美。 Redis通过密钥上的TTL命令支持EXPIRE,该命令会在设定的时间后自动删除密钥。这样您就不需要删除并重新创建任何表格 - Redis会为您完成。