memcached可用于缓存静态数据,以减少数据库查找,通常会执行memcached.get(id)和memcached.set(id)。
但是,将其用于锁定机制是否可以?如果数据存在,是否memcache.set并且memcached.get总是提供数据,或者如果请求花费太多时间,它是否只返回 None ?
我想避免并发访问由 a 标识的特定资源id,我使用以下逻辑:
def access(id):
if memcache.get(id):
return access
else:
memcache.set(id)
return true
Run Code Online (Sandbox Code Playgroud)
如果任何用户尝试访问该资源,如果memcache.get(id) = username返回一个值,我们拒绝访问,否则我们会memcache.set(id) = username停止后续访问并允许当前用户访问。
这样用memcached可以吗?是否会set并且get实际上提供数据,无论它需要花费多少时间,或者它是否在最短的时间内从我发现的任何内容(例如:保证的内存缓存锁)中提供最佳结果属于前一类,并且可能不会锁定工作认为它可能在 99% 的时间内工作。
任何人都可以澄清以及是否有其他锁定机制?
对于对此感兴趣的任何人,我在 Memcache Github 上创建了一个线程,将 memcached 可靠地工作以实现锁定机制吗?. 它解释了使用get和 的一些常见警告set以及如何避免使用add. 如果您可以在您喜欢的搜索引擎上搜索distributed locking使用memcache,一些博客也会解释这个问题。
还有一个相关的问题Memcached, Locking and Race Conditions这可能有助于更清楚地了解 memcache 竞争条件。
以下是 Memcache 论坛上关于此的更多讨论: