共享缓存-无效的最佳做法


14

我想知道什么是使缓存对象无效/更新的更好方法。

先决条件

  • 具有远程Memcached服务器(用作多个应用程序的缓存)
  • 所有服务器均由azure托管(关联区域,相同的数据中心)
  • 缓存对象的大小范围从200字节到50 KB


方法1(尽快存储在缓存中)

  1. 创建对象A->存储在数据库中并存储在缓存中
  2. 客户端请求的对象A->检查缓存是否存在,否则从数据库中获取并存储在缓存中
  3. 对象A更新->存储在数据库中,存储在缓存中

方法1似乎更简单。如果创建了某些内容,请尽快放入缓存。不管有人会需要它。


方法2(惰性缓存存储)

  1. 创建对象A->存储在数据库中
  2. 客户端请求的对象A->检查缓存是否存在,否则从数据库中获取并存储在缓存中
  3. 对象A更新->存储在数据库中,删除键在缓存中

方法2似乎更了解内存。在这种方法中,只有请求的项目才进入缓存。


问题1:考虑到性能,哪种方法更好?内存和CPU都不算在内。

问题2:我的想法是过早的优化吗?

问题3:还有其他想法吗?其他方法?

Answers:


12
  1. 是无法回答的,只能说取决于情况。有很多因素将决定哪种方法最适合您的情况,例如:创建的对象在创建之后不久就被检索是否正常?更新与访问的比率是多少?
  2. 回覆。决定是否需要缓存:如果要在没有数据的情况下进行优化,那么可以,这在技术上是过早的优化。我说技术上是因为经验/传统智慧可能会告诉您您将需要某种缓存。回覆。确定缓存的最佳工作方式:是的,这肯定是过早的优化。
    • 优化通常与寻找最佳/最佳解决方案无关。它应如下所示:
      1. 查找系统中的瓶颈。
      2. 找到工作量最少,可以发挥最大作用的地方。
      3. 做最少的工作!
      4. 够快了吗?如果不是,请转到#1。
      5. 做完了!
    • 老实说,您所描述的两种方法听起来都不复杂。为什么不同时实施这两种方法,看看哪种方法最有效?
    • 方法2中的步骤3可以更改为“对象A得到更新->存储在数据库中,更新条目在缓存中”。

巴克塔,谢谢您的回答。我很感激。
lurkerbe13年

@lurkerbelow很高兴提供帮助。
vaughandroid

2

memcached使用自己的策略管理对象,如果没有人访问它或memcached内存不足,则该缓存的对象将过期。因此,第一种方法不是一个好主意,因为在创建对象时,由于内存不足,memcached中的对象将不断失效。

Q1。方法2在性能方面会更好,因为它不会将对象发送到memcached,尽管性能提高很少。

Q2。这很难说。假设您知道瓶颈并草拟方法,这还为时过早。

Q3。还有其他方法,例如仅在memcached中缓存。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.