memcached如何更新?

5

我以前从未使用过memcached,对以下基本问题感到困惑。
Memcached是缓存吗? 我认为我们会从数据库中缓存数据以实现更快的访问。 那么当数据库更新时,谁负责更新缓存? 我们的代码是否能够使memcached“理解”数据库已经被更新了?


1
不,_你的应用程序_负责在应用程序更新内容时使缓存失效,或者不关心数据是否过期。仔细选择缓存可以存在的时间。正如他们所说的那样:“计算机科学中只有两个难题:缓存失效和命名事物。” - Wrikken
@Wrikken: 所以想法是最终执行UPDATE table的代码也会更新缓存吗? - Jim
3个回答

3
Memcached是一个缓存,对吧?我想我们会从数据库中缓存数据以便更快地访问。
是的,它是一个缓存,但你必须明白,当你经常访问相同的数据时,缓存才能加速访问。如果你访问的数据/对象每次都不同,那么缓存就没有帮助了。
回答你的问题:
那么当数据库更新时,谁负责更新缓存呢?
永远是你,但你不必担心是否做得正确。
我们的代码是否可以让memcached“理解”数据库何时已更新?
memcached并不知道你的数据库。(实际上,客户端甚至不知道服务器...)所以当你使用数据库中的一个对象时,你应该检查它是否存在于缓存中,如果不存在,就把它放入缓存,否则一切都好。当时机到来时,memcached会释放旧数据使用的内存,或者你可以告诉memcached在你选择的时间后释放数据(请阅读API以获取详细信息)。

1
你需要负责更新缓存(或某些插件)。
具体操作是将查询压缩为关键特征,并对其进行哈希。然后与缓存进行比对。如果值在缓存中,则直接从缓存中返回数据。否则执行查询,将结果存储在缓存中并返回给用户。
伪代码如下:
key = query_key(your_sql_query)
if key in cache:
  return cache.get(key)
else:
 results = execute(your_sql_query)
 cache.set(key, results, time_to_live)
 return results. 

缓存会定期清除,您可以给一个键设置生存时间,然后刷新缓存结果。这是最简单的模型,但可能会导致一些不一致性。

关于您的伪代码。这是用来初始化缓存的。那么,您如何确定是否需要更新缓存? - Jim
这更加复杂。如果你在一个简单的REST API中有一个用户对象,你可以使用类似于<table>-<id>的键。如果你更新了ID为59的用户表中的值,你需要重置缓存键users-59。但是当查询是可变的时候,你可以保留一组键名,这些键名取决于特定表中的某一行,并刷新所有这些键。关键点在于正确命名它们,以便在需要时更新它们。你需要设计一些函数来实现这个目的。 - Edgar Klerks

1
一种策略是,如果您的代码也是更新数据的唯一应用程序,则在更新数据库后,您的代码可以作为第二步刷新memcached。或者至少从memcached中清除旧数据,这样下次应用程序想要读取它时,将被强制从数据库重新查询当前数据并将最新数据恢复到memcached。
另一种策略是使用过期时间将数据存储在memcached中,因此memcached会在一定时间后自动清除该数据元素。您可以根据您对数据更新频率以及应用程序读取旧数据的容忍度的了解来选择过期时间。
因此,最终您负责将数据放入memcached中。只有您知道哪些数据值得存储在缓存中,您想要将其存储在什么格式中,您预计查询频率有多高以及何时刷新它。您基于情况逐个进行判断,因为您比任何自动系统更了解数据和应用程序的可能行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接