Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 7:MariaDB与Redis结合使用,但Redis在处理大型对象时表现较慢_Php_Mysql_Laravel_Eloquent_Redis - Fatal编程技术网

Php Laravel 7:MariaDB与Redis结合使用,但Redis在处理大型对象时表现较慢

Php Laravel 7:MariaDB与Redis结合使用,但Redis在处理大型对象时表现较慢,php,mysql,laravel,eloquent,redis,Php,Mysql,Laravel,Eloquent,Redis,我已经成功地实现了redis和mysql的组合。在我的应用程序的一个部分,我想我会减少mysql服务器上的负载,并使用redis,直到数据被更改为止,但是我观察到,从mysql获取相同数据的速度比从redis更快 下面是一个场景 User1:10000条记录,在一天左右的时间内很少一次性更改 我所做的是将获取这些10K记录的整个对象(大小约20mb的序列化对象)保存到redis。这个想法是,既然后续的100到1000个请求将只是页面刷新,那么为什么不避免mysql点击并从redis获取这些数据呢

我已经成功地实现了redis和mysql的组合。在我的应用程序的一个部分,我想我会减少mysql服务器上的负载,并使用redis,直到数据被更改为止,但是我观察到,从mysql获取相同数据的速度比从redis更快

下面是一个场景

User1:10000条记录,在一天左右的时间内很少一次性更改

我所做的是将获取这些10K记录的整个对象(大小约20mb的序列化对象)保存到redis。这个想法是,既然后续的100到1000个请求将只是页面刷新,那么为什么不避免mysql点击并从redis获取这些数据呢

然而,我观察到,当从Redis获取这个对象时,它比刷新Redis并点击mysql查询时需要更多的时间。我原以为redis会更快,或者至少有和mysql一样的速度,但现在不同了

此外,我还观察到,当从Redis获取20mb对象时,我的php会出现“允许内存耗尽”错误(我知道如何修复),但当从mysql获取相同的数据时,不会出现任何错误

是否Redis不适合缓存大型对象?还是有别的事


谢谢

Redis不适合存储/获取大型对象。在网络/带宽中获取/设置这些对象时,您将受到影响。由于它是单线程的,所以在存储/获取这些大型对象时,其他请求也会受到影响

如合同中所述

RAM的速度和内存带宽对于全局性能似乎不那么重要,尤其是对于小型对象。对于
大型对象(>10KB)
,它可能会变得引人注目。通常,购买昂贵的快速内存模块来优化Redis并不划算


您可以做的是,根据应用程序的查询要求,使用
散列
列表
重新设计缓存层。您可以查看更多信息。另外,我在

中回答了一个类似的问题,Redis不适合存储/获取大型对象。在网络/带宽中获取/设置这些对象时,您将受到影响。由于它是单线程的,所以在存储/获取这些大型对象时,其他请求也会受到影响

如合同中所述

RAM的速度和内存带宽对于全局性能似乎不那么重要,尤其是对于小型对象。对于
大型对象(>10KB)
,它可能会变得引人注目。通常,购买昂贵的快速内存模块来优化Redis并不划算


您可以做的是,根据应用程序的查询要求,使用
散列
列表
重新设计缓存层。您可以查看更多信息。我还在

中回答了一个类似的问题,因此将所有10k记录存储在一个对象中,然后在需要数据时获取该对象,取消序列化,然后提取所需的数据。这可能就是为什么要花这么长时间的原因。您是否尝试过将每条记录作为单独的项存储在redis中。我考虑过这一点,但我有这些表关系,我认为这会使事情变得极其复杂,或者我的想法是错误的?因此,您将所有10k记录存储在一个对象中,然后当您需要数据时,您将获取此对象,取消序列化,然后提取所需的数据。这可能就是为什么要花这么长时间的原因。你有没有试过在redis中将每条记录作为一个单独的项目存储。我想过,但是我有这些表关系,我认为这会使事情变得极其复杂,或者我的想法是错误的?谢谢。我现在将浏览这些链接。单独存储这10K项的问题在于,此表在产品名称和产品类型方面依赖于另外两个表。因此,我认为最简单的方法是一次存储整个对象。@Kashif如果使用Eloquent的缓存,那么大小将是巨大的,但如果存储json,那么它将更小。如果不需要,还可以删除“未使用”的列。如果您打算在前端使用,那么“分页”将有所帮助-您也可以从Redis通过分页获得它们(排序集可能会有帮助)。感谢您的深刻见解和雄辩的答案。:)谢谢我现在将浏览这些链接。单独存储这10K项的问题在于,此表在产品名称和产品类型方面依赖于另外两个表。因此,我认为最简单的方法是一次存储整个对象。@Kashif如果使用Eloquent的缓存,那么大小将是巨大的,但如果存储json,那么它将更小。如果不需要,还可以删除“未使用”的列。如果您打算在前端使用,那么“分页”将有所帮助-您也可以从Redis通过分页获得它们(排序集可能会有帮助)。感谢您的深刻见解和雄辩的答案。:)