代码之家  ›  专栏  ›  技术社区  ›  Jackson Bakari

使用Django中的密钥前缀从缓存中删除数据

  •  0
  • Jackson Bakari  · 技术社区  · 1 年前
    cache.set("determ_" + str(id), cache_object)
    

    我使用Redis处理Django缓存,这些是我的缓存密钥示例

    determ_1ba243f3-2eda-4feb-bf24-1aa4c0cd2171 appr_hist_2bfd55e4-22c1-4cc3-a913-8ac2cde3801b appr_act_5a18c351-e172-4369-9a4b-118c3df5b25a

    但当我想使用密钥的某个部分删除缓存时,我会遇到挑战 determ_ , appr_hist_ , appr_act_

    如何做到这一点?

    from django.core.cache import cache
    
    class CacheManager:
        
        @classmethod
        def delete_cache(self, prefixes = []):
            for pattern in prefixes:
                cache.delete(pattern)
    
            return True
    
    CacheManager.delete_cache(['determ_','appr_hist_', 'det_appr','appr_act_','deter_sect_'])
    
    0 回复  |  直到 1 年前
        1
  •  2
  •   Guy Royse    1 年前

    我不能代表Django说话,但Redis没有模式删除功能。这样做的方式通常是有效的,但并不具有表演性。

    它涉及使用 SCAN 命令来获取与模式匹配的所有键。SCAN是一个O(N)运算,其中N是Redis中的键数。然后,您发布 UNLINK 在所有领域。UNLINK是可变的,因此您可以将所有匹配的密钥传递给它。

    这个 KEYS DEL 命令也可以工作,但性能更差。当Redis运行时,KEYS会阻止它,而其他客户端则无法使用Redis。DEL阻塞Redis直到释放内存,而UNLINK返回并释放内存。

    不确定您是否可以从Django获得这些命令中的任何一个,但我希望这会有所帮助。

        2
  •  0
  •   Jackson Bakari    1 年前

    非常感谢 @盖伊·罗伊斯 为伟大的投入。我使用了这个想法并构建了这个方法,现在它运行良好,我需要处理我的政策和性能

    import redis
    
    class CacheManager:
    
        
        @classmethod
        def delete_cache(self, prefixes = []):
            redis_client = redis.from_url('redis://127.0.0.1:6379/1')
            keys = redis_client.scan_iter("fcrs_:1:*")
            for key in keys:
                for prefix in prefixes:
                    clear_key = str(key.decode('utf-8')).split(":")
                    if prefix in clear_key[2]:
                        print(f": Found keys for prefix '{prefix}':", str(key.decode('utf-8')))
                        redis_client.delete(key)
            
            return True