Django缓存 - 如何生成自定义键名?

时间:2011-01-27 08:47:38

标签: django

现在,我正在从API中检索信息,我想缓存我收到的信息,因此我不必经常点击他们的服务器并用尽我的最大API调用请求。现在,用户可以搜索特定的关键字,比如“葡萄”,我想通过调用“cache.set(search_result,info_retrieved,600)”缓存检索到的字符串,其中“search_result”是用户的搜索结果,这种情况下,“葡萄”。我希望密钥是用户的搜索结果,即“葡萄”。我不能这样做,因为缓存需要密钥是一个字符串。我怎么能绕过这个?我不能使用数据库,因为信息更新太频繁了。

我可以使用数据库,但我会写信息,然后在几分钟后删除它,这似乎不切实际。所以,我只想暂时缓存它。

1 个答案:

答案 0 :(得分:3)

正如Shawn Chin所提到的,你应该已经有了一个搜索查询的字符串“version”,它可以很好地用作缓存键。

memcached的一个限制(不确定其他后端)是键中不允许某些字符(特别是空格)。解决这个问题的最简单方法是将字符串密钥哈希到十六进制摘要中并将其用作密钥:

from hashlib import sha1
key = sha1('grapes').hexdigest() # '35c4cdb50a9a6b4475da4a66d955ef2a9e1acc39'

如果您可能针对不同的用户(或基于任何条件)获得不同的结果,您可以使用该信息的字符串表示来标记/加盐/调整该键:

from hashlib import sha1
key = sha1('%s:%s:%s' % (user.id, session.sessionid, 'grapes')).hexdigest()

您也可以使用django-newcache

  

Newcache是​​Django改进的memcached缓存后端。与Django的内置缓存后端相比,它提供了四大优势:

     
      
  • 支持pylibmc。
  •   
  • 它允许在每个密钥发送到memcached之前运行一个函数。
  •   
  • 它支持设置具有无限超时的缓存键。
  •   
  • 它减轻了雷鸣般的群体问题。
  •   
     

它也有一些相当不错的默认值。默认情况下,在每个键上运行的函数是哈希,版本和密钥的函数。稍后会详细介绍。