django - Memcached 比较并设置模式产生错误结果

标签 django memcached python-memcached

我正在尝试实现 memcached 比较和设置模式,按照 Guido 的说明进行操作:

http://neopythonic.blogspot.nl/2011/08/compare-and-set-in-memcache.html

但是,我似乎没有得到正确的结果,我不知道出了什么问题。下面的文件使用 Django (1.4.5 Final) 和 python-memcache (1.48)。

settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

djangocache.py

#!/usr/bin/env python
from django.core.cache import cache
import multiprocessing.dummy

django_key = "TEST"
cached_key = cache.make_key(django_key).encode("UTF-8")

def add_to_cache(item):
    client = cache._cache
    #client = cache._lib.Client(cache._servers)

    while True:
        items = client.gets(cached_key)
        if client.cas(cached_key, items+(item,)):
            break

if __name__ == "__main__":
    cache.set(django_key, ())

    p = multiprocessing.dummy.Pool(2)
    p.map(add_to_cache, range(10))
    print(len(cache.get(django_key)))

运行:

mzialla@Q330 ~/test $ DJANGO_SETTINGS_MODULE=settings python djangocache.py
5

它偶尔会输出 6、7 等,就像您在处理竞争条件时所期望的那样。我已经尝试了多个客户端实例化(请参阅评论)。

帮忙?

最佳答案

python-memcached 默认禁用 cas。通过添加启用它

 client.cache_cas = True

到您的代码。

致谢Nate Thelen ,我在问这个问题后立即发现了谁的评论。

关于django - Memcached 比较并设置模式产生错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19051327/

相关文章:

python - 是否可以使用 StreamingHttpResponse 生成 PDF,因为可以使用 CSV 生成大型数据集?

python - 从 Django 请求中获取域名

python - 属性错误: 'thread._local' object has no attribute 'browser'

azure - 以编程方式配置 Azure 缓存客户端

php - 如何在 Memcache 或 Redis 中通过标签清除缓存?

django haystack 如何在单词中查找子字符串?

laravel - 将 session 从 memcached 迁移到 redis,无需在 laravel 中注销用户

memcached - 如何找到从内存缓存中驱逐的键?

django - 如何在 Django 中删除缓存的模板片段?