在检查 joomla 缓存类的代码时,我发现基于群的锁定仅在尝试访问缓存文件以在缓存可用时从中读取或在缓存不可用时写入时才会发生。
现在,我面临这个问题:2 个访问者同时访问同一个页面(1 秒拆分),没有可用的缓存,第一次访问将:
- 查找文件:没有可用的缓存文件 -> 需要执行然后缓存到文件 - 锁定新文件 - 执行一些昂贵的代码 - 将结果写入文件 - 解锁并返回结果
第二次命中,1秒后将:
- 查找文件:没有可用的缓存文件,因为第一个 PHP 进程(命中 1)仍在忙于生成要写入文件的数据 -> 所以这个 PHP 进程决定也执行一些代码,然后将其缓存到文件中(同一个文件)-尝试锁定文件(它将等到第一个进程完成写入)-徒劳地重新执行相同的昂贵代码-再次将结果写入文件!- 解锁并返回结果
每次缓存在负载峰值中间失效时,我都会遇到这种精确的情况,并使网站尝试同时执行 10 多次相同的代码(这会导致一些繁重的 sql 工作)杀死 MySQL 并做更多令人讨厌的事情.
您是否像我一样认为锁定必须更智能并防止连续多次重新生成同一缓存项?如果是的话,有没有人找到如何纠正这个问题?在那个精确的时刻,我们有点失去了缓存的好处......
还是好像我错过了什么?