python dictonary对象没有在memcache中更新

时间:2016-03-24 14:37:56

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

我正在开发基于Web2py的Web应用程序,我正在Google App Engine上部署该应用程序。 我面临的问题是。每次我用以下代码更新memcache时,我的memcache都会被刷新

 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对象的一部分。 虽然目前在日志中我正在检查值是否在memcache中被覆盖了新值。

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的新手,虽然我已经广泛使用了GAE for java,我认为Map>可以存储在缓存中。

谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

文档没有大量清晰,但如果密钥不存在,add似乎只更新缓存。由于您之前存储过" event_list"在缓存中,第二个add调用不执行任何操作,您只需在后续get中获取原始值。

相反,您应该使用memclient.set

答案 1 :(得分:0)

如上所述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(两者都只是memcache客户端的别名),如下所述:http://web2py.com/books/default/chapter/29/04/the-core#cache