我以前从未使用过 memcached,我对以下基本问题感到困惑。
Memcached 是缓存吧?我假设我们从数据库缓存数据以便更快地访问。那么当数据库更新时,谁负责更新缓存呢?我们的代码是当数据库更新时 memcached 是否“理解”?
3 回答
Memcached 是缓存吧?我假设我们缓存数据库中的数据以便更快地访问
是的,它是一个缓存,但您必须了解,当您经常访问相同的数据时,缓存会加快访问速度。如果您访问一千次总是彼此不同的数据/对象,那么缓存将无济于事。
要回答您的问题:
那么当数据库更新时,谁负责更新缓存呢?
总是你,但你不必担心你是否做对了。
我们的代码是当数据库更新时 memcached 是否“理解”?
memcached 不知道您的数据库。(实际上客户端甚至不知道服务器..)因此,当您使用数据库的对象时,您应该检查是否存在于缓存中,如果没有,则放入缓存中,否则您很好..仅此而已。当这一刻到来时,memcache 将释放旧数据使用的内存,或者您可以告诉 memcached 在您选择的时间后释放数据(阅读 API 了解详细信息)。
您有责任更新缓存(或某些插件)。
发生的情况是查询被压缩为一些关键特征,并且这些特征被散列。这是针对缓存进行测试的。如果值在缓存中,则直接从缓存中返回数据。否则执行查询,存储在缓存中并返回给用户。
在伪代码中:
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.
缓存偶尔会被清除一次,你可以给一个 key 一个存活时间,然后你的缓存结果会被刷新。
这是最简单的模型,但可能会导致一些不一致。
一种策略是,如果您的代码也是唯一更新数据的应用程序,那么您的代码也可以在更新数据库后作为第二步刷新 memcached。或者至少从 memcached 中驱逐陈旧的数据,这样下次应用程序想要读取它时,它将被迫从数据库中重新查询当前数据并将最新数据恢复到 memcached。
另一种策略是将数据存储在具有过期时间的 memcached 中,因此 memcached 会在一定时间后自动清除该数据元素。您可以根据您对数据更新频率的了解以及您的应用程序对读取过时数据的容忍度来选择到期时间。
所以最终,您是负责将数据放入 memcached 的人。只有您知道哪些数据值得存储在缓存中,您希望以何种格式存储它,您希望查询它的频率以及何时刷新它。您根据具体情况做出判断,因为您比任何自动系统都更了解您的数据和应用程序的可能行为。