![]() |
1
4
你说得对,在共享缓存(比如memcached)中查找东西比在本地缓存中查找慢(我认为这就是你所说的“复制”)。 然而,共享缓存的优势在于它是共享的,这意味着与将内存用于本地缓存相比,缓存的每个用户都可以访问更多的缓存。 考虑一个应用程序,它有一个50 GB的数据库,有十个应用程序服务器,每个服务器都有1 GB的内存用于缓存。如果使用本地缓存,那么每台机器将有1 GB的缓存,相当于数据库总大小的2%。如果使用共享缓存,则有10 GB的缓存,相当于数据库总大小的20%。本地缓存的缓存命中率会更快,但共享缓存的缓存点击率会高得多。由于缓存未命中比任何一种缓存命中都要昂贵得多,因此稍微慢一点的命中是值得为减少未命中次数而付出的代价。 现在,确切的权衡确实取决于本地命中、共享命中和未命中成本的确切比率,也取决于数据库上访问的分布。例如,如果所有的访问都是对一组大小小于1GB的“热”记录的访问,那么本地缓存将提供100%的命中率,并且与共享缓存一样好。不那么极端的分布仍然可能使平衡发生倾斜。 在实践中,最佳配置通常(IMHO!)是为最热的数据提供一个较小但非常快的本地缓存,然后为长尾提供一个较大且较慢的缓存。你可能会将其视为其他缓存层次结构的形状:考虑一下处理器为每个核心提供小型、快速的L1缓存,然后在单个裸片上的所有核心之间共享较慢的L2/L3缓存,然后可能由系统中的所有裸片共享较慢的片外缓存(当前的处理器真的使用片外缓存吗?)。 |
![]() |
2
4
您在考虑中忽略了磁盘i/o的成本,这通常是任何进程中最慢的部分,也是使用内存缓存(如memcached)的主要驱动因素IMO。 |
![]() |
3
1
内存缓存通过网络使用ram内存。复制同时使用ram内存和持久磁盘内存来获取数据。它们的目的非常不同。 如果您只想使用Memcached来存储容易获得的数据,例如表记录的1-1映射:you-re-gonna-have-a-bad-time:。 另一方面,如果您的数据是一个复杂SQL查询的整个结果集,该查询甚至可能会移动SQL内存池(并且需要临时写入磁盘才能提取),那么您将看到一个巨大的加速。
前面的示例提到需要将数据写入磁盘
阅读
操作-是的,如果结果集对于内存来说太大,就会发生这种情况(想象一个
例如,在用C编写的高度优化的应用程序中,您可能有1microsoft的总处理时间,并且可能需要等待联网和/或序列化/反序列化(封送/解组)的时间比应用程序执行时间本身长得多。从那时起,您也会开始感受到网络上内存缓存的局限性。 |
![]() |
S. Jacson · 任意两台发电机的速度差(内置功能) 2 年前 |
![]() |
Sadeq Dousti · 相当于“嵌套删除”的执行性能SQL查询 2 年前 |
![]() |
Prince · 复制大型文件需要更多时间 2 年前 |
![]() |
Sagar · 为什么在循环之外声明变量会更快? 2 年前 |
![]() |
seco · 如何在不挂起页面的情况下加载JS 2 年前 |