locking - memcached 可以用来加锁吗?

标签 locking memcached

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

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

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

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

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

使用memcached可以吗?像这样?威尔setget实际上,如果数据可用而不管它花费多少时间,或者它是否在我发现的任何时间(例如: Guaranteed memcached lock )中以尽可能少的时间提供最佳结果,则实际上是前一类,可能不适用于锁定认为它可能在 99% 的情况下都有效。

任何人都可以澄清以及是否有其他锁定机制?

最佳答案

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

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

以下是 Memcache 论坛上关于此的更多讨论:

Thread 1Thread 2

关于locking - memcached 可以用来加锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37458587/

相关文章:

caching - 如何使缓存保持最新

ruby - 具有 unicorn 和 memcached 的 Sinatra 应用程序应该为缓存命中返回 304 代码吗?

memcached - 多个 memcached 实例的好处

mysql - 我应该避免建立 MySQL 连接(使用 Memcache 时)还是无论如何都要建立连接?

sql-server - 即使没有显式事务,SQL Server 是否也获取锁?

sql - 锁定 SQL Server 存储过程

mysql - 为什么在我刚刚锁定表时给 mysql 错误 ER_TABLE_NOT_LOCKED?

concurrency - OrientDB 的存储独占锁到底意味着什么?

c# - 从可能存在或可能不存在的字典中读取值的线程安全方式

ruby-on-rails - 在运行时更改 Rails cache_store?