Remove all matching keys from Django cache

倾然丶 夕夏残阳落幕 提交于 2020-01-05 10:52:17

问题


I need to iterate through my server's cache, which is a LocMemCache object, and remove every key in the cache that begins with the string 'rl:'. From what I understand, the only functions that the caching API django provides are get, set, and delete. Here is a rough example of what I am trying to do:

def clear_ratelimit_cache():
    if any('rl:' in s for s in cache.get(s)): 
        log.info(
            'FOUND SOMETHING') 
        cache.delete(*something else here*)

Trying to do this, however, gives me a NameError, stating that global name 's' is not defined. Also it must be noted that the cache is not iterable. Has anyone worked with the cache in a similar manner, and has a suggestion?


回答1:


One option would be to have a separate, named cache in your configuration just for this data type, and then call its clear() method.

Otherwise, Django LocMemCache stores items in a simple dict, in the instance's _cache attribute. Since they don't give you an API for this, you can simply remove the items directly:

for key in cache._cache.keys():
    if key.startswith('rl:'):
        del cache._cache[key]

Usual disclaimer, this is an implementation detail that won't work with other cache types.




回答2:


... in s for s in cache.get(s) can't possibly work. There's no way to determine what possible values s could have.

The short answer is that there's no way to do this with the standard cache API without some changes to your data model. As another answer suggests, you could use a separate cache for just these values. Alternatively, you could have a cache key which stores the keys which start with rl: so you know what to delete.

The problem is that many cache backends don't actually have a way to find cache keys matching a particular value aside from iterating over all the keys. You probably don't want to do this anyway, since it can get quite expensive as your cache size grows.



来源:https://stackoverflow.com/questions/25292426/remove-all-matching-keys-from-django-cache

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!