首页 > 其他分享 >狗堆效应 dog-pile

狗堆效应 dog-pile

时间:2023-05-24 16:24:36浏览次数:70  
标签:狗堆 缓存 dog 效应 新值 pile value ttl

防止狗堆效应——问题和解决方案

2014 年 7 月 30 日星期三上午 8:56

这是Przemek Sobstel 的客座转贴,他认为 dogpile 效应问题没有得到足够的涵盖,尤其是在 PHP 世界中。原文: 防止dogpile效应

当缓存过期并且网站同时受到大量请求时,就会发生 Dogpile 效应。根据我在大流量网站上工作的经验,这是我认为最好的最佳解决方案。它在野外成功使用并且有效。许多人提到存储两个冗余值 FRESH + STALE,但对于大流量网站来说,它正在扼杀我们的网络。我们认为值得分享我们的解决方案并开始讨论以分享经验。

防止狗堆

在 Web 应用程序中实现缓存似乎很简单。您检查值是否被缓存。如果是,则从缓存中获取缓存值并提供服务。如果不是,则生成新值并将其存储在缓存中以供将来请求使用。就这么简单。

但是,如果值过期然后您收到数百个请求怎么办?它不能再从缓存中提供,因此您的数据库会受到大量试图重新生成该值的进程的影响。数据库收到的请求越多,它们的响应速度就越慢。负载尖峰。直到最终他们可能会倒下。

请参见下图(绿色 - 在缓存中,红色 - 无缓存)。

 

防止 dogpile 效应归结为只有一个进程(第一个进程)重新生成新值,而其他后续进程从缓存中提供陈旧值,直到它被第一个进程引用。

担心提供过时的数据?好吧,如果您的数据库超载和受苦,提供陈旧数据是您可以拥有的最小的不便。如果重新生成新价值需要很长时间,那么让多个进程(而不是一个)执行此操作将无济于事。它只会增加更多的负载。

狗堆效应——预防/实施

使用信号量锁可以防止 Dogpile 效应。如果值过期,第一个进程获取锁并开始生成新值。所有后续请求都会检查是否已获取锁并提供过时的内容。生成新值后,释放锁。

需要注意的重要一点是,实际上值应该被赋予延长的生命周期,因此它们在过期时不会被物理移除,并且在需要时仍然可以提供。

这是它的详细工作原理。

从缓存存储中获取缓存值。

$value = $this->store->get($key);

$value 是一个 值对象

检查缓存值是否过期。如果没过期,就上桌。

if ($value && !$value->isStale()) {
	return $value->getResult();
}

否则,获取锁,这样只有一个进程重新生成新值。

$lock_acquired = $this->acquireLock($key, $grace_ttl);

如果无法获取锁,则意味着已经有其他进程重新生成它,所以我们只提供当前(过时)值。

if (!$lock_acquired) {
	return $value->getResult();
}

否则(已获取锁),重新生成新值。

$result = ...

将重新生成的值保存在缓存存储中。添加宽限期,以便在其他进程需要时可以提供陈旧的结果。

$expiration_timestamp = time() + $ttl;
$value = new Value($result, $expiration_timestamp);

$real_ttl = $ttl + $grace_ttl;
$this->store->set($key, $value, $real_ttl);

释放锁定。

$this->releaseLock($key);

完整实施: https: //github.com/sobstel/metaphore/blob/master/src/Cache.php

比喻

Metaphore 是一个开源库,用于防止 PHP 应用程序中的 dogpile 效应。它实际上是对 LSDCache的重写,它已成功用于许多高流量生产 Web 应用程序。我只是认为 LSDCache 已经发展成为多用途缓存库,而 metaphore 则力求简单地只做一件事并将其做好。

用法非常简单。

在 composer.json 文件中:

"require": {
	"sobstel/metaphore": "dev-master"
}

在您的 PHP 文件中:

use Metaphore\Cache;

// initialize $memcached object (new Memcached())

$cache = new Cache($memcached);
$cache->cache($key, function(){
    // generate content
}, $ttl);

更多阅读

谢谢

感谢 Mariusz Gil 在 2010 年 PHPCon 上关于 Memcached 的演讲——这让我意识到狗堆效应问题——并允许我使用幻灯片中的图片。

 

标签:狗堆,缓存,dog,效应,新值,pile,value,ttl
From: https://www.cnblogs.com/ioriwellings/p/17428645.html

相关文章

  • Compile NSIS scripts in Linux
    http://blog.alejandrocelaya.com/2014/02/01/compile-nsis-scripts-in-linux/ CompileNSISscriptsinLinuxNSISisawellknownsystemusedtocreateWindowsinstallersforanytypeofapplicationbasedonscripts.Itisgoodsystem.Oncewehavedefinedour......
  • dog二进制输入输出-write和read;
    #include<bits/stdc++.h>usingnamespacestd;classDog{ private: intage; intweight; public: Dog(inta,intb):age(a),weight(b){};//带参数的构造函数; Dog(){};//不带参数的构造函数 intAge(){ returnthis->age; } intWeight() { returnthis->weight; } ~Do......
  • error Resolve error: @vitejs/plugin-vue requires vue (>=3.2.13) or @vue/compile
    创建Vue3项目时出错error Resolveerror:@vitejs/plugin-vuerequiresvue(>=3.2.13)or@vue/compiler-sfctobepresentinthedependencytree将vue 升级到 [email protected]  版本 执行[email protected] ......
  • 定义一个Dog类,包括体重和年龄两个数据成员及其成员函数,声明一个实例dog1,体重5,年龄10,使
    #include<bits/stdc++.h>usingnamespacestd;classDog{      private:             intweight,age;      public:             Dog(intw,inta):weight(w),age(a)             {             ......
  • 23-5-15--c++文件基本操作--dog
    定义一个Dog类,包括体重和年龄两个数据成员及其成员函数,声明一个实例dog1,体重5,年龄10,使用I/O流把dog1的状态写入磁盘文件。再声明一个实例dog2,通过读取文件dog1的状态赋给dog2。分别用文本方式和二进制方式操作文件。#include<iostream>#include<fstream>#include<string>usin......
  • doget高速下载 github release
    平常下载githubrelease或者国外文件时,可能遇到下载速度慢,不能下载等情况。第一步打开高速下载网站:https://doget.nocsdn.com第二步将文件地址输入进去,然后回车。下方会出现加速地址。第三步复制生成的结果,用idm或者fdm这类软件,不推荐用浏览器自带的下载器......
  • 获取compile_commands.json的方式
    CMake工程这个最简单,在CMakeLists.txt中加set(CMAKE_EXPORT_COMPILE_COMMANDSon),或者在cmake的命令中加-DCMAKE_EXPORT_COMPILE_COMMANDS.即可产生CMakefileMakefile借助compiledb程序可以生成compile_commands.json文件。compiledb-nmake-f/path/to/Makefile#......
  • Compiler Design Lab 实现过程
    Programming2(SS2023)SaarlandUniversityFacultyMICompilerDesignLabPreparationTobeabletoedittheprojectinMars,youfirsthavetocheckouttherepositoryandimporttheproject:1.Clonetheprojectinanyfolder:where$NAMEhastobereplacedwi......
  • 一文了解ODD2023 Compiler SIG组开放工作会议内容!
    4月21日,作为openEulerDeveloperDay2023重要的一环,CompilerSIG组开放工作会议圆满举行。本次CompilerSIG组开放工作会议主要围绕GCC、LLVM、BiShengJDK的版本规划进行介绍,吸引了现场及线上开发者们的热烈讨论。下面就让我们一起来回顾本次会议的精彩内容!2023GCC版本规划及特......
  • keil5 ARM Compiler5和6的优化等级以及对比
    keil5ARMCompiler5和6的优化等级以及对比 链接:ARMCompiler6优化等级_zhuimeng_ruili的博客-CSDN博客_armcompiler6链接:对keilMdk优化等级的理解_zhuimeng_ruili的博客-CSDN博客_mdk优化等级1、ARM Compiler6优化等级    -O0:没有优化,不推荐在ARMCompile......