我的理解是 Memcached 是无锁的(在其默认配置中),因此没有客户端可以阻止任何其他客户端的操作。如果是这样,那么 Memcached 如何处理两个或多个客户端同时尝试更新同一个对象?
Memcached 如何处理一个对象的多个版本?只需获取最后完成更新的版本并将其他版本从缓存中逐出?数据库是否主动使缓存在 Memcached 服务器上的对象失效?
我的理解是 Memcached 是无锁的(在其默认配置中),因此没有客户端可以阻止任何其他客户端的操作。如果是这样,那么 Memcached 如何处理两个或多个客户端同时尝试更新同一个对象?
Memcached 如何处理一个对象的多个版本?只需获取最后完成更新的版本并将其他版本从缓存中逐出?数据库是否主动使缓存在 Memcached 服务器上的对象失效?
Memcached 仅保存对象的最后一个版本。如果您获取、修改和放置,则无法保证放置适用于与获取相同的值。如果您需要同步,您可以使用 CAS 操作 ( gets
, )。cas
添加一些关于它如何工作的细节。CAS - 比较和交换或检查和设置。
Memcached 1.2.5 及更高版本提供了gets 和cas 命令,可以解决以上问题。如果您使用gets 命令查询某个键的缓存,它将返回该项目当前值的唯一标识符。如果你覆盖了这个item,想写回Memcached,可以通过cas命令把唯一ID发给Memcached。如果 Memcached 中存储的项目的唯一标识符与您提供的一致,则您的写入操作将成功。如果在此期间另一个进程也修改了该项目,则存储在 Memcached 中的项目的唯一标识符将发生变化,您的写入操作将失败。
Memcached 保存的键/值具有唯一标识符 casUnique。在进行incr/decr操作时,首先获取casUnique,执行incr,查看返回值是否为casUnique+1。如果是则更新,否则失败不更新!
https://developpaper.com/question/why-does-incr-of-memcache-not-have-concurrency-problems/