【问题标题】:python dictonary object not getting updated in memcachepython字典对象没有在memcached中更新
【发布时间】:2016-03-24 14:37:56
【问题描述】:

我正在开发一个基于 Web2py 的网络应用程序,我将其部署在 Google App Engine 上。 我面临的问题是。每次我按照下面的代码用一个值更新内存缓存时,我的内存缓存都会被刷新

 memclient = memcache.Client()
 temp_list = memclient.get('event_list')
 if temp_list is not None:
    temp_dict = client_list = memclient.get('event_list')
    logging.info('Before Updating')
    logging.info(temp_dict)
    temp_dict.update({str(form.vars.id):[str(form.vars.id),request.vars.first_name,request.vars.last_name]})
    logging.info('After Updating')
    logging.info(client_list)
    memclient.add('event_list', temp_dict)
    temp_dict= memclient.get('event_list')
    logging.info('After Updating in memcache')
    logging.info(temp_dict)
 else:
    temp_dict= {str(form.vars.id):[str(form.vars.id),request.vars.first_name,request.vars.last_name]}
    logging.info('Before Updating')
    logging.info(temp_dict)
    logging.info('After Updating')
    memclient.add('event_list', temp_dict)
    temp_dict= memclient.get('event_list')
    logging.info('After Updating in memcache')
    logging.info(temp_dict)

如果这段代码运行两次,新旧值都应该是 memcache 中 dict 对象的一部分。 虽然目前在日志中,但我正在检查内存缓存中的值是否被新值覆盖。

Logs output
First Run
Before Updating
{'658XXXXXXXXXXX84': ['658XXXXXXXXXXX84', 'roshan', 'jain']}
After Updating
After Updating in memcache
{'658XXXXXXXXXXX84': ['658XXXXXXXXXXX84', 'roshan', 'jain']}

Second RUN
Before Updating
{'658XXXXXXXXXXX84': ['658XXXXXXXXXXX84', 'roshan', 'jain']}
After Updating
{'658XXXXXXXXXXX84': ['658XXXXXXXXXXX84', 'roshan', 'jain'], '566XXXXXXXXX80': ['566XXXXXXXXX80', 'MS', 'Dhoni']}
After Updating in memcache
{'658XXXXXXXXXXX84': ['658XXXXXXXXXXX84', 'roshan', 'jain']}

问题是新值没有得到更新。

注意:我是 Python 和 Web2py 的新手,虽然我在 Java 中广泛使用了 GAE,我认为 Map> 可以存储在缓存中。

感谢您的帮助

【问题讨论】:

    标签: python-2.7 google-app-engine web2py


    【解决方案1】:

    文档不是很清楚,但看起来add 仅在密钥不存在时才更新缓存。由于您之前已将“event_list”存储在缓存中,因此第二次 add 调用什么也不做,您只需在后续 get 中取回原始值。

    您应该使用memclient.set。

    【讨论】:

      【解决方案2】:

      如here 所述,您应该使用.set() 而不是.add()。另一种选择是使用 web2py 的 gae_memcache 模块,它允许您使用与 web2py 的标准 cache 机制相同的 API:

      from gluon.contrib.gae_memcache import MemcacheClient
      cache.ram = cache.disk = MemcacheClient(request)
      

      然后您可以使用cache.ram 和/或cache.disk(两者都只是内存缓存客户端的别名),如下所述:http://web2py.com/books/default/chapter/29/04/the-core#cache

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-29
        • 2015-06-24
        • 1970-01-01
        • 2010-10-02
        相关资源
        最近更新 更多