memcached 可以用于锁定吗?

Can memcached be used for locking?

memcached 可用于缓存静态数据,减少数据库查找,通常执行 memcached.get(id)memcached.set(id).

但是,将其用于锁定机制是否合适?如果数据存在,memcache.setmemcached.get 是否总是提供数据,或者如果请求花费太多时间,它只是 return None?

我想避免并发访问由 id 标识的特定资源,我使用以下逻辑:

def access(id):
    if memcache.get(id):
        return access
    else:
        memcache.set(id)
        return true

如果任何用户试图访问该资源,如果 memcache.get(id) = username return 是一个值,我们将拒绝访问,否则我们会 memcache.set(id) = username 停止后续访问并允许当前用户访问.

这样使用memcached可以吗? setget 是否会实际提供数据(如果它可用,而不管它花费的时间),或者它是否会在最短的时间内从我发现的任何内容中给出最好的结果(例如:Guaranteed memcached lock) 到目前为止属于前一类,可能不适用于锁定,认为它可能在 99% 的时间都有效。

谁能澄清一下,是否有其他锁定机制?

对于任何对此感兴趣的人,我在 Will memcached work reliably for implementing a locking mechanism? 的 Memcache Github 上创建了一个线程。它解释了一些使用 getset 的常见注意事项以及如何避免使用 add。如果您可以在您喜欢的搜索引擎上使用 memcache 搜索 distributed locking,一些博客也会解释这个问题。

还有一个相关问题 Memcached, Locking and Race Conditions 可能有助于更清楚地了解内存缓存竞争条件。

内存缓存论坛对此有更多讨论:

Thread 1 and Thread 2