我正在使用缓存来存储我们的购物车。随着添加更多的购物车,获取单个购物车时系统变得非常慢。
我使用下面的代码访问一个购物车,感觉可能是缓存中的一个键下存储了很多信息。
function discount_when_role_and_payment(/* magic */) {
global $woocommerce;
if ( /* credit-card selected */ && current_user_can('subscriber') ) {
/* get woocommerce cart totals, apply 2% discount and return*/
}
return /*cart totals after discount*/;
}
add_filter( '/* magic */', 'discount_when_role_and_payment' );
我了解我们可以使用诸如 carts:uniqueId 之类的唯一键,但是我需要能够访问所有购物车并遍历它们,因此我认为此解决方案无效。
对于如何解决此问题的任何建议,我将不胜感激。
编辑: 根据 ka_lin 的评论,我需要遍历购物车和预订,以便检查预订日期是否仍然可用。如果不再可用,则需要清除选择的日期,并发出事件以提醒用户。
我希望将数据保留在服务器端,因为它是在api之后构建的,以便更轻松地与合作伙伴集成。
答案 0 :(得分:0)
如果出于某种原因需要将购物车保存在服务器上,则可以始终使用数据库。
如果要存储它们是因为用户在离开页面时不会丢失物品,我建议您使用javascript并将其与localStorage一起存储。
编辑: 听起来您正在使用缓存来处理应该由数据库处理的内容。
答案 1 :(得分:0)
幕后发生的事情是:Laravel中的购物车(如果您已用作基于会话的购物车)被存储在文件系统和Cache中,而未安装memcache / apc缓存。 Laravel也使用默认缓存作为文件系统。所以最终您会做同样的事情。
我个人并不认为仅在网站的许多地方使用购物车会使整个网站变慢。网站的其他因素一定会使您的网站变慢。
答案 2 :(得分:0)
为解决该问题,我创建了一个名为CacheKeys的表,在其中保存了唯一的购物车ID,然后可以使用它们循环浏览并获取所有购物车/预订。
答案 3 :(得分:0)
您解决问题的心态是正确的。但是,实施带来很多麻烦。
在这样的系统中,真正慢的是命中数据库的大量SQL查询。 Lada缓存可通过自动将查询结果保存在Redis中并使更新后的查询结果无效来提供帮助。
我们已经看到在生产环境中查询从2s下降到0.5s,有效增长了4倍。
RTFM:仔细阅读手册 ,尤其是Finally, all your models must include the Spiritix\LadaCache\Database\LadaCacheTrait trait
部分,并享受无忧的缓存系统。
注意:您的后端应该是处理数据库查询的唯一系统。