[{"data":1,"prerenderedAt":15853},["ShallowReactive",2],{"navigation":3,"/performance-and-optimization/caching-strategies":1016,"/performance-and-optimization/caching-strategies-surround":15848},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":793,"body":1018,"description":1028,"extension":15843,"links":15844,"meta":15845,"navigation":1375,"path":794,"seo":15846,"stem":795,"__hash__":15847},"docs/21.performance-and-optimization/05.caching-strategies.md",{"type":1019,"value":1020,"toc":15806},"minimark",[1021,1025,1029,1034,1037,1042,1053,1057,1061,1064,1781,1785,1934,1938,1942,3044,3048,4313,4317,4321,5168,5172,6106,6109,6113,6767,6771,7335,7339,7343,8416,8420,9474,9478,9482,11605,11609,11613,13343,13347,13351,14128,14132,14810,14814,15760,15764,15767,15796,15799,15802],[1022,1023,793],"h1",{"id":1024},"caching-strategies",[1026,1027,1028],"p",{},"Caching is one of the most effective performance optimization techniques in Django applications. By storing frequently accessed data in fast storage systems, you can dramatically reduce database load, improve response times, and enhance user experience. This comprehensive guide covers multi-level caching strategies, cache backends, invalidation patterns, and advanced caching techniques.",[1030,1031,1033],"h2",{"id":1032},"understanding-djangos-caching-framework","Understanding Django's Caching Framework",[1026,1035,1036],{},"Django provides a flexible caching framework that supports multiple cache backends and caching levels. Understanding when and how to use each type of caching is crucial for building high-performance applications.",[1038,1039,1041],"h3",{"id":1040},"cache-hierarchy","Cache Hierarchy",[1043,1044,1049],"pre",{"className":1045,"code":1047,"language":1048},[1046],"language-text","┌─────────────────────────────────────────────────────────────┐\n│                    Browser Cache                            │\n│  • Static files (CSS, JS, images)                          │\n│  • HTTP cache headers                                       │\n│  • Service worker cache                                     │\n└─────────────────────────────────────────────────────────────┘\n                            ↓\n┌─────────────────────────────────────────────────────────────┐\n│                    CDN/Reverse Proxy                       │\n│  • Static content delivery                                 │\n│  • Geographic distribution                                 │\n│  • Edge caching                                            │\n└─────────────────────────────────────────────────────────────┘\n                            ↓\n┌─────────────────────────────────────────────────────────────┐\n│                    Application Cache                       │\n│  • View caching                                            │\n│  • Template fragment caching                              │\n│  • Low-level cache API                                    │\n└─────────────────────────────────────────────────────────────┘\n                            ↓\n┌─────────────────────────────────────────────────────────────┐\n│                    Database Query Cache                    │\n│  • ORM query results                                       │\n│  • Aggregation results                                     │\n│  • Complex computations                                    │\n└─────────────────────────────────────────────────────────────┘\n                            ↓\n┌─────────────────────────────────────────────────────────────┐\n│                    Database Cache                          │\n│  • Query plan cache                                        │\n│  • Buffer pool                                             │\n│  • Index cache                                             │\n└─────────────────────────────────────────────────────────────┘\n","text",[1050,1051,1047],"code",{"__ignoreMap":1052},"",[1030,1054,1056],{"id":1055},"cache-backend-configuration","Cache Backend Configuration",[1038,1058,1060],{"id":1059},"redis-configuration-recommended","Redis Configuration (Recommended)",[1026,1062,1063],{},"Redis is the preferred cache backend for production Django applications due to its performance, persistence options, and advanced features.",[1043,1065,1069],{"className":1066,"code":1067,"language":1068,"meta":1052,"style":1052},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings.py\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': 'redis://127.0.0.1:6379/1',\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 50,\n                'retry_on_timeout': True,\n            },\n            'COMPRESSOR': 'django_redis.compressors.zlib.ZlibCompressor',\n            'SERIALIZER': 'django_redis.serializers.json.JSONSerializer',\n        },\n        'KEY_PREFIX': 'myapp',\n        'VERSION': 1,\n        'TIMEOUT': 300,  # 5 minutes default timeout\n    }\n}\n\n# Multiple cache configurations\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': 'redis://127.0.0.1:6379/1',\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'TIMEOUT': 300,\n    },\n    'sessions': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': 'redis://127.0.0.1:6379/2',\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'TIMEOUT': 86400,  # 24 hours for sessions\n    },\n    'long_term': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': 'redis://127.0.0.1:6379/3',\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'TIMEOUT': 86400 * 7,  # 1 week for long-term data\n    }\n}\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'sessions'\n","python",[1050,1070,1071,1080,1094,1113,1137,1158,1172,1194,1208,1227,1245,1251,1272,1293,1299,1320,1337,1358,1364,1370,1377,1383,1392,1405,1424,1443,1456,1475,1480,1495,1501,1515,1534,1554,1567,1586,1591,1610,1615,1629,1648,1668,1681,1700,1705,1730,1735,1740,1745,1751,1767],{"__ignoreMap":1052},[1072,1073,1076],"span",{"class":1074,"line":1075},"line",1,[1072,1077,1079],{"class":1078},"s9Tkl","# settings.py\n",[1072,1081,1083,1087,1091],{"class":1074,"line":1082},2,[1072,1084,1086],{"class":1085},"se3Ec","CACHES",[1072,1088,1090],{"class":1089},"soVBu"," =",[1072,1092,1093],{"class":1089}," {\n",[1072,1095,1097,1101,1105,1108,1111],{"class":1074,"line":1096},3,[1072,1098,1100],{"class":1099},"sbYkP","    '",[1072,1102,1104],{"class":1103},"sTbE_","default",[1072,1106,1107],{"class":1099},"'",[1072,1109,1110],{"class":1089},":",[1072,1112,1093],{"class":1089},[1072,1114,1116,1119,1122,1124,1126,1129,1132,1134],{"class":1074,"line":1115},4,[1072,1117,1118],{"class":1099},"        '",[1072,1120,1121],{"class":1103},"BACKEND",[1072,1123,1107],{"class":1099},[1072,1125,1110],{"class":1089},[1072,1127,1128],{"class":1099}," '",[1072,1130,1131],{"class":1103},"django_redis.cache.RedisCache",[1072,1133,1107],{"class":1099},[1072,1135,1136],{"class":1089},",\n",[1072,1138,1140,1142,1145,1147,1149,1151,1154,1156],{"class":1074,"line":1139},5,[1072,1141,1118],{"class":1099},[1072,1143,1144],{"class":1103},"LOCATION",[1072,1146,1107],{"class":1099},[1072,1148,1110],{"class":1089},[1072,1150,1128],{"class":1099},[1072,1152,1153],{"class":1103},"redis://127.0.0.1:6379/1",[1072,1155,1107],{"class":1099},[1072,1157,1136],{"class":1089},[1072,1159,1161,1163,1166,1168,1170],{"class":1074,"line":1160},6,[1072,1162,1118],{"class":1099},[1072,1164,1165],{"class":1103},"OPTIONS",[1072,1167,1107],{"class":1099},[1072,1169,1110],{"class":1089},[1072,1171,1093],{"class":1089},[1072,1173,1175,1178,1181,1183,1185,1187,1190,1192],{"class":1074,"line":1174},7,[1072,1176,1177],{"class":1099},"            '",[1072,1179,1180],{"class":1103},"CLIENT_CLASS",[1072,1182,1107],{"class":1099},[1072,1184,1110],{"class":1089},[1072,1186,1128],{"class":1099},[1072,1188,1189],{"class":1103},"django_redis.client.DefaultClient",[1072,1191,1107],{"class":1099},[1072,1193,1136],{"class":1089},[1072,1195,1197,1199,1202,1204,1206],{"class":1074,"line":1196},8,[1072,1198,1177],{"class":1099},[1072,1200,1201],{"class":1103},"CONNECTION_POOL_KWARGS",[1072,1203,1107],{"class":1099},[1072,1205,1110],{"class":1089},[1072,1207,1093],{"class":1089},[1072,1209,1211,1214,1217,1219,1221,1225],{"class":1074,"line":1210},9,[1072,1212,1213],{"class":1099},"                '",[1072,1215,1216],{"class":1103},"max_connections",[1072,1218,1107],{"class":1099},[1072,1220,1110],{"class":1089},[1072,1222,1224],{"class":1223},"s7CZa"," 50",[1072,1226,1136],{"class":1089},[1072,1228,1230,1232,1235,1237,1239,1243],{"class":1074,"line":1229},10,[1072,1231,1213],{"class":1099},[1072,1233,1234],{"class":1103},"retry_on_timeout",[1072,1236,1107],{"class":1099},[1072,1238,1110],{"class":1089},[1072,1240,1242],{"class":1241},"s8XtY"," True",[1072,1244,1136],{"class":1089},[1072,1246,1248],{"class":1074,"line":1247},11,[1072,1249,1250],{"class":1089},"            },\n",[1072,1252,1254,1256,1259,1261,1263,1265,1268,1270],{"class":1074,"line":1253},12,[1072,1255,1177],{"class":1099},[1072,1257,1258],{"class":1103},"COMPRESSOR",[1072,1260,1107],{"class":1099},[1072,1262,1110],{"class":1089},[1072,1264,1128],{"class":1099},[1072,1266,1267],{"class":1103},"django_redis.compressors.zlib.ZlibCompressor",[1072,1269,1107],{"class":1099},[1072,1271,1136],{"class":1089},[1072,1273,1275,1277,1280,1282,1284,1286,1289,1291],{"class":1074,"line":1274},13,[1072,1276,1177],{"class":1099},[1072,1278,1279],{"class":1103},"SERIALIZER",[1072,1281,1107],{"class":1099},[1072,1283,1110],{"class":1089},[1072,1285,1128],{"class":1099},[1072,1287,1288],{"class":1103},"django_redis.serializers.json.JSONSerializer",[1072,1290,1107],{"class":1099},[1072,1292,1136],{"class":1089},[1072,1294,1296],{"class":1074,"line":1295},14,[1072,1297,1298],{"class":1089},"        },\n",[1072,1300,1302,1304,1307,1309,1311,1313,1316,1318],{"class":1074,"line":1301},15,[1072,1303,1118],{"class":1099},[1072,1305,1306],{"class":1103},"KEY_PREFIX",[1072,1308,1107],{"class":1099},[1072,1310,1110],{"class":1089},[1072,1312,1128],{"class":1099},[1072,1314,1315],{"class":1103},"myapp",[1072,1317,1107],{"class":1099},[1072,1319,1136],{"class":1089},[1072,1321,1323,1325,1328,1330,1332,1335],{"class":1074,"line":1322},16,[1072,1324,1118],{"class":1099},[1072,1326,1327],{"class":1103},"VERSION",[1072,1329,1107],{"class":1099},[1072,1331,1110],{"class":1089},[1072,1333,1334],{"class":1223}," 1",[1072,1336,1136],{"class":1089},[1072,1338,1340,1342,1345,1347,1349,1352,1355],{"class":1074,"line":1339},17,[1072,1341,1118],{"class":1099},[1072,1343,1344],{"class":1103},"TIMEOUT",[1072,1346,1107],{"class":1099},[1072,1348,1110],{"class":1089},[1072,1350,1351],{"class":1223}," 300",[1072,1353,1354],{"class":1089},",",[1072,1356,1357],{"class":1078},"  # 5 minutes default timeout\n",[1072,1359,1361],{"class":1074,"line":1360},18,[1072,1362,1363],{"class":1089},"    }\n",[1072,1365,1367],{"class":1074,"line":1366},19,[1072,1368,1369],{"class":1089},"}\n",[1072,1371,1373],{"class":1074,"line":1372},20,[1072,1374,1376],{"emptyLinePlaceholder":1375},true,"\n",[1072,1378,1380],{"class":1074,"line":1379},21,[1072,1381,1382],{"class":1078},"# Multiple cache configurations\n",[1072,1384,1386,1388,1390],{"class":1074,"line":1385},22,[1072,1387,1086],{"class":1085},[1072,1389,1090],{"class":1089},[1072,1391,1093],{"class":1089},[1072,1393,1395,1397,1399,1401,1403],{"class":1074,"line":1394},23,[1072,1396,1100],{"class":1099},[1072,1398,1104],{"class":1103},[1072,1400,1107],{"class":1099},[1072,1402,1110],{"class":1089},[1072,1404,1093],{"class":1089},[1072,1406,1408,1410,1412,1414,1416,1418,1420,1422],{"class":1074,"line":1407},24,[1072,1409,1118],{"class":1099},[1072,1411,1121],{"class":1103},[1072,1413,1107],{"class":1099},[1072,1415,1110],{"class":1089},[1072,1417,1128],{"class":1099},[1072,1419,1131],{"class":1103},[1072,1421,1107],{"class":1099},[1072,1423,1136],{"class":1089},[1072,1425,1427,1429,1431,1433,1435,1437,1439,1441],{"class":1074,"line":1426},25,[1072,1428,1118],{"class":1099},[1072,1430,1144],{"class":1103},[1072,1432,1107],{"class":1099},[1072,1434,1110],{"class":1089},[1072,1436,1128],{"class":1099},[1072,1438,1153],{"class":1103},[1072,1440,1107],{"class":1099},[1072,1442,1136],{"class":1089},[1072,1444,1446,1448,1450,1452,1454],{"class":1074,"line":1445},26,[1072,1447,1118],{"class":1099},[1072,1449,1165],{"class":1103},[1072,1451,1107],{"class":1099},[1072,1453,1110],{"class":1089},[1072,1455,1093],{"class":1089},[1072,1457,1459,1461,1463,1465,1467,1469,1471,1473],{"class":1074,"line":1458},27,[1072,1460,1177],{"class":1099},[1072,1462,1180],{"class":1103},[1072,1464,1107],{"class":1099},[1072,1466,1110],{"class":1089},[1072,1468,1128],{"class":1099},[1072,1470,1189],{"class":1103},[1072,1472,1107],{"class":1099},[1072,1474,1136],{"class":1089},[1072,1476,1478],{"class":1074,"line":1477},28,[1072,1479,1298],{"class":1089},[1072,1481,1483,1485,1487,1489,1491,1493],{"class":1074,"line":1482},29,[1072,1484,1118],{"class":1099},[1072,1486,1344],{"class":1103},[1072,1488,1107],{"class":1099},[1072,1490,1110],{"class":1089},[1072,1492,1351],{"class":1223},[1072,1494,1136],{"class":1089},[1072,1496,1498],{"class":1074,"line":1497},30,[1072,1499,1500],{"class":1089},"    },\n",[1072,1502,1504,1506,1509,1511,1513],{"class":1074,"line":1503},31,[1072,1505,1100],{"class":1099},[1072,1507,1508],{"class":1103},"sessions",[1072,1510,1107],{"class":1099},[1072,1512,1110],{"class":1089},[1072,1514,1093],{"class":1089},[1072,1516,1518,1520,1522,1524,1526,1528,1530,1532],{"class":1074,"line":1517},32,[1072,1519,1118],{"class":1099},[1072,1521,1121],{"class":1103},[1072,1523,1107],{"class":1099},[1072,1525,1110],{"class":1089},[1072,1527,1128],{"class":1099},[1072,1529,1131],{"class":1103},[1072,1531,1107],{"class":1099},[1072,1533,1136],{"class":1089},[1072,1535,1537,1539,1541,1543,1545,1547,1550,1552],{"class":1074,"line":1536},33,[1072,1538,1118],{"class":1099},[1072,1540,1144],{"class":1103},[1072,1542,1107],{"class":1099},[1072,1544,1110],{"class":1089},[1072,1546,1128],{"class":1099},[1072,1548,1549],{"class":1103},"redis://127.0.0.1:6379/2",[1072,1551,1107],{"class":1099},[1072,1553,1136],{"class":1089},[1072,1555,1557,1559,1561,1563,1565],{"class":1074,"line":1556},34,[1072,1558,1118],{"class":1099},[1072,1560,1165],{"class":1103},[1072,1562,1107],{"class":1099},[1072,1564,1110],{"class":1089},[1072,1566,1093],{"class":1089},[1072,1568,1570,1572,1574,1576,1578,1580,1582,1584],{"class":1074,"line":1569},35,[1072,1571,1177],{"class":1099},[1072,1573,1180],{"class":1103},[1072,1575,1107],{"class":1099},[1072,1577,1110],{"class":1089},[1072,1579,1128],{"class":1099},[1072,1581,1189],{"class":1103},[1072,1583,1107],{"class":1099},[1072,1585,1136],{"class":1089},[1072,1587,1589],{"class":1074,"line":1588},36,[1072,1590,1298],{"class":1089},[1072,1592,1594,1596,1598,1600,1602,1605,1607],{"class":1074,"line":1593},37,[1072,1595,1118],{"class":1099},[1072,1597,1344],{"class":1103},[1072,1599,1107],{"class":1099},[1072,1601,1110],{"class":1089},[1072,1603,1604],{"class":1223}," 86400",[1072,1606,1354],{"class":1089},[1072,1608,1609],{"class":1078},"  # 24 hours for sessions\n",[1072,1611,1613],{"class":1074,"line":1612},38,[1072,1614,1500],{"class":1089},[1072,1616,1618,1620,1623,1625,1627],{"class":1074,"line":1617},39,[1072,1619,1100],{"class":1099},[1072,1621,1622],{"class":1103},"long_term",[1072,1624,1107],{"class":1099},[1072,1626,1110],{"class":1089},[1072,1628,1093],{"class":1089},[1072,1630,1632,1634,1636,1638,1640,1642,1644,1646],{"class":1074,"line":1631},40,[1072,1633,1118],{"class":1099},[1072,1635,1121],{"class":1103},[1072,1637,1107],{"class":1099},[1072,1639,1110],{"class":1089},[1072,1641,1128],{"class":1099},[1072,1643,1131],{"class":1103},[1072,1645,1107],{"class":1099},[1072,1647,1136],{"class":1089},[1072,1649,1651,1653,1655,1657,1659,1661,1664,1666],{"class":1074,"line":1650},41,[1072,1652,1118],{"class":1099},[1072,1654,1144],{"class":1103},[1072,1656,1107],{"class":1099},[1072,1658,1110],{"class":1089},[1072,1660,1128],{"class":1099},[1072,1662,1663],{"class":1103},"redis://127.0.0.1:6379/3",[1072,1665,1107],{"class":1099},[1072,1667,1136],{"class":1089},[1072,1669,1671,1673,1675,1677,1679],{"class":1074,"line":1670},42,[1072,1672,1118],{"class":1099},[1072,1674,1165],{"class":1103},[1072,1676,1107],{"class":1099},[1072,1678,1110],{"class":1089},[1072,1680,1093],{"class":1089},[1072,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":1074,"line":1683},43,[1072,1685,1177],{"class":1099},[1072,1687,1180],{"class":1103},[1072,1689,1107],{"class":1099},[1072,1691,1110],{"class":1089},[1072,1693,1128],{"class":1099},[1072,1695,1189],{"class":1103},[1072,1697,1107],{"class":1099},[1072,1699,1136],{"class":1089},[1072,1701,1703],{"class":1074,"line":1702},44,[1072,1704,1298],{"class":1089},[1072,1706,1708,1710,1712,1714,1716,1718,1722,1725,1727],{"class":1074,"line":1707},45,[1072,1709,1118],{"class":1099},[1072,1711,1344],{"class":1103},[1072,1713,1107],{"class":1099},[1072,1715,1110],{"class":1089},[1072,1717,1604],{"class":1223},[1072,1719,1721],{"class":1720},"sVsLi"," *",[1072,1723,1724],{"class":1223}," 7",[1072,1726,1354],{"class":1089},[1072,1728,1729],{"class":1078},"  # 1 week for long-term data\n",[1072,1731,1733],{"class":1074,"line":1732},46,[1072,1734,1363],{"class":1089},[1072,1736,1738],{"class":1074,"line":1737},47,[1072,1739,1369],{"class":1089},[1072,1741,1743],{"class":1074,"line":1742},48,[1072,1744,1376],{"emptyLinePlaceholder":1375},[1072,1746,1748],{"class":1074,"line":1747},49,[1072,1749,1750],{"class":1078},"# Session configuration\n",[1072,1752,1754,1757,1759,1761,1764],{"class":1074,"line":1753},50,[1072,1755,1756],{"class":1085},"SESSION_ENGINE",[1072,1758,1090],{"class":1089},[1072,1760,1128],{"class":1099},[1072,1762,1763],{"class":1103},"django.contrib.sessions.backends.cache",[1072,1765,1766],{"class":1099},"'\n",[1072,1768,1770,1773,1775,1777,1779],{"class":1074,"line":1769},51,[1072,1771,1772],{"class":1085},"SESSION_CACHE_ALIAS",[1072,1774,1090],{"class":1089},[1072,1776,1128],{"class":1099},[1072,1778,1508],{"class":1103},[1072,1780,1766],{"class":1099},[1038,1782,1784],{"id":1783},"memcached-configuration","Memcached Configuration",[1043,1786,1788],{"className":1066,"code":1787,"language":1068,"meta":1052,"style":1052},"# settings.py - Memcached with python-memcached\nCACHES = {\n    'default': {\n        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',\n        'LOCATION': [\n            '127.0.0.1:11211',\n            '127.0.0.1:11212',  # Multiple servers for redundancy\n        ],\n        'OPTIONS': {\n            'MAX_ENTRIES': 1000,\n            'CULL_FREQUENCY': 3,\n        }\n    }\n}\n",[1050,1789,1790,1795,1803,1815,1834,1847,1858,1872,1877,1889,1905,1921,1926,1930],{"__ignoreMap":1052},[1072,1791,1792],{"class":1074,"line":1075},[1072,1793,1794],{"class":1078},"# settings.py - Memcached with python-memcached\n",[1072,1796,1797,1799,1801],{"class":1074,"line":1082},[1072,1798,1086],{"class":1085},[1072,1800,1090],{"class":1089},[1072,1802,1093],{"class":1089},[1072,1804,1805,1807,1809,1811,1813],{"class":1074,"line":1096},[1072,1806,1100],{"class":1099},[1072,1808,1104],{"class":1103},[1072,1810,1107],{"class":1099},[1072,1812,1110],{"class":1089},[1072,1814,1093],{"class":1089},[1072,1816,1817,1819,1821,1823,1825,1827,1830,1832],{"class":1074,"line":1115},[1072,1818,1118],{"class":1099},[1072,1820,1121],{"class":1103},[1072,1822,1107],{"class":1099},[1072,1824,1110],{"class":1089},[1072,1826,1128],{"class":1099},[1072,1828,1829],{"class":1103},"django.core.cache.backends.memcached.PyMemcacheCache",[1072,1831,1107],{"class":1099},[1072,1833,1136],{"class":1089},[1072,1835,1836,1838,1840,1842,1844],{"class":1074,"line":1139},[1072,1837,1118],{"class":1099},[1072,1839,1144],{"class":1103},[1072,1841,1107],{"class":1099},[1072,1843,1110],{"class":1089},[1072,1845,1846],{"class":1089}," [\n",[1072,1848,1849,1851,1854,1856],{"class":1074,"line":1160},[1072,1850,1177],{"class":1099},[1072,1852,1853],{"class":1103},"127.0.0.1:11211",[1072,1855,1107],{"class":1099},[1072,1857,1136],{"class":1089},[1072,1859,1860,1862,1865,1867,1869],{"class":1074,"line":1174},[1072,1861,1177],{"class":1099},[1072,1863,1864],{"class":1103},"127.0.0.1:11212",[1072,1866,1107],{"class":1099},[1072,1868,1354],{"class":1089},[1072,1870,1871],{"class":1078},"  # Multiple servers for redundancy\n",[1072,1873,1874],{"class":1074,"line":1196},[1072,1875,1876],{"class":1089},"        ],\n",[1072,1878,1879,1881,1883,1885,1887],{"class":1074,"line":1210},[1072,1880,1118],{"class":1099},[1072,1882,1165],{"class":1103},[1072,1884,1107],{"class":1099},[1072,1886,1110],{"class":1089},[1072,1888,1093],{"class":1089},[1072,1890,1891,1893,1896,1898,1900,1903],{"class":1074,"line":1229},[1072,1892,1177],{"class":1099},[1072,1894,1895],{"class":1103},"MAX_ENTRIES",[1072,1897,1107],{"class":1099},[1072,1899,1110],{"class":1089},[1072,1901,1902],{"class":1223}," 1000",[1072,1904,1136],{"class":1089},[1072,1906,1907,1909,1912,1914,1916,1919],{"class":1074,"line":1247},[1072,1908,1177],{"class":1099},[1072,1910,1911],{"class":1103},"CULL_FREQUENCY",[1072,1913,1107],{"class":1099},[1072,1915,1110],{"class":1089},[1072,1917,1918],{"class":1223}," 3",[1072,1920,1136],{"class":1089},[1072,1922,1923],{"class":1074,"line":1253},[1072,1924,1925],{"class":1089},"        }\n",[1072,1927,1928],{"class":1074,"line":1274},[1072,1929,1363],{"class":1089},[1072,1931,1932],{"class":1074,"line":1295},[1072,1933,1369],{"class":1089},[1030,1935,1937],{"id":1936},"low-level-cache-api-strategies","Low-Level Cache API Strategies",[1038,1939,1941],{"id":1940},"basic-caching-patterns","Basic Caching Patterns",[1043,1943,1945],{"className":1066,"code":1944,"language":1068,"meta":1052,"style":1052},"from django.core.cache import cache\nfrom django.core.cache.utils import make_template_fragment_key\nimport hashlib\nimport json\n\nclass CacheManager:\n    \"\"\"Centralized cache management with consistent patterns\"\"\"\n    \n    @staticmethod\n    def get_cache_key(prefix, *args, **kwargs):\n        \"\"\"Generate consistent cache keys\"\"\"\n        key_data = f\"{prefix}:{':'.join(map(str, args))}\"\n        if kwargs:\n            key_data += f\":{hashlib.md5(json.dumps(kwargs, sort_keys=True).encode()).hexdigest()}\"\n        return key_data\n    \n    @staticmethod\n    def cache_result(timeout=300):\n        \"\"\"Decorator for caching function results\"\"\"\n        def decorator(func):\n            def wrapper(*args, **kwargs):\n                # Generate cache key from function name and arguments\n                cache_key = CacheManager.get_cache_key(\n                    f\"func_{func.__name__}\", *args, **kwargs\n                )\n                \n                # Try to get from cache\n                result = cache.get(cache_key)\n                if result is not None:\n                    return result\n                \n                # Execute function and cache result\n                result = func(*args, **kwargs)\n                cache.set(cache_key, result, timeout)\n                return result\n            \n            return wrapper\n        return decorator\n\n# Usage examples\n@CacheManager.cache_result(timeout=600)  # 10 minutes\ndef get_popular_products(category_id, limit=10):\n    \"\"\"Get popular products with caching\"\"\"\n    return Product.objects.filter(\n        category_id=category_id,\n        is_active=True\n    ).annotate(\n        popularity_score=Count('orders')\n    ).order_by('-popularity_score')[:limit]\n\n@CacheManager.cache_result(timeout=3600)  # 1 hour\ndef calculate_user_statistics(user_id):\n    \"\"\"Calculate expensive user statistics\"\"\"\n    user = User.objects.get(id=user_id)\n    \n    stats = {\n        'total_orders': user.orders.count(),\n        'total_spent': user.orders.aggregate(\n            total=Sum('total_amount')\n        )['total'] or 0,\n        'favorite_category': user.orders.values(\n            'items__product__category__name'\n        ).annotate(\n            count=Count('id')\n        ).order_by('-count').first(),\n        'last_order_date': user.orders.order_by('-created_at').first().created_at\n    }\n    \n    return stats\n",[1050,1946,1947,1974,1999,2006,2013,2017,2030,2043,2048,2057,2091,2101,2164,2174,2241,2249,2253,2259,2278,2287,2302,2325,2330,2347,2382,2387,2392,2397,2420,2439,2447,2451,2456,2479,2505,2512,2517,2525,2532,2536,2541,2569,2594,2603,2624,2635,2645,2655,2676,2701,2705,2729,2744,2754,2784,2789,2799,2826,2851,2873,2897,2922,2932,2942,2962,2985,3026,3031,3036],{"__ignoreMap":1052},[1072,1948,1949,1953,1957,1960,1963,1965,1968,1971],{"class":1074,"line":1075},[1072,1950,1952],{"class":1951},"siDh9","from",[1072,1954,1956],{"class":1955},"sftqT"," django",[1072,1958,1959],{"class":1089},".",[1072,1961,1962],{"class":1955},"core",[1072,1964,1959],{"class":1089},[1072,1966,1967],{"class":1955},"cache ",[1072,1969,1970],{"class":1951},"import",[1072,1972,1973],{"class":1955}," cache\n",[1072,1975,1976,1978,1980,1982,1984,1986,1989,1991,1994,1996],{"class":1074,"line":1082},[1072,1977,1952],{"class":1951},[1072,1979,1956],{"class":1955},[1072,1981,1959],{"class":1089},[1072,1983,1962],{"class":1955},[1072,1985,1959],{"class":1089},[1072,1987,1988],{"class":1955},"cache",[1072,1990,1959],{"class":1089},[1072,1992,1993],{"class":1955},"utils ",[1072,1995,1970],{"class":1951},[1072,1997,1998],{"class":1955}," make_template_fragment_key\n",[1072,2000,2001,2003],{"class":1074,"line":1096},[1072,2002,1970],{"class":1951},[1072,2004,2005],{"class":1955}," hashlib\n",[1072,2007,2008,2010],{"class":1074,"line":1115},[1072,2009,1970],{"class":1951},[1072,2011,2012],{"class":1955}," json\n",[1072,2014,2015],{"class":1074,"line":1139},[1072,2016,1376],{"emptyLinePlaceholder":1375},[1072,2018,2019,2023,2027],{"class":1074,"line":1160},[1072,2020,2022],{"class":2021},"s5Kfy","class",[1072,2024,2026],{"class":2025},"sD-vU"," CacheManager",[1072,2028,2029],{"class":1089},":\n",[1072,2031,2032,2036,2040],{"class":1074,"line":1174},[1072,2033,2035],{"class":2034},"sm7ve","    \"\"\"",[1072,2037,2039],{"class":2038},"sVyVU","Centralized cache management with consistent patterns",[1072,2041,2042],{"class":2034},"\"\"\"\n",[1072,2044,2045],{"class":1074,"line":1196},[1072,2046,2047],{"class":1955},"    \n",[1072,2049,2050,2053],{"class":1074,"line":1210},[1072,2051,2052],{"class":1089},"    @",[1072,2054,2056],{"class":2055},"sa2tF","staticmethod\n",[1072,2058,2059,2062,2066,2069,2073,2075,2077,2080,2082,2085,2088],{"class":1074,"line":1229},[1072,2060,2061],{"class":2021},"    def",[1072,2063,2065],{"class":2064},"sljsM"," get_cache_key",[1072,2067,2068],{"class":1089},"(",[1072,2070,2072],{"class":2071},"sCyAa","prefix",[1072,2074,1354],{"class":1089},[1072,2076,1721],{"class":1720},[1072,2078,2079],{"class":2071},"args",[1072,2081,1354],{"class":1089},[1072,2083,2084],{"class":1720}," **",[1072,2086,2087],{"class":2071},"kwargs",[1072,2089,2090],{"class":1089},"):\n",[1072,2092,2093,2096,2099],{"class":1074,"line":1247},[1072,2094,2095],{"class":2034},"        \"\"\"",[1072,2097,2098],{"class":2038},"Generate consistent cache keys",[1072,2100,2042],{"class":2034},[1072,2102,2103,2106,2109,2112,2115,2119,2121,2124,2126,2128,2130,2132,2134,2136,2140,2142,2146,2148,2151,2153,2156,2159,2161],{"class":1074,"line":1253},[1072,2104,2105],{"class":1955},"        key_data ",[1072,2107,2108],{"class":1089},"=",[1072,2110,2111],{"class":2021}," f",[1072,2113,2114],{"class":1103},"\"",[1072,2116,2118],{"class":2117},"s3h35","{",[1072,2120,2072],{"class":1955},[1072,2122,2123],{"class":2117},"}",[1072,2125,1110],{"class":1103},[1072,2127,2118],{"class":2117},[1072,2129,1107],{"class":1099},[1072,2131,1110],{"class":1103},[1072,2133,1107],{"class":1099},[1072,2135,1959],{"class":1089},[1072,2137,2139],{"class":2138},"siWMO","join",[1072,2141,2068],{"class":1089},[1072,2143,2145],{"class":2144},"sJdAF","map",[1072,2147,2068],{"class":1089},[1072,2149,2150],{"class":2055},"str",[1072,2152,1354],{"class":1089},[1072,2154,2155],{"class":2138}," args",[1072,2157,2158],{"class":1089},"))",[1072,2160,2123],{"class":2117},[1072,2162,2163],{"class":1103},"\"\n",[1072,2165,2166,2169,2172],{"class":1074,"line":1274},[1072,2167,2168],{"class":1951},"        if",[1072,2170,2171],{"class":1955}," kwargs",[1072,2173,2029],{"class":1089},[1072,2175,2176,2179,2182,2184,2187,2189,2192,2194,2197,2199,2202,2204,2207,2209,2211,2213,2217,2219,2222,2225,2228,2231,2234,2237,2239],{"class":1074,"line":1295},[1072,2177,2178],{"class":1955},"            key_data ",[1072,2180,2181],{"class":1089},"+=",[1072,2183,2111],{"class":2021},[1072,2185,2186],{"class":1103},"\":",[1072,2188,2118],{"class":2117},[1072,2190,2191],{"class":1955},"hashlib",[1072,2193,1959],{"class":1089},[1072,2195,2196],{"class":2138},"md5",[1072,2198,2068],{"class":1089},[1072,2200,2201],{"class":2138},"json",[1072,2203,1959],{"class":1089},[1072,2205,2206],{"class":2138},"dumps",[1072,2208,2068],{"class":1089},[1072,2210,2087],{"class":2138},[1072,2212,1354],{"class":1089},[1072,2214,2216],{"class":2215},"sqOPj"," sort_keys",[1072,2218,2108],{"class":1089},[1072,2220,2221],{"class":1241},"True",[1072,2223,2224],{"class":1089},").",[1072,2226,2227],{"class":2138},"encode",[1072,2229,2230],{"class":1089},"()).",[1072,2232,2233],{"class":2138},"hexdigest",[1072,2235,2236],{"class":1089},"()",[1072,2238,2123],{"class":2117},[1072,2240,2163],{"class":1103},[1072,2242,2243,2246],{"class":1074,"line":1301},[1072,2244,2245],{"class":1951},"        return",[1072,2247,2248],{"class":1955}," key_data\n",[1072,2250,2251],{"class":1074,"line":1322},[1072,2252,2047],{"class":1955},[1072,2254,2255,2257],{"class":1074,"line":1339},[1072,2256,2052],{"class":1089},[1072,2258,2056],{"class":2055},[1072,2260,2261,2263,2266,2268,2271,2273,2276],{"class":1074,"line":1360},[1072,2262,2061],{"class":2021},[1072,2264,2265],{"class":2064}," cache_result",[1072,2267,2068],{"class":1089},[1072,2269,2270],{"class":2071},"timeout",[1072,2272,2108],{"class":1720},[1072,2274,2275],{"class":1223},"300",[1072,2277,2090],{"class":1089},[1072,2279,2280,2282,2285],{"class":1074,"line":1366},[1072,2281,2095],{"class":2034},[1072,2283,2284],{"class":2038},"Decorator for caching function results",[1072,2286,2042],{"class":2034},[1072,2288,2289,2292,2295,2297,2300],{"class":1074,"line":1372},[1072,2290,2291],{"class":2021},"        def",[1072,2293,2294],{"class":2064}," decorator",[1072,2296,2068],{"class":1089},[1072,2298,2299],{"class":2071},"func",[1072,2301,2090],{"class":1089},[1072,2303,2304,2307,2310,2312,2315,2317,2319,2321,2323],{"class":1074,"line":1379},[1072,2305,2306],{"class":2021},"            def",[1072,2308,2309],{"class":2064}," wrapper",[1072,2311,2068],{"class":1089},[1072,2313,2314],{"class":1720},"*",[1072,2316,2079],{"class":2071},[1072,2318,1354],{"class":1089},[1072,2320,2084],{"class":1720},[1072,2322,2087],{"class":2071},[1072,2324,2090],{"class":1089},[1072,2326,2327],{"class":1074,"line":1385},[1072,2328,2329],{"class":1078},"                # Generate cache key from function name and arguments\n",[1072,2331,2332,2335,2337,2339,2341,2344],{"class":1074,"line":1394},[1072,2333,2334],{"class":1955},"                cache_key ",[1072,2336,2108],{"class":1089},[1072,2338,2026],{"class":1955},[1072,2340,1959],{"class":1089},[1072,2342,2343],{"class":2138},"get_cache_key",[1072,2345,2346],{"class":1089},"(\n",[1072,2348,2349,2352,2355,2357,2359,2361,2365,2367,2369,2371,2373,2375,2377,2379],{"class":1074,"line":1407},[1072,2350,2351],{"class":2021},"                    f",[1072,2353,2354],{"class":1103},"\"func_",[1072,2356,2118],{"class":2117},[1072,2358,2299],{"class":2138},[1072,2360,1959],{"class":1089},[1072,2362,2364],{"class":2363},"s131V","__name__",[1072,2366,2123],{"class":2117},[1072,2368,2114],{"class":1103},[1072,2370,1354],{"class":1089},[1072,2372,1721],{"class":1720},[1072,2374,2079],{"class":2138},[1072,2376,1354],{"class":1089},[1072,2378,2084],{"class":1720},[1072,2380,2381],{"class":2138},"kwargs\n",[1072,2383,2384],{"class":1074,"line":1426},[1072,2385,2386],{"class":1089},"                )\n",[1072,2388,2389],{"class":1074,"line":1445},[1072,2390,2391],{"class":1955},"                \n",[1072,2393,2394],{"class":1074,"line":1458},[1072,2395,2396],{"class":1078},"                # Try to get from cache\n",[1072,2398,2399,2402,2404,2407,2409,2412,2414,2417],{"class":1074,"line":1477},[1072,2400,2401],{"class":1955},"                result ",[1072,2403,2108],{"class":1089},[1072,2405,2406],{"class":1955}," cache",[1072,2408,1959],{"class":1089},[1072,2410,2411],{"class":2138},"get",[1072,2413,2068],{"class":1089},[1072,2415,2416],{"class":2138},"cache_key",[1072,2418,2419],{"class":1089},")\n",[1072,2421,2422,2425,2428,2431,2434,2437],{"class":1074,"line":1482},[1072,2423,2424],{"class":1951},"                if",[1072,2426,2427],{"class":1955}," result ",[1072,2429,2430],{"class":1720},"is",[1072,2432,2433],{"class":1720}," not",[1072,2435,2436],{"class":1241}," None",[1072,2438,2029],{"class":1089},[1072,2440,2441,2444],{"class":1074,"line":1497},[1072,2442,2443],{"class":1951},"                    return",[1072,2445,2446],{"class":1955}," result\n",[1072,2448,2449],{"class":1074,"line":1503},[1072,2450,2391],{"class":1955},[1072,2452,2453],{"class":1074,"line":1517},[1072,2454,2455],{"class":1078},"                # Execute function and cache result\n",[1072,2457,2458,2460,2462,2465,2467,2469,2471,2473,2475,2477],{"class":1074,"line":1536},[1072,2459,2401],{"class":1955},[1072,2461,2108],{"class":1089},[1072,2463,2464],{"class":2138}," func",[1072,2466,2068],{"class":1089},[1072,2468,2314],{"class":1720},[1072,2470,2079],{"class":2138},[1072,2472,1354],{"class":1089},[1072,2474,2084],{"class":1720},[1072,2476,2087],{"class":2138},[1072,2478,2419],{"class":1089},[1072,2480,2481,2484,2486,2489,2491,2493,2495,2498,2500,2503],{"class":1074,"line":1556},[1072,2482,2483],{"class":1955},"                cache",[1072,2485,1959],{"class":1089},[1072,2487,2488],{"class":2138},"set",[1072,2490,2068],{"class":1089},[1072,2492,2416],{"class":2138},[1072,2494,1354],{"class":1089},[1072,2496,2497],{"class":2138}," result",[1072,2499,1354],{"class":1089},[1072,2501,2502],{"class":2138}," timeout",[1072,2504,2419],{"class":1089},[1072,2506,2507,2510],{"class":1074,"line":1569},[1072,2508,2509],{"class":1951},"                return",[1072,2511,2446],{"class":1955},[1072,2513,2514],{"class":1074,"line":1588},[1072,2515,2516],{"class":1955},"            \n",[1072,2518,2519,2522],{"class":1074,"line":1593},[1072,2520,2521],{"class":1951},"            return",[1072,2523,2524],{"class":1955}," wrapper\n",[1072,2526,2527,2529],{"class":1074,"line":1612},[1072,2528,2245],{"class":1951},[1072,2530,2531],{"class":1955}," decorator\n",[1072,2533,2534],{"class":1074,"line":1617},[1072,2535,1376],{"emptyLinePlaceholder":1375},[1072,2537,2538],{"class":1074,"line":1631},[1072,2539,2540],{"class":1078},"# Usage examples\n",[1072,2542,2543,2546,2549,2551,2554,2556,2558,2560,2563,2566],{"class":1074,"line":1650},[1072,2544,2545],{"class":1089},"@",[1072,2547,2548],{"class":2064},"CacheManager",[1072,2550,1959],{"class":1089},[1072,2552,2553],{"class":2064},"cache_result",[1072,2555,2068],{"class":1089},[1072,2557,2270],{"class":2215},[1072,2559,2108],{"class":1089},[1072,2561,2562],{"class":1223},"600",[1072,2564,2565],{"class":1089},")",[1072,2567,2568],{"class":1078},"  # 10 minutes\n",[1072,2570,2571,2574,2577,2579,2582,2584,2587,2589,2592],{"class":1074,"line":1670},[1072,2572,2573],{"class":2021},"def",[1072,2575,2576],{"class":2064}," get_popular_products",[1072,2578,2068],{"class":1089},[1072,2580,2581],{"class":2071},"category_id",[1072,2583,1354],{"class":1089},[1072,2585,2586],{"class":2071}," limit",[1072,2588,2108],{"class":1720},[1072,2590,2591],{"class":1223},"10",[1072,2593,2090],{"class":1089},[1072,2595,2596,2598,2601],{"class":1074,"line":1683},[1072,2597,2035],{"class":2034},[1072,2599,2600],{"class":2038},"Get popular products with caching",[1072,2602,2042],{"class":2034},[1072,2604,2605,2608,2611,2613,2617,2619,2622],{"class":1074,"line":1702},[1072,2606,2607],{"class":1951},"    return",[1072,2609,2610],{"class":1955}," Product",[1072,2612,1959],{"class":1089},[1072,2614,2616],{"class":2615},"sBPpx","objects",[1072,2618,1959],{"class":1089},[1072,2620,2621],{"class":2138},"filter",[1072,2623,2346],{"class":1089},[1072,2625,2626,2629,2631,2633],{"class":1074,"line":1707},[1072,2627,2628],{"class":2215},"        category_id",[1072,2630,2108],{"class":1089},[1072,2632,2581],{"class":2138},[1072,2634,1136],{"class":1089},[1072,2636,2637,2640,2642],{"class":1074,"line":1732},[1072,2638,2639],{"class":2215},"        is_active",[1072,2641,2108],{"class":1089},[1072,2643,2644],{"class":1241},"True\n",[1072,2646,2647,2650,2653],{"class":1074,"line":1737},[1072,2648,2649],{"class":1089},"    ).",[1072,2651,2652],{"class":2138},"annotate",[1072,2654,2346],{"class":1089},[1072,2656,2657,2660,2662,2665,2667,2669,2672,2674],{"class":1074,"line":1742},[1072,2658,2659],{"class":2215},"        popularity_score",[1072,2661,2108],{"class":1089},[1072,2663,2664],{"class":2138},"Count",[1072,2666,2068],{"class":1089},[1072,2668,1107],{"class":1099},[1072,2670,2671],{"class":1103},"orders",[1072,2673,1107],{"class":1099},[1072,2675,2419],{"class":1089},[1072,2677,2678,2680,2683,2685,2687,2690,2692,2695,2698],{"class":1074,"line":1747},[1072,2679,2649],{"class":1089},[1072,2681,2682],{"class":2138},"order_by",[1072,2684,2068],{"class":1089},[1072,2686,1107],{"class":1099},[1072,2688,2689],{"class":1103},"-popularity_score",[1072,2691,1107],{"class":1099},[1072,2693,2694],{"class":1089},")[:",[1072,2696,2697],{"class":1955},"limit",[1072,2699,2700],{"class":1089},"]\n",[1072,2702,2703],{"class":1074,"line":1753},[1072,2704,1376],{"emptyLinePlaceholder":1375},[1072,2706,2707,2709,2711,2713,2715,2717,2719,2721,2724,2726],{"class":1074,"line":1769},[1072,2708,2545],{"class":1089},[1072,2710,2548],{"class":2064},[1072,2712,1959],{"class":1089},[1072,2714,2553],{"class":2064},[1072,2716,2068],{"class":1089},[1072,2718,2270],{"class":2215},[1072,2720,2108],{"class":1089},[1072,2722,2723],{"class":1223},"3600",[1072,2725,2565],{"class":1089},[1072,2727,2728],{"class":1078},"  # 1 hour\n",[1072,2730,2732,2734,2737,2739,2742],{"class":1074,"line":2731},52,[1072,2733,2573],{"class":2021},[1072,2735,2736],{"class":2064}," calculate_user_statistics",[1072,2738,2068],{"class":1089},[1072,2740,2741],{"class":2071},"user_id",[1072,2743,2090],{"class":1089},[1072,2745,2747,2749,2752],{"class":1074,"line":2746},53,[1072,2748,2035],{"class":2034},[1072,2750,2751],{"class":2038},"Calculate expensive user statistics",[1072,2753,2042],{"class":2034},[1072,2755,2757,2760,2762,2765,2767,2769,2771,2773,2775,2778,2780,2782],{"class":1074,"line":2756},54,[1072,2758,2759],{"class":1955},"    user ",[1072,2761,2108],{"class":1089},[1072,2763,2764],{"class":1955}," User",[1072,2766,1959],{"class":1089},[1072,2768,2616],{"class":2615},[1072,2770,1959],{"class":1089},[1072,2772,2411],{"class":2138},[1072,2774,2068],{"class":1089},[1072,2776,2777],{"class":2215},"id",[1072,2779,2108],{"class":1089},[1072,2781,2741],{"class":2138},[1072,2783,2419],{"class":1089},[1072,2785,2787],{"class":1074,"line":2786},55,[1072,2788,2047],{"class":1955},[1072,2790,2792,2795,2797],{"class":1074,"line":2791},56,[1072,2793,2794],{"class":1955},"    stats ",[1072,2796,2108],{"class":1089},[1072,2798,1093],{"class":1089},[1072,2800,2802,2804,2807,2809,2811,2814,2816,2818,2820,2823],{"class":1074,"line":2801},57,[1072,2803,1118],{"class":1099},[1072,2805,2806],{"class":1103},"total_orders",[1072,2808,1107],{"class":1099},[1072,2810,1110],{"class":1089},[1072,2812,2813],{"class":1955}," user",[1072,2815,1959],{"class":1089},[1072,2817,2671],{"class":2615},[1072,2819,1959],{"class":1089},[1072,2821,2822],{"class":2138},"count",[1072,2824,2825],{"class":1089},"(),\n",[1072,2827,2829,2831,2834,2836,2838,2840,2842,2844,2846,2849],{"class":1074,"line":2828},58,[1072,2830,1118],{"class":1099},[1072,2832,2833],{"class":1103},"total_spent",[1072,2835,1107],{"class":1099},[1072,2837,1110],{"class":1089},[1072,2839,2813],{"class":1955},[1072,2841,1959],{"class":1089},[1072,2843,2671],{"class":2615},[1072,2845,1959],{"class":1089},[1072,2847,2848],{"class":2138},"aggregate",[1072,2850,2346],{"class":1089},[1072,2852,2854,2857,2859,2862,2864,2866,2869,2871],{"class":1074,"line":2853},59,[1072,2855,2856],{"class":2215},"            total",[1072,2858,2108],{"class":1089},[1072,2860,2861],{"class":2138},"Sum",[1072,2863,2068],{"class":1089},[1072,2865,1107],{"class":1099},[1072,2867,2868],{"class":1103},"total_amount",[1072,2870,1107],{"class":1099},[1072,2872,2419],{"class":1089},[1072,2874,2876,2879,2881,2884,2886,2889,2892,2895],{"class":1074,"line":2875},60,[1072,2877,2878],{"class":1089},"        )[",[1072,2880,1107],{"class":1099},[1072,2882,2883],{"class":1103},"total",[1072,2885,1107],{"class":1099},[1072,2887,2888],{"class":1089},"]",[1072,2890,2891],{"class":1720}," or",[1072,2893,2894],{"class":1223}," 0",[1072,2896,1136],{"class":1089},[1072,2898,2900,2902,2905,2907,2909,2911,2913,2915,2917,2920],{"class":1074,"line":2899},61,[1072,2901,1118],{"class":1099},[1072,2903,2904],{"class":1103},"favorite_category",[1072,2906,1107],{"class":1099},[1072,2908,1110],{"class":1089},[1072,2910,2813],{"class":1955},[1072,2912,1959],{"class":1089},[1072,2914,2671],{"class":2615},[1072,2916,1959],{"class":1089},[1072,2918,2919],{"class":2138},"values",[1072,2921,2346],{"class":1089},[1072,2923,2925,2927,2930],{"class":1074,"line":2924},62,[1072,2926,1177],{"class":1099},[1072,2928,2929],{"class":1103},"items__product__category__name",[1072,2931,1766],{"class":1099},[1072,2933,2935,2938,2940],{"class":1074,"line":2934},63,[1072,2936,2937],{"class":1089},"        ).",[1072,2939,2652],{"class":2138},[1072,2941,2346],{"class":1089},[1072,2943,2945,2948,2950,2952,2954,2956,2958,2960],{"class":1074,"line":2944},64,[1072,2946,2947],{"class":2215},"            count",[1072,2949,2108],{"class":1089},[1072,2951,2664],{"class":2138},[1072,2953,2068],{"class":1089},[1072,2955,1107],{"class":1099},[1072,2957,2777],{"class":1103},[1072,2959,1107],{"class":1099},[1072,2961,2419],{"class":1089},[1072,2963,2965,2967,2969,2971,2973,2976,2978,2980,2983],{"class":1074,"line":2964},65,[1072,2966,2937],{"class":1089},[1072,2968,2682],{"class":2138},[1072,2970,2068],{"class":1089},[1072,2972,1107],{"class":1099},[1072,2974,2975],{"class":1103},"-count",[1072,2977,1107],{"class":1099},[1072,2979,2224],{"class":1089},[1072,2981,2982],{"class":2138},"first",[1072,2984,2825],{"class":1089},[1072,2986,2988,2990,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3014,3016,3018,3020,3023],{"class":1074,"line":2987},66,[1072,2989,1118],{"class":1099},[1072,2991,2992],{"class":1103},"last_order_date",[1072,2994,1107],{"class":1099},[1072,2996,1110],{"class":1089},[1072,2998,2813],{"class":1955},[1072,3000,1959],{"class":1089},[1072,3002,2671],{"class":2615},[1072,3004,1959],{"class":1089},[1072,3006,2682],{"class":2138},[1072,3008,2068],{"class":1089},[1072,3010,1107],{"class":1099},[1072,3012,3013],{"class":1103},"-created_at",[1072,3015,1107],{"class":1099},[1072,3017,2224],{"class":1089},[1072,3019,2982],{"class":2138},[1072,3021,3022],{"class":1089},"().",[1072,3024,3025],{"class":2615},"created_at\n",[1072,3027,3029],{"class":1074,"line":3028},67,[1072,3030,1363],{"class":1089},[1072,3032,3034],{"class":1074,"line":3033},68,[1072,3035,2047],{"class":1955},[1072,3037,3039,3041],{"class":1074,"line":3038},69,[1072,3040,2607],{"class":1951},[1072,3042,3043],{"class":1955}," stats\n",[1038,3045,3047],{"id":3046},"advanced-caching-patterns","Advanced Caching Patterns",[1043,3049,3051],{"className":1066,"code":3050,"language":1068,"meta":1052,"style":1052},"from django.core.cache import caches\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\nimport time\n\nclass SmartCache:\n    \"\"\"Advanced caching with automatic invalidation\"\"\"\n    \n    def __init__(self, cache_alias='default'):\n        self.cache = caches[cache_alias]\n    \n    def get_or_set_with_lock(self, key, callable_func, timeout=300, lock_timeout=10):\n        \"\"\"Prevent cache stampede with distributed locking\"\"\"\n        lock_key = f\"lock:{key}\"\n        \n        # Try to get from cache first\n        result = self.cache.get(key)\n        if result is not None:\n            return result\n        \n        # Try to acquire lock\n        if self.cache.add(lock_key, \"locked\", lock_timeout):\n            try:\n                # Double-check cache after acquiring lock\n                result = self.cache.get(key)\n                if result is not None:\n                    return result\n                \n                # Execute function and cache result\n                result = callable_func()\n                self.cache.set(key, result, timeout)\n                return result\n            \n            finally:\n                # Always release lock\n                self.cache.delete(lock_key)\n        else:\n            # Wait for lock to be released and try again\n            time.sleep(0.1)\n            return self.get_or_set_with_lock(key, callable_func, timeout, lock_timeout)\n    \n    def invalidate_pattern(self, pattern):\n        \"\"\"Invalidate all keys matching a pattern (Redis only)\"\"\"\n        if hasattr(self.cache, 'delete_pattern'):\n            self.cache.delete_pattern(pattern)\n    \n    def get_many_with_fallback(self, keys, fallback_func):\n        \"\"\"Get multiple keys with fallback for missing ones\"\"\"\n        cached_results = self.cache.get_many(keys)\n        missing_keys = set(keys) - set(cached_results.keys())\n        \n        if missing_keys:\n            # Get missing data\n            missing_data = fallback_func(missing_keys)\n            \n            # Cache missing data\n            cache_data = {}\n            for key in missing_keys:\n                if key in missing_data:\n                    cache_data[key] = missing_data[key]\n            \n            if cache_data:\n                self.cache.set_many(cache_data, timeout=300)\n                cached_results.update(cache_data)\n        \n        return cached_results\n\n# Usage example\nsmart_cache = SmartCache()\n\ndef get_product_details(product_ids):\n    \"\"\"Get product details with smart caching\"\"\"\n    cache_keys = [f\"product:{pid}\" for pid in product_ids]\n    \n    def fetch_missing_products(missing_keys):\n        missing_ids = [key.split(':')[1] for key in missing_keys]\n        products = Product.objects.filter(id__in=missing_ids).select_related('category')\n        \n        result = {}\n        for product in products:\n            key = f\"product:{product.id}\"\n            result[key] = {\n                'id': product.id,\n                'name': product.name,\n                'price': str(product.price),\n                'category': product.category.name,\n            }\n        return result\n    \n    return smart_cache.get_many_with_fallback(cache_keys, fetch_missing_products)\n",[1050,3052,3053,3072,3103,3119,3126,3130,3139,3148,3152,3180,3202,3206,3246,3255,3276,3281,3286,3310,3324,3330,3334,3339,3375,3382,3387,3409,3423,3429,3433,3437,3448,3475,3481,3485,3492,3497,3516,3523,3528,3545,3574,3578,3596,3605,3631,3651,3655,3678,3687,3712,3745,3749,3758,3763,3779,3783,3788,3798,3813,3826,3847,3851,3861,3889,3905,3909,3916,3920,3925,3936,3941,3956,3966,4005,4010,4024,4067,4111,4116,4125,4141,4166,4182,4202,4222,4248,4271,4277,4284,4289],{"__ignoreMap":1052},[1072,3054,3055,3057,3059,3061,3063,3065,3067,3069],{"class":1074,"line":1075},[1072,3056,1952],{"class":1951},[1072,3058,1956],{"class":1955},[1072,3060,1959],{"class":1089},[1072,3062,1962],{"class":1955},[1072,3064,1959],{"class":1089},[1072,3066,1967],{"class":1955},[1072,3068,1970],{"class":1951},[1072,3070,3071],{"class":1955}," caches\n",[1072,3073,3074,3076,3078,3080,3083,3085,3088,3090,3093,3095,3098,3100],{"class":1074,"line":1082},[1072,3075,1952],{"class":1951},[1072,3077,1956],{"class":1955},[1072,3079,1959],{"class":1089},[1072,3081,3082],{"class":1955},"db",[1072,3084,1959],{"class":1089},[1072,3086,3087],{"class":1955},"models",[1072,3089,1959],{"class":1089},[1072,3091,3092],{"class":1955},"signals ",[1072,3094,1970],{"class":1951},[1072,3096,3097],{"class":1955}," post_save",[1072,3099,1354],{"class":1089},[1072,3101,3102],{"class":1955}," post_delete\n",[1072,3104,3105,3107,3109,3111,3114,3116],{"class":1074,"line":1096},[1072,3106,1952],{"class":1951},[1072,3108,1956],{"class":1955},[1072,3110,1959],{"class":1089},[1072,3112,3113],{"class":1955},"dispatch ",[1072,3115,1970],{"class":1951},[1072,3117,3118],{"class":1955}," receiver\n",[1072,3120,3121,3123],{"class":1074,"line":1115},[1072,3122,1970],{"class":1951},[1072,3124,3125],{"class":1955}," time\n",[1072,3127,3128],{"class":1074,"line":1139},[1072,3129,1376],{"emptyLinePlaceholder":1375},[1072,3131,3132,3134,3137],{"class":1074,"line":1160},[1072,3133,2022],{"class":2021},[1072,3135,3136],{"class":2025}," SmartCache",[1072,3138,2029],{"class":1089},[1072,3140,3141,3143,3146],{"class":1074,"line":1174},[1072,3142,2035],{"class":2034},[1072,3144,3145],{"class":2038},"Advanced caching with automatic invalidation",[1072,3147,2042],{"class":2034},[1072,3149,3150],{"class":1074,"line":1196},[1072,3151,2047],{"class":1955},[1072,3153,3154,3156,3159,3161,3165,3167,3170,3172,3174,3176,3178],{"class":1074,"line":1210},[1072,3155,2061],{"class":2021},[1072,3157,3158],{"class":2144}," __init__",[1072,3160,2068],{"class":1089},[1072,3162,3164],{"class":3163},"sRjD_","self",[1072,3166,1354],{"class":1089},[1072,3168,3169],{"class":2071}," cache_alias",[1072,3171,2108],{"class":1720},[1072,3173,1107],{"class":1099},[1072,3175,1104],{"class":1103},[1072,3177,1107],{"class":1099},[1072,3179,2090],{"class":1089},[1072,3181,3182,3185,3187,3189,3191,3194,3197,3200],{"class":1074,"line":1229},[1072,3183,3184],{"class":1085},"        self",[1072,3186,1959],{"class":1089},[1072,3188,1988],{"class":2615},[1072,3190,1090],{"class":1089},[1072,3192,3193],{"class":1955}," caches",[1072,3195,3196],{"class":1089},"[",[1072,3198,3199],{"class":1955},"cache_alias",[1072,3201,2700],{"class":1089},[1072,3203,3204],{"class":1074,"line":1247},[1072,3205,2047],{"class":1955},[1072,3207,3208,3210,3213,3215,3217,3219,3222,3224,3227,3229,3231,3233,3235,3237,3240,3242,3244],{"class":1074,"line":1253},[1072,3209,2061],{"class":2021},[1072,3211,3212],{"class":2064}," get_or_set_with_lock",[1072,3214,2068],{"class":1089},[1072,3216,3164],{"class":3163},[1072,3218,1354],{"class":1089},[1072,3220,3221],{"class":2071}," key",[1072,3223,1354],{"class":1089},[1072,3225,3226],{"class":2071}," callable_func",[1072,3228,1354],{"class":1089},[1072,3230,2502],{"class":2071},[1072,3232,2108],{"class":1720},[1072,3234,2275],{"class":1223},[1072,3236,1354],{"class":1089},[1072,3238,3239],{"class":2071}," lock_timeout",[1072,3241,2108],{"class":1720},[1072,3243,2591],{"class":1223},[1072,3245,2090],{"class":1089},[1072,3247,3248,3250,3253],{"class":1074,"line":1274},[1072,3249,2095],{"class":2034},[1072,3251,3252],{"class":2038},"Prevent cache stampede with distributed locking",[1072,3254,2042],{"class":2034},[1072,3256,3257,3260,3262,3264,3267,3269,3272,3274],{"class":1074,"line":1295},[1072,3258,3259],{"class":1955},"        lock_key ",[1072,3261,2108],{"class":1089},[1072,3263,2111],{"class":2021},[1072,3265,3266],{"class":1103},"\"lock:",[1072,3268,2118],{"class":2117},[1072,3270,3271],{"class":1955},"key",[1072,3273,2123],{"class":2117},[1072,3275,2163],{"class":1103},[1072,3277,3278],{"class":1074,"line":1301},[1072,3279,3280],{"class":1955},"        \n",[1072,3282,3283],{"class":1074,"line":1322},[1072,3284,3285],{"class":1078},"        # Try to get from cache first\n",[1072,3287,3288,3291,3293,3296,3298,3300,3302,3304,3306,3308],{"class":1074,"line":1339},[1072,3289,3290],{"class":1955},"        result ",[1072,3292,2108],{"class":1089},[1072,3294,3295],{"class":1085}," self",[1072,3297,1959],{"class":1089},[1072,3299,1988],{"class":2615},[1072,3301,1959],{"class":1089},[1072,3303,2411],{"class":2138},[1072,3305,2068],{"class":1089},[1072,3307,3271],{"class":2138},[1072,3309,2419],{"class":1089},[1072,3311,3312,3314,3316,3318,3320,3322],{"class":1074,"line":1360},[1072,3313,2168],{"class":1951},[1072,3315,2427],{"class":1955},[1072,3317,2430],{"class":1720},[1072,3319,2433],{"class":1720},[1072,3321,2436],{"class":1241},[1072,3323,2029],{"class":1089},[1072,3325,3326,3328],{"class":1074,"line":1366},[1072,3327,2521],{"class":1951},[1072,3329,2446],{"class":1955},[1072,3331,3332],{"class":1074,"line":1372},[1072,3333,3280],{"class":1955},[1072,3335,3336],{"class":1074,"line":1379},[1072,3337,3338],{"class":1078},"        # Try to acquire lock\n",[1072,3340,3341,3343,3345,3347,3349,3351,3354,3356,3359,3361,3364,3367,3369,3371,3373],{"class":1074,"line":1385},[1072,3342,2168],{"class":1951},[1072,3344,3295],{"class":1085},[1072,3346,1959],{"class":1089},[1072,3348,1988],{"class":2615},[1072,3350,1959],{"class":1089},[1072,3352,3353],{"class":2138},"add",[1072,3355,2068],{"class":1089},[1072,3357,3358],{"class":2138},"lock_key",[1072,3360,1354],{"class":1089},[1072,3362,3363],{"class":1099}," \"",[1072,3365,3366],{"class":1103},"locked",[1072,3368,2114],{"class":1099},[1072,3370,1354],{"class":1089},[1072,3372,3239],{"class":2138},[1072,3374,2090],{"class":1089},[1072,3376,3377,3380],{"class":1074,"line":1394},[1072,3378,3379],{"class":1951},"            try",[1072,3381,2029],{"class":1089},[1072,3383,3384],{"class":1074,"line":1407},[1072,3385,3386],{"class":1078},"                # Double-check cache after acquiring lock\n",[1072,3388,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407],{"class":1074,"line":1426},[1072,3390,2401],{"class":1955},[1072,3392,2108],{"class":1089},[1072,3394,3295],{"class":1085},[1072,3396,1959],{"class":1089},[1072,3398,1988],{"class":2615},[1072,3400,1959],{"class":1089},[1072,3402,2411],{"class":2138},[1072,3404,2068],{"class":1089},[1072,3406,3271],{"class":2138},[1072,3408,2419],{"class":1089},[1072,3410,3411,3413,3415,3417,3419,3421],{"class":1074,"line":1445},[1072,3412,2424],{"class":1951},[1072,3414,2427],{"class":1955},[1072,3416,2430],{"class":1720},[1072,3418,2433],{"class":1720},[1072,3420,2436],{"class":1241},[1072,3422,2029],{"class":1089},[1072,3424,3425,3427],{"class":1074,"line":1458},[1072,3426,2443],{"class":1951},[1072,3428,2446],{"class":1955},[1072,3430,3431],{"class":1074,"line":1477},[1072,3432,2391],{"class":1955},[1072,3434,3435],{"class":1074,"line":1482},[1072,3436,2455],{"class":1078},[1072,3438,3439,3441,3443,3445],{"class":1074,"line":1497},[1072,3440,2401],{"class":1955},[1072,3442,2108],{"class":1089},[1072,3444,3226],{"class":2138},[1072,3446,3447],{"class":1089},"()\n",[1072,3449,3450,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473],{"class":1074,"line":1503},[1072,3451,3452],{"class":1085},"                self",[1072,3454,1959],{"class":1089},[1072,3456,1988],{"class":2615},[1072,3458,1959],{"class":1089},[1072,3460,2488],{"class":2138},[1072,3462,2068],{"class":1089},[1072,3464,3271],{"class":2138},[1072,3466,1354],{"class":1089},[1072,3468,2497],{"class":2138},[1072,3470,1354],{"class":1089},[1072,3472,2502],{"class":2138},[1072,3474,2419],{"class":1089},[1072,3476,3477,3479],{"class":1074,"line":1517},[1072,3478,2509],{"class":1951},[1072,3480,2446],{"class":1955},[1072,3482,3483],{"class":1074,"line":1536},[1072,3484,2516],{"class":1955},[1072,3486,3487,3490],{"class":1074,"line":1556},[1072,3488,3489],{"class":1951},"            finally",[1072,3491,2029],{"class":1089},[1072,3493,3494],{"class":1074,"line":1569},[1072,3495,3496],{"class":1078},"                # Always release lock\n",[1072,3498,3499,3501,3503,3505,3507,3510,3512,3514],{"class":1074,"line":1588},[1072,3500,3452],{"class":1085},[1072,3502,1959],{"class":1089},[1072,3504,1988],{"class":2615},[1072,3506,1959],{"class":1089},[1072,3508,3509],{"class":2138},"delete",[1072,3511,2068],{"class":1089},[1072,3513,3358],{"class":2138},[1072,3515,2419],{"class":1089},[1072,3517,3518,3521],{"class":1074,"line":1593},[1072,3519,3520],{"class":1951},"        else",[1072,3522,2029],{"class":1089},[1072,3524,3525],{"class":1074,"line":1612},[1072,3526,3527],{"class":1078},"            # Wait for lock to be released and try again\n",[1072,3529,3530,3533,3535,3538,3540,3543],{"class":1074,"line":1617},[1072,3531,3532],{"class":1955},"            time",[1072,3534,1959],{"class":1089},[1072,3536,3537],{"class":2138},"sleep",[1072,3539,2068],{"class":1089},[1072,3541,3542],{"class":1223},"0.1",[1072,3544,2419],{"class":1089},[1072,3546,3547,3549,3551,3553,3556,3558,3560,3562,3564,3566,3568,3570,3572],{"class":1074,"line":1631},[1072,3548,2521],{"class":1951},[1072,3550,3295],{"class":1085},[1072,3552,1959],{"class":1089},[1072,3554,3555],{"class":2138},"get_or_set_with_lock",[1072,3557,2068],{"class":1089},[1072,3559,3271],{"class":2138},[1072,3561,1354],{"class":1089},[1072,3563,3226],{"class":2138},[1072,3565,1354],{"class":1089},[1072,3567,2502],{"class":2138},[1072,3569,1354],{"class":1089},[1072,3571,3239],{"class":2138},[1072,3573,2419],{"class":1089},[1072,3575,3576],{"class":1074,"line":1650},[1072,3577,2047],{"class":1955},[1072,3579,3580,3582,3585,3587,3589,3591,3594],{"class":1074,"line":1670},[1072,3581,2061],{"class":2021},[1072,3583,3584],{"class":2064}," invalidate_pattern",[1072,3586,2068],{"class":1089},[1072,3588,3164],{"class":3163},[1072,3590,1354],{"class":1089},[1072,3592,3593],{"class":2071}," pattern",[1072,3595,2090],{"class":1089},[1072,3597,3598,3600,3603],{"class":1074,"line":1683},[1072,3599,2095],{"class":2034},[1072,3601,3602],{"class":2038},"Invalidate all keys matching a pattern (Redis only)",[1072,3604,2042],{"class":2034},[1072,3606,3607,3609,3612,3614,3616,3618,3620,3622,3624,3627,3629],{"class":1074,"line":1702},[1072,3608,2168],{"class":1951},[1072,3610,3611],{"class":2144}," hasattr",[1072,3613,2068],{"class":1089},[1072,3615,3164],{"class":1085},[1072,3617,1959],{"class":1089},[1072,3619,1988],{"class":2615},[1072,3621,1354],{"class":1089},[1072,3623,1128],{"class":1099},[1072,3625,3626],{"class":1103},"delete_pattern",[1072,3628,1107],{"class":1099},[1072,3630,2090],{"class":1089},[1072,3632,3633,3636,3638,3640,3642,3644,3646,3649],{"class":1074,"line":1707},[1072,3634,3635],{"class":1085},"            self",[1072,3637,1959],{"class":1089},[1072,3639,1988],{"class":2615},[1072,3641,1959],{"class":1089},[1072,3643,3626],{"class":2138},[1072,3645,2068],{"class":1089},[1072,3647,3648],{"class":2138},"pattern",[1072,3650,2419],{"class":1089},[1072,3652,3653],{"class":1074,"line":1732},[1072,3654,2047],{"class":1955},[1072,3656,3657,3659,3662,3664,3666,3668,3671,3673,3676],{"class":1074,"line":1737},[1072,3658,2061],{"class":2021},[1072,3660,3661],{"class":2064}," get_many_with_fallback",[1072,3663,2068],{"class":1089},[1072,3665,3164],{"class":3163},[1072,3667,1354],{"class":1089},[1072,3669,3670],{"class":2071}," keys",[1072,3672,1354],{"class":1089},[1072,3674,3675],{"class":2071}," fallback_func",[1072,3677,2090],{"class":1089},[1072,3679,3680,3682,3685],{"class":1074,"line":1742},[1072,3681,2095],{"class":2034},[1072,3683,3684],{"class":2038},"Get multiple keys with fallback for missing ones",[1072,3686,2042],{"class":2034},[1072,3688,3689,3692,3694,3696,3698,3700,3702,3705,3707,3710],{"class":1074,"line":1747},[1072,3690,3691],{"class":1955},"        cached_results ",[1072,3693,2108],{"class":1089},[1072,3695,3295],{"class":1085},[1072,3697,1959],{"class":1089},[1072,3699,1988],{"class":2615},[1072,3701,1959],{"class":1089},[1072,3703,3704],{"class":2138},"get_many",[1072,3706,2068],{"class":1089},[1072,3708,3709],{"class":2138},"keys",[1072,3711,2419],{"class":1089},[1072,3713,3714,3717,3719,3722,3724,3726,3728,3731,3733,3735,3738,3740,3742],{"class":1074,"line":1753},[1072,3715,3716],{"class":1955},"        missing_keys ",[1072,3718,2108],{"class":1089},[1072,3720,3721],{"class":2055}," set",[1072,3723,2068],{"class":1089},[1072,3725,3709],{"class":2138},[1072,3727,2565],{"class":1089},[1072,3729,3730],{"class":1720}," -",[1072,3732,3721],{"class":2055},[1072,3734,2068],{"class":1089},[1072,3736,3737],{"class":2138},"cached_results",[1072,3739,1959],{"class":1089},[1072,3741,3709],{"class":2138},[1072,3743,3744],{"class":1089},"())\n",[1072,3746,3747],{"class":1074,"line":1769},[1072,3748,3280],{"class":1955},[1072,3750,3751,3753,3756],{"class":1074,"line":2731},[1072,3752,2168],{"class":1951},[1072,3754,3755],{"class":1955}," missing_keys",[1072,3757,2029],{"class":1089},[1072,3759,3760],{"class":1074,"line":2746},[1072,3761,3762],{"class":1078},"            # Get missing data\n",[1072,3764,3765,3768,3770,3772,3774,3777],{"class":1074,"line":2756},[1072,3766,3767],{"class":1955},"            missing_data ",[1072,3769,2108],{"class":1089},[1072,3771,3675],{"class":2138},[1072,3773,2068],{"class":1089},[1072,3775,3776],{"class":2138},"missing_keys",[1072,3778,2419],{"class":1089},[1072,3780,3781],{"class":1074,"line":2786},[1072,3782,2516],{"class":1955},[1072,3784,3785],{"class":1074,"line":2791},[1072,3786,3787],{"class":1078},"            # Cache missing data\n",[1072,3789,3790,3793,3795],{"class":1074,"line":2801},[1072,3791,3792],{"class":1955},"            cache_data ",[1072,3794,2108],{"class":1089},[1072,3796,3797],{"class":1089}," {}\n",[1072,3799,3800,3803,3806,3809,3811],{"class":1074,"line":2828},[1072,3801,3802],{"class":1951},"            for",[1072,3804,3805],{"class":1955}," key ",[1072,3807,3808],{"class":1951},"in",[1072,3810,3755],{"class":1955},[1072,3812,2029],{"class":1089},[1072,3814,3815,3817,3819,3821,3824],{"class":1074,"line":2853},[1072,3816,2424],{"class":1951},[1072,3818,3805],{"class":1955},[1072,3820,3808],{"class":1720},[1072,3822,3823],{"class":1955}," missing_data",[1072,3825,2029],{"class":1089},[1072,3827,3828,3831,3833,3835,3837,3839,3841,3843,3845],{"class":1074,"line":2875},[1072,3829,3830],{"class":1955},"                    cache_data",[1072,3832,3196],{"class":1089},[1072,3834,3271],{"class":1955},[1072,3836,2888],{"class":1089},[1072,3838,1090],{"class":1089},[1072,3840,3823],{"class":1955},[1072,3842,3196],{"class":1089},[1072,3844,3271],{"class":1955},[1072,3846,2700],{"class":1089},[1072,3848,3849],{"class":1074,"line":2899},[1072,3850,2516],{"class":1955},[1072,3852,3853,3856,3859],{"class":1074,"line":2924},[1072,3854,3855],{"class":1951},"            if",[1072,3857,3858],{"class":1955}," cache_data",[1072,3860,2029],{"class":1089},[1072,3862,3863,3865,3867,3869,3871,3874,3876,3879,3881,3883,3885,3887],{"class":1074,"line":2934},[1072,3864,3452],{"class":1085},[1072,3866,1959],{"class":1089},[1072,3868,1988],{"class":2615},[1072,3870,1959],{"class":1089},[1072,3872,3873],{"class":2138},"set_many",[1072,3875,2068],{"class":1089},[1072,3877,3878],{"class":2138},"cache_data",[1072,3880,1354],{"class":1089},[1072,3882,2502],{"class":2215},[1072,3884,2108],{"class":1089},[1072,3886,2275],{"class":1223},[1072,3888,2419],{"class":1089},[1072,3890,3891,3894,3896,3899,3901,3903],{"class":1074,"line":2944},[1072,3892,3893],{"class":1955},"                cached_results",[1072,3895,1959],{"class":1089},[1072,3897,3898],{"class":2138},"update",[1072,3900,2068],{"class":1089},[1072,3902,3878],{"class":2138},[1072,3904,2419],{"class":1089},[1072,3906,3907],{"class":1074,"line":2964},[1072,3908,3280],{"class":1955},[1072,3910,3911,3913],{"class":1074,"line":2987},[1072,3912,2245],{"class":1951},[1072,3914,3915],{"class":1955}," cached_results\n",[1072,3917,3918],{"class":1074,"line":3028},[1072,3919,1376],{"emptyLinePlaceholder":1375},[1072,3921,3922],{"class":1074,"line":3033},[1072,3923,3924],{"class":1078},"# Usage example\n",[1072,3926,3927,3930,3932,3934],{"class":1074,"line":3038},[1072,3928,3929],{"class":1955},"smart_cache ",[1072,3931,2108],{"class":1089},[1072,3933,3136],{"class":2138},[1072,3935,3447],{"class":1089},[1072,3937,3939],{"class":1074,"line":3938},70,[1072,3940,1376],{"emptyLinePlaceholder":1375},[1072,3942,3944,3946,3949,3951,3954],{"class":1074,"line":3943},71,[1072,3945,2573],{"class":2021},[1072,3947,3948],{"class":2064}," get_product_details",[1072,3950,2068],{"class":1089},[1072,3952,3953],{"class":2071},"product_ids",[1072,3955,2090],{"class":1089},[1072,3957,3959,3961,3964],{"class":1074,"line":3958},72,[1072,3960,2035],{"class":2034},[1072,3962,3963],{"class":2038},"Get product details with smart caching",[1072,3965,2042],{"class":2034},[1072,3967,3969,3972,3974,3977,3980,3983,3985,3988,3990,3992,3995,3998,4000,4003],{"class":1074,"line":3968},73,[1072,3970,3971],{"class":1955},"    cache_keys ",[1072,3973,2108],{"class":1089},[1072,3975,3976],{"class":1089}," [",[1072,3978,3979],{"class":2021},"f",[1072,3981,3982],{"class":1103},"\"product:",[1072,3984,2118],{"class":2117},[1072,3986,3987],{"class":1955},"pid",[1072,3989,2123],{"class":2117},[1072,3991,2114],{"class":1103},[1072,3993,3994],{"class":1951}," for",[1072,3996,3997],{"class":1955}," pid ",[1072,3999,3808],{"class":1951},[1072,4001,4002],{"class":1955}," product_ids",[1072,4004,2700],{"class":1089},[1072,4006,4008],{"class":1074,"line":4007},74,[1072,4009,2047],{"class":1955},[1072,4011,4013,4015,4018,4020,4022],{"class":1074,"line":4012},75,[1072,4014,2061],{"class":2021},[1072,4016,4017],{"class":2064}," fetch_missing_products",[1072,4019,2068],{"class":1089},[1072,4021,3776],{"class":2071},[1072,4023,2090],{"class":1089},[1072,4025,4027,4030,4032,4034,4036,4038,4041,4043,4045,4047,4049,4052,4055,4057,4059,4061,4063,4065],{"class":1074,"line":4026},76,[1072,4028,4029],{"class":1955},"        missing_ids ",[1072,4031,2108],{"class":1089},[1072,4033,3976],{"class":1089},[1072,4035,3271],{"class":1955},[1072,4037,1959],{"class":1089},[1072,4039,4040],{"class":2138},"split",[1072,4042,2068],{"class":1089},[1072,4044,1107],{"class":1099},[1072,4046,1110],{"class":1103},[1072,4048,1107],{"class":1099},[1072,4050,4051],{"class":1089},")[",[1072,4053,4054],{"class":1223},"1",[1072,4056,2888],{"class":1089},[1072,4058,3994],{"class":1951},[1072,4060,3805],{"class":1955},[1072,4062,3808],{"class":1951},[1072,4064,3755],{"class":1955},[1072,4066,2700],{"class":1089},[1072,4068,4070,4073,4075,4077,4079,4081,4083,4085,4087,4090,4092,4095,4097,4100,4102,4104,4107,4109],{"class":1074,"line":4069},77,[1072,4071,4072],{"class":1955},"        products ",[1072,4074,2108],{"class":1089},[1072,4076,2610],{"class":1955},[1072,4078,1959],{"class":1089},[1072,4080,2616],{"class":2615},[1072,4082,1959],{"class":1089},[1072,4084,2621],{"class":2138},[1072,4086,2068],{"class":1089},[1072,4088,4089],{"class":2215},"id__in",[1072,4091,2108],{"class":1089},[1072,4093,4094],{"class":2138},"missing_ids",[1072,4096,2224],{"class":1089},[1072,4098,4099],{"class":2138},"select_related",[1072,4101,2068],{"class":1089},[1072,4103,1107],{"class":1099},[1072,4105,4106],{"class":1103},"category",[1072,4108,1107],{"class":1099},[1072,4110,2419],{"class":1089},[1072,4112,4114],{"class":1074,"line":4113},78,[1072,4115,3280],{"class":1955},[1072,4117,4119,4121,4123],{"class":1074,"line":4118},79,[1072,4120,3290],{"class":1955},[1072,4122,2108],{"class":1089},[1072,4124,3797],{"class":1089},[1072,4126,4128,4131,4134,4136,4139],{"class":1074,"line":4127},80,[1072,4129,4130],{"class":1951},"        for",[1072,4132,4133],{"class":1955}," product ",[1072,4135,3808],{"class":1951},[1072,4137,4138],{"class":1955}," products",[1072,4140,2029],{"class":1089},[1072,4142,4144,4147,4149,4151,4153,4155,4158,4160,4162,4164],{"class":1074,"line":4143},81,[1072,4145,4146],{"class":1955},"            key ",[1072,4148,2108],{"class":1089},[1072,4150,2111],{"class":2021},[1072,4152,3982],{"class":1103},[1072,4154,2118],{"class":2117},[1072,4156,4157],{"class":1955},"product",[1072,4159,1959],{"class":1089},[1072,4161,2777],{"class":2615},[1072,4163,2123],{"class":2117},[1072,4165,2163],{"class":1103},[1072,4167,4169,4172,4174,4176,4178,4180],{"class":1074,"line":4168},82,[1072,4170,4171],{"class":1955},"            result",[1072,4173,3196],{"class":1089},[1072,4175,3271],{"class":1955},[1072,4177,2888],{"class":1089},[1072,4179,1090],{"class":1089},[1072,4181,1093],{"class":1089},[1072,4183,4185,4187,4189,4191,4193,4196,4198,4200],{"class":1074,"line":4184},83,[1072,4186,1213],{"class":1099},[1072,4188,2777],{"class":1103},[1072,4190,1107],{"class":1099},[1072,4192,1110],{"class":1089},[1072,4194,4195],{"class":1955}," product",[1072,4197,1959],{"class":1089},[1072,4199,2777],{"class":2615},[1072,4201,1136],{"class":1089},[1072,4203,4205,4207,4210,4212,4214,4216,4218,4220],{"class":1074,"line":4204},84,[1072,4206,1213],{"class":1099},[1072,4208,4209],{"class":1103},"name",[1072,4211,1107],{"class":1099},[1072,4213,1110],{"class":1089},[1072,4215,4195],{"class":1955},[1072,4217,1959],{"class":1089},[1072,4219,4209],{"class":2615},[1072,4221,1136],{"class":1089},[1072,4223,4225,4227,4230,4232,4234,4237,4239,4241,4243,4245],{"class":1074,"line":4224},85,[1072,4226,1213],{"class":1099},[1072,4228,4229],{"class":1103},"price",[1072,4231,1107],{"class":1099},[1072,4233,1110],{"class":1089},[1072,4235,4236],{"class":2055}," str",[1072,4238,2068],{"class":1089},[1072,4240,4157],{"class":2138},[1072,4242,1959],{"class":1089},[1072,4244,4229],{"class":2615},[1072,4246,4247],{"class":1089},"),\n",[1072,4249,4251,4253,4255,4257,4259,4261,4263,4265,4267,4269],{"class":1074,"line":4250},86,[1072,4252,1213],{"class":1099},[1072,4254,4106],{"class":1103},[1072,4256,1107],{"class":1099},[1072,4258,1110],{"class":1089},[1072,4260,4195],{"class":1955},[1072,4262,1959],{"class":1089},[1072,4264,4106],{"class":2615},[1072,4266,1959],{"class":1089},[1072,4268,4209],{"class":2615},[1072,4270,1136],{"class":1089},[1072,4272,4274],{"class":1074,"line":4273},87,[1072,4275,4276],{"class":1089},"            }\n",[1072,4278,4280,4282],{"class":1074,"line":4279},88,[1072,4281,2245],{"class":1951},[1072,4283,2446],{"class":1955},[1072,4285,4287],{"class":1074,"line":4286},89,[1072,4288,2047],{"class":1955},[1072,4290,4292,4294,4297,4299,4302,4304,4307,4309,4311],{"class":1074,"line":4291},90,[1072,4293,2607],{"class":1951},[1072,4295,4296],{"class":1955}," smart_cache",[1072,4298,1959],{"class":1089},[1072,4300,4301],{"class":2138},"get_many_with_fallback",[1072,4303,2068],{"class":1089},[1072,4305,4306],{"class":2138},"cache_keys",[1072,4308,1354],{"class":1089},[1072,4310,4017],{"class":2138},[1072,4312,2419],{"class":1089},[1030,4314,4316],{"id":4315},"view-level-caching-strategies","View-Level Caching Strategies",[1038,4318,4320],{"id":4319},"conditional-view-caching","Conditional View Caching",[1043,4322,4324],{"className":1066,"code":4323,"language":1068,"meta":1052,"style":1052},"from django.views.decorators.cache import cache_page\nfrom django.views.decorators.vary import vary_on_headers, vary_on_cookie\nfrom django.utils.decorators import method_decorator\nfrom django.views.generic import ListView\nimport hashlib\n\ndef cache_per_user(timeout=300):\n    \"\"\"Cache view per user\"\"\"\n    def decorator(view_func):\n        def wrapper(request, *args, **kwargs):\n            if request.user.is_authenticated:\n                cache_key = f\"view_user_{request.user.id}_{request.path}\"\n                \n                # Include query parameters in cache key\n                if request.GET:\n                    query_hash = hashlib.md5(\n                        str(sorted(request.GET.items())).encode()\n                    ).hexdigest()\n                    cache_key += f\"_{query_hash}\"\n                \n                cached_response = cache.get(cache_key)\n                if cached_response:\n                    return cached_response\n                \n                response = view_func(request, *args, **kwargs)\n                cache.set(cache_key, response, timeout)\n                return response\n            else:\n                return view_func(request, *args, **kwargs)\n        \n        return wrapper\n    return decorator\n\n# Usage examples\n@cache_per_user(timeout=600)\ndef user_dashboard(request):\n    \"\"\"User-specific dashboard with caching\"\"\"\n    user_stats = calculate_user_statistics(request.user.id)\n    recent_orders = request.user.orders.select_related('status')[:5]\n    \n    context = {\n        'stats': user_stats,\n        'recent_orders': recent_orders,\n    }\n    return render(request, 'dashboard.html', context)\n\n@method_decorator(cache_page(300), name='dispatch')\n@method_decorator(vary_on_headers('User-Agent'), name='dispatch')\nclass ProductListView(ListView):\n    \"\"\"Cached product list with user agent variation\"\"\"\n    model = Product\n    template_name = 'products/list.html'\n    paginate_by = 20\n    \n    def get_queryset(self):\n        return Product.objects.select_related('category').filter(is_active=True)\n",[1050,4325,4326,4351,4380,4401,4421,4427,4431,4448,4457,4470,4495,4514,4555,4559,4564,4578,4594,4624,4633,4654,4658,4677,4686,4693,4697,4725,4748,4755,4762,4786,4790,4796,4802,4806,4810,4827,4840,4849,4872,4909,4913,4922,4938,4954,4958,4985,4989,5022,5056,5071,5080,5090,5104,5114,5118,5131],{"__ignoreMap":1052},[1072,4327,4328,4330,4332,4334,4337,4339,4342,4344,4346,4348],{"class":1074,"line":1075},[1072,4329,1952],{"class":1951},[1072,4331,1956],{"class":1955},[1072,4333,1959],{"class":1089},[1072,4335,4336],{"class":1955},"views",[1072,4338,1959],{"class":1089},[1072,4340,4341],{"class":1955},"decorators",[1072,4343,1959],{"class":1089},[1072,4345,1967],{"class":1955},[1072,4347,1970],{"class":1951},[1072,4349,4350],{"class":1955}," cache_page\n",[1072,4352,4353,4355,4357,4359,4361,4363,4365,4367,4370,4372,4375,4377],{"class":1074,"line":1082},[1072,4354,1952],{"class":1951},[1072,4356,1956],{"class":1955},[1072,4358,1959],{"class":1089},[1072,4360,4336],{"class":1955},[1072,4362,1959],{"class":1089},[1072,4364,4341],{"class":1955},[1072,4366,1959],{"class":1089},[1072,4368,4369],{"class":1955},"vary ",[1072,4371,1970],{"class":1951},[1072,4373,4374],{"class":1955}," vary_on_headers",[1072,4376,1354],{"class":1089},[1072,4378,4379],{"class":1955}," vary_on_cookie\n",[1072,4381,4382,4384,4386,4388,4391,4393,4396,4398],{"class":1074,"line":1096},[1072,4383,1952],{"class":1951},[1072,4385,1956],{"class":1955},[1072,4387,1959],{"class":1089},[1072,4389,4390],{"class":1955},"utils",[1072,4392,1959],{"class":1089},[1072,4394,4395],{"class":1955},"decorators ",[1072,4397,1970],{"class":1951},[1072,4399,4400],{"class":1955}," method_decorator\n",[1072,4402,4403,4405,4407,4409,4411,4413,4416,4418],{"class":1074,"line":1115},[1072,4404,1952],{"class":1951},[1072,4406,1956],{"class":1955},[1072,4408,1959],{"class":1089},[1072,4410,4336],{"class":1955},[1072,4412,1959],{"class":1089},[1072,4414,4415],{"class":1955},"generic ",[1072,4417,1970],{"class":1951},[1072,4419,4420],{"class":1955}," ListView\n",[1072,4422,4423,4425],{"class":1074,"line":1139},[1072,4424,1970],{"class":1951},[1072,4426,2005],{"class":1955},[1072,4428,4429],{"class":1074,"line":1160},[1072,4430,1376],{"emptyLinePlaceholder":1375},[1072,4432,4433,4435,4438,4440,4442,4444,4446],{"class":1074,"line":1174},[1072,4434,2573],{"class":2021},[1072,4436,4437],{"class":2064}," cache_per_user",[1072,4439,2068],{"class":1089},[1072,4441,2270],{"class":2071},[1072,4443,2108],{"class":1720},[1072,4445,2275],{"class":1223},[1072,4447,2090],{"class":1089},[1072,4449,4450,4452,4455],{"class":1074,"line":1196},[1072,4451,2035],{"class":2034},[1072,4453,4454],{"class":2038},"Cache view per user",[1072,4456,2042],{"class":2034},[1072,4458,4459,4461,4463,4465,4468],{"class":1074,"line":1210},[1072,4460,2061],{"class":2021},[1072,4462,2294],{"class":2064},[1072,4464,2068],{"class":1089},[1072,4466,4467],{"class":2071},"view_func",[1072,4469,2090],{"class":1089},[1072,4471,4472,4474,4476,4478,4481,4483,4485,4487,4489,4491,4493],{"class":1074,"line":1229},[1072,4473,2291],{"class":2021},[1072,4475,2309],{"class":2064},[1072,4477,2068],{"class":1089},[1072,4479,4480],{"class":2071},"request",[1072,4482,1354],{"class":1089},[1072,4484,1721],{"class":1720},[1072,4486,2079],{"class":2071},[1072,4488,1354],{"class":1089},[1072,4490,2084],{"class":1720},[1072,4492,2087],{"class":2071},[1072,4494,2090],{"class":1089},[1072,4496,4497,4499,4502,4504,4507,4509,4512],{"class":1074,"line":1247},[1072,4498,3855],{"class":1951},[1072,4500,4501],{"class":1955}," request",[1072,4503,1959],{"class":1089},[1072,4505,4506],{"class":2615},"user",[1072,4508,1959],{"class":1089},[1072,4510,4511],{"class":2615},"is_authenticated",[1072,4513,2029],{"class":1089},[1072,4515,4516,4518,4520,4522,4525,4527,4529,4531,4533,4535,4537,4539,4542,4544,4546,4548,4551,4553],{"class":1074,"line":1253},[1072,4517,2334],{"class":1955},[1072,4519,2108],{"class":1089},[1072,4521,2111],{"class":2021},[1072,4523,4524],{"class":1103},"\"view_user_",[1072,4526,2118],{"class":2117},[1072,4528,4480],{"class":1955},[1072,4530,1959],{"class":1089},[1072,4532,4506],{"class":2615},[1072,4534,1959],{"class":1089},[1072,4536,2777],{"class":2615},[1072,4538,2123],{"class":2117},[1072,4540,4541],{"class":1103},"_",[1072,4543,2118],{"class":2117},[1072,4545,4480],{"class":1955},[1072,4547,1959],{"class":1089},[1072,4549,4550],{"class":2615},"path",[1072,4552,2123],{"class":2117},[1072,4554,2163],{"class":1103},[1072,4556,4557],{"class":1074,"line":1274},[1072,4558,2391],{"class":1955},[1072,4560,4561],{"class":1074,"line":1295},[1072,4562,4563],{"class":1078},"                # Include query parameters in cache key\n",[1072,4565,4566,4568,4570,4572,4576],{"class":1074,"line":1301},[1072,4567,2424],{"class":1951},[1072,4569,4501],{"class":1955},[1072,4571,1959],{"class":1089},[1072,4573,4575],{"class":4574},"sFGJz","GET",[1072,4577,2029],{"class":1089},[1072,4579,4580,4583,4585,4588,4590,4592],{"class":1074,"line":1322},[1072,4581,4582],{"class":1955},"                    query_hash ",[1072,4584,2108],{"class":1089},[1072,4586,4587],{"class":1955}," hashlib",[1072,4589,1959],{"class":1089},[1072,4591,2196],{"class":2138},[1072,4593,2346],{"class":1089},[1072,4595,4596,4599,4601,4604,4606,4608,4610,4612,4614,4617,4620,4622],{"class":1074,"line":1339},[1072,4597,4598],{"class":2055},"                        str",[1072,4600,2068],{"class":1089},[1072,4602,4603],{"class":2144},"sorted",[1072,4605,2068],{"class":1089},[1072,4607,4480],{"class":2138},[1072,4609,1959],{"class":1089},[1072,4611,4575],{"class":4574},[1072,4613,1959],{"class":1089},[1072,4615,4616],{"class":2138},"items",[1072,4618,4619],{"class":1089},"())).",[1072,4621,2227],{"class":2138},[1072,4623,3447],{"class":1089},[1072,4625,4626,4629,4631],{"class":1074,"line":1360},[1072,4627,4628],{"class":1089},"                    ).",[1072,4630,2233],{"class":2138},[1072,4632,3447],{"class":1089},[1072,4634,4635,4638,4640,4642,4645,4647,4650,4652],{"class":1074,"line":1366},[1072,4636,4637],{"class":1955},"                    cache_key ",[1072,4639,2181],{"class":1089},[1072,4641,2111],{"class":2021},[1072,4643,4644],{"class":1103},"\"_",[1072,4646,2118],{"class":2117},[1072,4648,4649],{"class":1955},"query_hash",[1072,4651,2123],{"class":2117},[1072,4653,2163],{"class":1103},[1072,4655,4656],{"class":1074,"line":1372},[1072,4657,2391],{"class":1955},[1072,4659,4660,4663,4665,4667,4669,4671,4673,4675],{"class":1074,"line":1379},[1072,4661,4662],{"class":1955},"                cached_response ",[1072,4664,2108],{"class":1089},[1072,4666,2406],{"class":1955},[1072,4668,1959],{"class":1089},[1072,4670,2411],{"class":2138},[1072,4672,2068],{"class":1089},[1072,4674,2416],{"class":2138},[1072,4676,2419],{"class":1089},[1072,4678,4679,4681,4684],{"class":1074,"line":1385},[1072,4680,2424],{"class":1951},[1072,4682,4683],{"class":1955}," cached_response",[1072,4685,2029],{"class":1089},[1072,4687,4688,4690],{"class":1074,"line":1394},[1072,4689,2443],{"class":1951},[1072,4691,4692],{"class":1955}," cached_response\n",[1072,4694,4695],{"class":1074,"line":1407},[1072,4696,2391],{"class":1955},[1072,4698,4699,4702,4704,4707,4709,4711,4713,4715,4717,4719,4721,4723],{"class":1074,"line":1426},[1072,4700,4701],{"class":1955},"                response ",[1072,4703,2108],{"class":1089},[1072,4705,4706],{"class":2138}," view_func",[1072,4708,2068],{"class":1089},[1072,4710,4480],{"class":2138},[1072,4712,1354],{"class":1089},[1072,4714,1721],{"class":1720},[1072,4716,2079],{"class":2138},[1072,4718,1354],{"class":1089},[1072,4720,2084],{"class":1720},[1072,4722,2087],{"class":2138},[1072,4724,2419],{"class":1089},[1072,4726,4727,4729,4731,4733,4735,4737,4739,4742,4744,4746],{"class":1074,"line":1445},[1072,4728,2483],{"class":1955},[1072,4730,1959],{"class":1089},[1072,4732,2488],{"class":2138},[1072,4734,2068],{"class":1089},[1072,4736,2416],{"class":2138},[1072,4738,1354],{"class":1089},[1072,4740,4741],{"class":2138}," response",[1072,4743,1354],{"class":1089},[1072,4745,2502],{"class":2138},[1072,4747,2419],{"class":1089},[1072,4749,4750,4752],{"class":1074,"line":1458},[1072,4751,2509],{"class":1951},[1072,4753,4754],{"class":1955}," response\n",[1072,4756,4757,4760],{"class":1074,"line":1477},[1072,4758,4759],{"class":1951},"            else",[1072,4761,2029],{"class":1089},[1072,4763,4764,4766,4768,4770,4772,4774,4776,4778,4780,4782,4784],{"class":1074,"line":1482},[1072,4765,2509],{"class":1951},[1072,4767,4706],{"class":2138},[1072,4769,2068],{"class":1089},[1072,4771,4480],{"class":2138},[1072,4773,1354],{"class":1089},[1072,4775,1721],{"class":1720},[1072,4777,2079],{"class":2138},[1072,4779,1354],{"class":1089},[1072,4781,2084],{"class":1720},[1072,4783,2087],{"class":2138},[1072,4785,2419],{"class":1089},[1072,4787,4788],{"class":1074,"line":1497},[1072,4789,3280],{"class":1955},[1072,4791,4792,4794],{"class":1074,"line":1503},[1072,4793,2245],{"class":1951},[1072,4795,2524],{"class":1955},[1072,4797,4798,4800],{"class":1074,"line":1517},[1072,4799,2607],{"class":1951},[1072,4801,2531],{"class":1955},[1072,4803,4804],{"class":1074,"line":1536},[1072,4805,1376],{"emptyLinePlaceholder":1375},[1072,4807,4808],{"class":1074,"line":1556},[1072,4809,2540],{"class":1078},[1072,4811,4812,4814,4817,4819,4821,4823,4825],{"class":1074,"line":1569},[1072,4813,2545],{"class":1089},[1072,4815,4816],{"class":2064},"cache_per_user",[1072,4818,2068],{"class":1089},[1072,4820,2270],{"class":2215},[1072,4822,2108],{"class":1089},[1072,4824,2562],{"class":1223},[1072,4826,2419],{"class":1089},[1072,4828,4829,4831,4834,4836,4838],{"class":1074,"line":1588},[1072,4830,2573],{"class":2021},[1072,4832,4833],{"class":2064}," user_dashboard",[1072,4835,2068],{"class":1089},[1072,4837,4480],{"class":2071},[1072,4839,2090],{"class":1089},[1072,4841,4842,4844,4847],{"class":1074,"line":1593},[1072,4843,2035],{"class":2034},[1072,4845,4846],{"class":2038},"User-specific dashboard with caching",[1072,4848,2042],{"class":2034},[1072,4850,4851,4854,4856,4858,4860,4862,4864,4866,4868,4870],{"class":1074,"line":1612},[1072,4852,4853],{"class":1955},"    user_stats ",[1072,4855,2108],{"class":1089},[1072,4857,2736],{"class":2138},[1072,4859,2068],{"class":1089},[1072,4861,4480],{"class":2138},[1072,4863,1959],{"class":1089},[1072,4865,4506],{"class":2615},[1072,4867,1959],{"class":1089},[1072,4869,2777],{"class":2615},[1072,4871,2419],{"class":1089},[1072,4873,4874,4877,4879,4881,4883,4885,4887,4889,4891,4893,4895,4897,4900,4902,4904,4907],{"class":1074,"line":1617},[1072,4875,4876],{"class":1955},"    recent_orders ",[1072,4878,2108],{"class":1089},[1072,4880,4501],{"class":1955},[1072,4882,1959],{"class":1089},[1072,4884,4506],{"class":2615},[1072,4886,1959],{"class":1089},[1072,4888,2671],{"class":2615},[1072,4890,1959],{"class":1089},[1072,4892,4099],{"class":2138},[1072,4894,2068],{"class":1089},[1072,4896,1107],{"class":1099},[1072,4898,4899],{"class":1103},"status",[1072,4901,1107],{"class":1099},[1072,4903,2694],{"class":1089},[1072,4905,4906],{"class":1223},"5",[1072,4908,2700],{"class":1089},[1072,4910,4911],{"class":1074,"line":1631},[1072,4912,2047],{"class":1955},[1072,4914,4915,4918,4920],{"class":1074,"line":1650},[1072,4916,4917],{"class":1955},"    context ",[1072,4919,2108],{"class":1089},[1072,4921,1093],{"class":1089},[1072,4923,4924,4926,4929,4931,4933,4936],{"class":1074,"line":1670},[1072,4925,1118],{"class":1099},[1072,4927,4928],{"class":1103},"stats",[1072,4930,1107],{"class":1099},[1072,4932,1110],{"class":1089},[1072,4934,4935],{"class":1955}," user_stats",[1072,4937,1136],{"class":1089},[1072,4939,4940,4942,4945,4947,4949,4952],{"class":1074,"line":1683},[1072,4941,1118],{"class":1099},[1072,4943,4944],{"class":1103},"recent_orders",[1072,4946,1107],{"class":1099},[1072,4948,1110],{"class":1089},[1072,4950,4951],{"class":1955}," recent_orders",[1072,4953,1136],{"class":1089},[1072,4955,4956],{"class":1074,"line":1702},[1072,4957,1363],{"class":1089},[1072,4959,4960,4962,4965,4967,4969,4971,4973,4976,4978,4980,4983],{"class":1074,"line":1707},[1072,4961,2607],{"class":1951},[1072,4963,4964],{"class":2138}," render",[1072,4966,2068],{"class":1089},[1072,4968,4480],{"class":2138},[1072,4970,1354],{"class":1089},[1072,4972,1128],{"class":1099},[1072,4974,4975],{"class":1103},"dashboard.html",[1072,4977,1107],{"class":1099},[1072,4979,1354],{"class":1089},[1072,4981,4982],{"class":2138}," context",[1072,4984,2419],{"class":1089},[1072,4986,4987],{"class":1074,"line":1732},[1072,4988,1376],{"emptyLinePlaceholder":1375},[1072,4990,4991,4993,4996,4998,5001,5003,5005,5008,5011,5013,5015,5018,5020],{"class":1074,"line":1737},[1072,4992,2545],{"class":1089},[1072,4994,4995],{"class":2064},"method_decorator",[1072,4997,2068],{"class":1089},[1072,4999,5000],{"class":2138},"cache_page",[1072,5002,2068],{"class":1089},[1072,5004,2275],{"class":1223},[1072,5006,5007],{"class":1089},"),",[1072,5009,5010],{"class":2215}," name",[1072,5012,2108],{"class":1089},[1072,5014,1107],{"class":1099},[1072,5016,5017],{"class":1103},"dispatch",[1072,5019,1107],{"class":1099},[1072,5021,2419],{"class":1089},[1072,5023,5024,5026,5028,5030,5033,5035,5037,5040,5042,5044,5046,5048,5050,5052,5054],{"class":1074,"line":1742},[1072,5025,2545],{"class":1089},[1072,5027,4995],{"class":2064},[1072,5029,2068],{"class":1089},[1072,5031,5032],{"class":2138},"vary_on_headers",[1072,5034,2068],{"class":1089},[1072,5036,1107],{"class":1099},[1072,5038,5039],{"class":1103},"User-Agent",[1072,5041,1107],{"class":1099},[1072,5043,5007],{"class":1089},[1072,5045,5010],{"class":2215},[1072,5047,2108],{"class":1089},[1072,5049,1107],{"class":1099},[1072,5051,5017],{"class":1103},[1072,5053,1107],{"class":1099},[1072,5055,2419],{"class":1089},[1072,5057,5058,5060,5063,5065,5069],{"class":1074,"line":1747},[1072,5059,2022],{"class":2021},[1072,5061,5062],{"class":2025}," ProductListView",[1072,5064,2068],{"class":1089},[1072,5066,5068],{"class":5067},"sYn-s","ListView",[1072,5070,2090],{"class":1089},[1072,5072,5073,5075,5078],{"class":1074,"line":1753},[1072,5074,2035],{"class":2034},[1072,5076,5077],{"class":2038},"Cached product list with user agent variation",[1072,5079,2042],{"class":2034},[1072,5081,5082,5085,5087],{"class":1074,"line":1769},[1072,5083,5084],{"class":1955},"    model ",[1072,5086,2108],{"class":1089},[1072,5088,5089],{"class":1955}," Product\n",[1072,5091,5092,5095,5097,5099,5102],{"class":1074,"line":2731},[1072,5093,5094],{"class":1955},"    template_name ",[1072,5096,2108],{"class":1089},[1072,5098,1128],{"class":1099},[1072,5100,5101],{"class":1103},"products/list.html",[1072,5103,1766],{"class":1099},[1072,5105,5106,5109,5111],{"class":1074,"line":2746},[1072,5107,5108],{"class":1955},"    paginate_by ",[1072,5110,2108],{"class":1089},[1072,5112,5113],{"class":1223}," 20\n",[1072,5115,5116],{"class":1074,"line":2756},[1072,5117,2047],{"class":1955},[1072,5119,5120,5122,5125,5127,5129],{"class":1074,"line":2786},[1072,5121,2061],{"class":2021},[1072,5123,5124],{"class":2064}," get_queryset",[1072,5126,2068],{"class":1089},[1072,5128,3164],{"class":3163},[1072,5130,2090],{"class":1089},[1072,5132,5133,5135,5137,5139,5141,5143,5145,5147,5149,5151,5153,5155,5157,5159,5162,5164,5166],{"class":1074,"line":2791},[1072,5134,2245],{"class":1951},[1072,5136,2610],{"class":1955},[1072,5138,1959],{"class":1089},[1072,5140,2616],{"class":2615},[1072,5142,1959],{"class":1089},[1072,5144,4099],{"class":2138},[1072,5146,2068],{"class":1089},[1072,5148,1107],{"class":1099},[1072,5150,4106],{"class":1103},[1072,5152,1107],{"class":1099},[1072,5154,2224],{"class":1089},[1072,5156,2621],{"class":2138},[1072,5158,2068],{"class":1089},[1072,5160,5161],{"class":2215},"is_active",[1072,5163,2108],{"class":1089},[1072,5165,2221],{"class":1241},[1072,5167,2419],{"class":1089},[1038,5169,5171],{"id":5170},"smart-cache-invalidation","Smart Cache Invalidation",[1043,5173,5175],{"className":1066,"code":5174,"language":1068,"meta":1052,"style":1052},"from django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\nfrom django.core.cache import cache\n\nclass CacheInvalidator:\n    \"\"\"Automatic cache invalidation based on model changes\"\"\"\n    \n    @staticmethod\n    def invalidate_model_cache(model_class, instance_id=None):\n        \"\"\"Invalidate all cache keys related to a model\"\"\"\n        model_name = model_class._meta.label_lower\n        \n        # Invalidate general model caches\n        patterns = [\n            f\"model_{model_name}_*\",\n            f\"list_{model_name}_*\",\n            f\"count_{model_name}_*\",\n        ]\n        \n        if instance_id:\n            patterns.extend([\n                f\"instance_{model_name}_{instance_id}_*\",\n                f\"detail_{model_name}_{instance_id}_*\",\n            ])\n        \n        for pattern in patterns:\n            cache.delete_pattern(pattern)\n    \n    @staticmethod\n    def invalidate_related_caches(instance):\n        \"\"\"Invalidate caches related to model relationships\"\"\"\n        model_name = instance._meta.label_lower\n        \n        # Invalidate foreign key related caches\n        for field in instance._meta.get_fields():\n            if field.is_relation and hasattr(instance, field.name):\n                related_obj = getattr(instance, field.name)\n                if related_obj:\n                    related_model = field.related_model._meta.label_lower\n                    cache.delete_pattern(f\"*{related_model}_{related_obj.id}*\")\n\n# Signal handlers for automatic invalidation\n@receiver([post_save, post_delete], sender=Product)\ndef invalidate_product_cache(sender, instance, **kwargs):\n    \"\"\"Invalidate product-related caches\"\"\"\n    CacheInvalidator.invalidate_model_cache(Product, instance.id)\n    \n    # Invalidate category caches\n    if instance.category:\n        cache.delete_pattern(f\"category_{instance.category.id}_*\")\n    \n    # Invalidate homepage cache if featured product\n    if instance.is_featured:\n        cache.delete_pattern(\"homepage_*\")\n\n@receiver([post_save, post_delete], sender=Order)\ndef invalidate_order_cache(sender, instance, **kwargs):\n    \"\"\"Invalidate order-related caches\"\"\"\n    CacheInvalidator.invalidate_model_cache(Order, instance.id)\n    \n    # Invalidate user statistics\n    cache.delete_pattern(f\"user_stats_{instance.user.id}_*\")\n    \n    # Invalidate product popularity caches\n    for item in instance.items.all():\n        cache.delete_pattern(f\"product_popularity_{item.product.id}_*\")\n",[1050,5176,5177,5203,5217,5235,5239,5248,5257,5261,5267,5291,5300,5320,5324,5329,5338,5358,5375,5392,5397,5401,5409,5422,5449,5474,5479,5483,5497,5512,5516,5522,5536,5545,5562,5566,5571,5594,5625,5649,5658,5680,5720,5724,5729,5760,5784,5793,5817,5821,5826,5839,5873,5877,5882,5895,5914,5918,5943,5966,5975,5997,6001,6006,6040,6044,6049,6072],{"__ignoreMap":1052},[1072,5178,5179,5181,5183,5185,5187,5189,5191,5193,5195,5197,5199,5201],{"class":1074,"line":1075},[1072,5180,1952],{"class":1951},[1072,5182,1956],{"class":1955},[1072,5184,1959],{"class":1089},[1072,5186,3082],{"class":1955},[1072,5188,1959],{"class":1089},[1072,5190,3087],{"class":1955},[1072,5192,1959],{"class":1089},[1072,5194,3092],{"class":1955},[1072,5196,1970],{"class":1951},[1072,5198,3097],{"class":1955},[1072,5200,1354],{"class":1089},[1072,5202,3102],{"class":1955},[1072,5204,5205,5207,5209,5211,5213,5215],{"class":1074,"line":1082},[1072,5206,1952],{"class":1951},[1072,5208,1956],{"class":1955},[1072,5210,1959],{"class":1089},[1072,5212,3113],{"class":1955},[1072,5214,1970],{"class":1951},[1072,5216,3118],{"class":1955},[1072,5218,5219,5221,5223,5225,5227,5229,5231,5233],{"class":1074,"line":1096},[1072,5220,1952],{"class":1951},[1072,5222,1956],{"class":1955},[1072,5224,1959],{"class":1089},[1072,5226,1962],{"class":1955},[1072,5228,1959],{"class":1089},[1072,5230,1967],{"class":1955},[1072,5232,1970],{"class":1951},[1072,5234,1973],{"class":1955},[1072,5236,5237],{"class":1074,"line":1115},[1072,5238,1376],{"emptyLinePlaceholder":1375},[1072,5240,5241,5243,5246],{"class":1074,"line":1139},[1072,5242,2022],{"class":2021},[1072,5244,5245],{"class":2025}," CacheInvalidator",[1072,5247,2029],{"class":1089},[1072,5249,5250,5252,5255],{"class":1074,"line":1160},[1072,5251,2035],{"class":2034},[1072,5253,5254],{"class":2038},"Automatic cache invalidation based on model changes",[1072,5256,2042],{"class":2034},[1072,5258,5259],{"class":1074,"line":1174},[1072,5260,2047],{"class":1955},[1072,5262,5263,5265],{"class":1074,"line":1196},[1072,5264,2052],{"class":1089},[1072,5266,2056],{"class":2055},[1072,5268,5269,5271,5274,5276,5279,5281,5284,5286,5289],{"class":1074,"line":1210},[1072,5270,2061],{"class":2021},[1072,5272,5273],{"class":2064}," invalidate_model_cache",[1072,5275,2068],{"class":1089},[1072,5277,5278],{"class":2071},"model_class",[1072,5280,1354],{"class":1089},[1072,5282,5283],{"class":2071}," instance_id",[1072,5285,2108],{"class":1720},[1072,5287,5288],{"class":1241},"None",[1072,5290,2090],{"class":1089},[1072,5292,5293,5295,5298],{"class":1074,"line":1229},[1072,5294,2095],{"class":2034},[1072,5296,5297],{"class":2038},"Invalidate all cache keys related to a model",[1072,5299,2042],{"class":2034},[1072,5301,5302,5305,5307,5310,5312,5315,5317],{"class":1074,"line":1247},[1072,5303,5304],{"class":1955},"        model_name ",[1072,5306,2108],{"class":1089},[1072,5308,5309],{"class":1955}," model_class",[1072,5311,1959],{"class":1089},[1072,5313,5314],{"class":2615},"_meta",[1072,5316,1959],{"class":1089},[1072,5318,5319],{"class":2615},"label_lower\n",[1072,5321,5322],{"class":1074,"line":1253},[1072,5323,3280],{"class":1955},[1072,5325,5326],{"class":1074,"line":1274},[1072,5327,5328],{"class":1078},"        # Invalidate general model caches\n",[1072,5330,5331,5334,5336],{"class":1074,"line":1295},[1072,5332,5333],{"class":1955},"        patterns ",[1072,5335,2108],{"class":1089},[1072,5337,1846],{"class":1089},[1072,5339,5340,5343,5346,5348,5351,5353,5356],{"class":1074,"line":1301},[1072,5341,5342],{"class":2021},"            f",[1072,5344,5345],{"class":1103},"\"model_",[1072,5347,2118],{"class":2117},[1072,5349,5350],{"class":1955},"model_name",[1072,5352,2123],{"class":2117},[1072,5354,5355],{"class":1103},"_*\"",[1072,5357,1136],{"class":1089},[1072,5359,5360,5362,5365,5367,5369,5371,5373],{"class":1074,"line":1322},[1072,5361,5342],{"class":2021},[1072,5363,5364],{"class":1103},"\"list_",[1072,5366,2118],{"class":2117},[1072,5368,5350],{"class":1955},[1072,5370,2123],{"class":2117},[1072,5372,5355],{"class":1103},[1072,5374,1136],{"class":1089},[1072,5376,5377,5379,5382,5384,5386,5388,5390],{"class":1074,"line":1339},[1072,5378,5342],{"class":2021},[1072,5380,5381],{"class":1103},"\"count_",[1072,5383,2118],{"class":2117},[1072,5385,5350],{"class":1955},[1072,5387,2123],{"class":2117},[1072,5389,5355],{"class":1103},[1072,5391,1136],{"class":1089},[1072,5393,5394],{"class":1074,"line":1360},[1072,5395,5396],{"class":1089},"        ]\n",[1072,5398,5399],{"class":1074,"line":1366},[1072,5400,3280],{"class":1955},[1072,5402,5403,5405,5407],{"class":1074,"line":1372},[1072,5404,2168],{"class":1951},[1072,5406,5283],{"class":1955},[1072,5408,2029],{"class":1089},[1072,5410,5411,5414,5416,5419],{"class":1074,"line":1379},[1072,5412,5413],{"class":1955},"            patterns",[1072,5415,1959],{"class":1089},[1072,5417,5418],{"class":2138},"extend",[1072,5420,5421],{"class":1089},"([\n",[1072,5423,5424,5427,5430,5432,5434,5436,5438,5440,5443,5445,5447],{"class":1074,"line":1385},[1072,5425,5426],{"class":2021},"                f",[1072,5428,5429],{"class":1103},"\"instance_",[1072,5431,2118],{"class":2117},[1072,5433,5350],{"class":2138},[1072,5435,2123],{"class":2117},[1072,5437,4541],{"class":1103},[1072,5439,2118],{"class":2117},[1072,5441,5442],{"class":2138},"instance_id",[1072,5444,2123],{"class":2117},[1072,5446,5355],{"class":1103},[1072,5448,1136],{"class":1089},[1072,5450,5451,5453,5456,5458,5460,5462,5464,5466,5468,5470,5472],{"class":1074,"line":1394},[1072,5452,5426],{"class":2021},[1072,5454,5455],{"class":1103},"\"detail_",[1072,5457,2118],{"class":2117},[1072,5459,5350],{"class":2138},[1072,5461,2123],{"class":2117},[1072,5463,4541],{"class":1103},[1072,5465,2118],{"class":2117},[1072,5467,5442],{"class":2138},[1072,5469,2123],{"class":2117},[1072,5471,5355],{"class":1103},[1072,5473,1136],{"class":1089},[1072,5475,5476],{"class":1074,"line":1407},[1072,5477,5478],{"class":1089},"            ])\n",[1072,5480,5481],{"class":1074,"line":1426},[1072,5482,3280],{"class":1955},[1072,5484,5485,5487,5490,5492,5495],{"class":1074,"line":1445},[1072,5486,4130],{"class":1951},[1072,5488,5489],{"class":1955}," pattern ",[1072,5491,3808],{"class":1951},[1072,5493,5494],{"class":1955}," patterns",[1072,5496,2029],{"class":1089},[1072,5498,5499,5502,5504,5506,5508,5510],{"class":1074,"line":1458},[1072,5500,5501],{"class":1955},"            cache",[1072,5503,1959],{"class":1089},[1072,5505,3626],{"class":2138},[1072,5507,2068],{"class":1089},[1072,5509,3648],{"class":2138},[1072,5511,2419],{"class":1089},[1072,5513,5514],{"class":1074,"line":1477},[1072,5515,2047],{"class":1955},[1072,5517,5518,5520],{"class":1074,"line":1482},[1072,5519,2052],{"class":1089},[1072,5521,2056],{"class":2055},[1072,5523,5524,5526,5529,5531,5534],{"class":1074,"line":1497},[1072,5525,2061],{"class":2021},[1072,5527,5528],{"class":2064}," invalidate_related_caches",[1072,5530,2068],{"class":1089},[1072,5532,5533],{"class":2071},"instance",[1072,5535,2090],{"class":1089},[1072,5537,5538,5540,5543],{"class":1074,"line":1503},[1072,5539,2095],{"class":2034},[1072,5541,5542],{"class":2038},"Invalidate caches related to model relationships",[1072,5544,2042],{"class":2034},[1072,5546,5547,5549,5551,5554,5556,5558,5560],{"class":1074,"line":1517},[1072,5548,5304],{"class":1955},[1072,5550,2108],{"class":1089},[1072,5552,5553],{"class":1955}," instance",[1072,5555,1959],{"class":1089},[1072,5557,5314],{"class":2615},[1072,5559,1959],{"class":1089},[1072,5561,5319],{"class":2615},[1072,5563,5564],{"class":1074,"line":1536},[1072,5565,3280],{"class":1955},[1072,5567,5568],{"class":1074,"line":1556},[1072,5569,5570],{"class":1078},"        # Invalidate foreign key related caches\n",[1072,5572,5573,5575,5578,5580,5582,5584,5586,5588,5591],{"class":1074,"line":1569},[1072,5574,4130],{"class":1951},[1072,5576,5577],{"class":1955}," field ",[1072,5579,3808],{"class":1951},[1072,5581,5553],{"class":1955},[1072,5583,1959],{"class":1089},[1072,5585,5314],{"class":2615},[1072,5587,1959],{"class":1089},[1072,5589,5590],{"class":2138},"get_fields",[1072,5592,5593],{"class":1089},"():\n",[1072,5595,5596,5598,5601,5603,5606,5609,5611,5613,5615,5617,5619,5621,5623],{"class":1074,"line":1588},[1072,5597,3855],{"class":1951},[1072,5599,5600],{"class":1955}," field",[1072,5602,1959],{"class":1089},[1072,5604,5605],{"class":2615},"is_relation",[1072,5607,5608],{"class":1720}," and",[1072,5610,3611],{"class":2144},[1072,5612,2068],{"class":1089},[1072,5614,5533],{"class":2138},[1072,5616,1354],{"class":1089},[1072,5618,5600],{"class":2138},[1072,5620,1959],{"class":1089},[1072,5622,4209],{"class":2615},[1072,5624,2090],{"class":1089},[1072,5626,5627,5630,5632,5635,5637,5639,5641,5643,5645,5647],{"class":1074,"line":1593},[1072,5628,5629],{"class":1955},"                related_obj ",[1072,5631,2108],{"class":1089},[1072,5633,5634],{"class":2144}," getattr",[1072,5636,2068],{"class":1089},[1072,5638,5533],{"class":2138},[1072,5640,1354],{"class":1089},[1072,5642,5600],{"class":2138},[1072,5644,1959],{"class":1089},[1072,5646,4209],{"class":2615},[1072,5648,2419],{"class":1089},[1072,5650,5651,5653,5656],{"class":1074,"line":1612},[1072,5652,2424],{"class":1951},[1072,5654,5655],{"class":1955}," related_obj",[1072,5657,2029],{"class":1089},[1072,5659,5660,5663,5665,5667,5669,5672,5674,5676,5678],{"class":1074,"line":1617},[1072,5661,5662],{"class":1955},"                    related_model ",[1072,5664,2108],{"class":1089},[1072,5666,5600],{"class":1955},[1072,5668,1959],{"class":1089},[1072,5670,5671],{"class":2615},"related_model",[1072,5673,1959],{"class":1089},[1072,5675,5314],{"class":2615},[1072,5677,1959],{"class":1089},[1072,5679,5319],{"class":2615},[1072,5681,5682,5685,5687,5689,5691,5693,5696,5698,5700,5702,5704,5706,5709,5711,5713,5715,5718],{"class":1074,"line":1631},[1072,5683,5684],{"class":1955},"                    cache",[1072,5686,1959],{"class":1089},[1072,5688,3626],{"class":2138},[1072,5690,2068],{"class":1089},[1072,5692,3979],{"class":2021},[1072,5694,5695],{"class":1103},"\"*",[1072,5697,2118],{"class":2117},[1072,5699,5671],{"class":2138},[1072,5701,2123],{"class":2117},[1072,5703,4541],{"class":1103},[1072,5705,2118],{"class":2117},[1072,5707,5708],{"class":2138},"related_obj",[1072,5710,1959],{"class":1089},[1072,5712,2777],{"class":2615},[1072,5714,2123],{"class":2117},[1072,5716,5717],{"class":1103},"*\"",[1072,5719,2419],{"class":1089},[1072,5721,5722],{"class":1074,"line":1650},[1072,5723,1376],{"emptyLinePlaceholder":1375},[1072,5725,5726],{"class":1074,"line":1670},[1072,5727,5728],{"class":1078},"# Signal handlers for automatic invalidation\n",[1072,5730,5731,5733,5736,5739,5742,5744,5747,5750,5753,5755,5758],{"class":1074,"line":1683},[1072,5732,2545],{"class":1089},[1072,5734,5735],{"class":2064},"receiver",[1072,5737,5738],{"class":1089},"([",[1072,5740,5741],{"class":2138},"post_save",[1072,5743,1354],{"class":1089},[1072,5745,5746],{"class":2138}," post_delete",[1072,5748,5749],{"class":1089},"],",[1072,5751,5752],{"class":2215}," sender",[1072,5754,2108],{"class":1089},[1072,5756,5757],{"class":2138},"Product",[1072,5759,2419],{"class":1089},[1072,5761,5762,5764,5767,5769,5772,5774,5776,5778,5780,5782],{"class":1074,"line":1702},[1072,5763,2573],{"class":2021},[1072,5765,5766],{"class":2064}," invalidate_product_cache",[1072,5768,2068],{"class":1089},[1072,5770,5771],{"class":2071},"sender",[1072,5773,1354],{"class":1089},[1072,5775,5553],{"class":2071},[1072,5777,1354],{"class":1089},[1072,5779,2084],{"class":1720},[1072,5781,2087],{"class":2071},[1072,5783,2090],{"class":1089},[1072,5785,5786,5788,5791],{"class":1074,"line":1707},[1072,5787,2035],{"class":2034},[1072,5789,5790],{"class":2038},"Invalidate product-related caches",[1072,5792,2042],{"class":2034},[1072,5794,5795,5798,5800,5803,5805,5807,5809,5811,5813,5815],{"class":1074,"line":1732},[1072,5796,5797],{"class":1955},"    CacheInvalidator",[1072,5799,1959],{"class":1089},[1072,5801,5802],{"class":2138},"invalidate_model_cache",[1072,5804,2068],{"class":1089},[1072,5806,5757],{"class":2138},[1072,5808,1354],{"class":1089},[1072,5810,5553],{"class":2138},[1072,5812,1959],{"class":1089},[1072,5814,2777],{"class":2615},[1072,5816,2419],{"class":1089},[1072,5818,5819],{"class":1074,"line":1737},[1072,5820,2047],{"class":1955},[1072,5822,5823],{"class":1074,"line":1742},[1072,5824,5825],{"class":1078},"    # Invalidate category caches\n",[1072,5827,5828,5831,5833,5835,5837],{"class":1074,"line":1747},[1072,5829,5830],{"class":1951},"    if",[1072,5832,5553],{"class":1955},[1072,5834,1959],{"class":1089},[1072,5836,4106],{"class":2615},[1072,5838,2029],{"class":1089},[1072,5840,5841,5844,5846,5848,5850,5852,5855,5857,5859,5861,5863,5865,5867,5869,5871],{"class":1074,"line":1753},[1072,5842,5843],{"class":1955},"        cache",[1072,5845,1959],{"class":1089},[1072,5847,3626],{"class":2138},[1072,5849,2068],{"class":1089},[1072,5851,3979],{"class":2021},[1072,5853,5854],{"class":1103},"\"category_",[1072,5856,2118],{"class":2117},[1072,5858,5533],{"class":2138},[1072,5860,1959],{"class":1089},[1072,5862,4106],{"class":2615},[1072,5864,1959],{"class":1089},[1072,5866,2777],{"class":2615},[1072,5868,2123],{"class":2117},[1072,5870,5355],{"class":1103},[1072,5872,2419],{"class":1089},[1072,5874,5875],{"class":1074,"line":1769},[1072,5876,2047],{"class":1955},[1072,5878,5879],{"class":1074,"line":2731},[1072,5880,5881],{"class":1078},"    # Invalidate homepage cache if featured product\n",[1072,5883,5884,5886,5888,5890,5893],{"class":1074,"line":2746},[1072,5885,5830],{"class":1951},[1072,5887,5553],{"class":1955},[1072,5889,1959],{"class":1089},[1072,5891,5892],{"class":2615},"is_featured",[1072,5894,2029],{"class":1089},[1072,5896,5897,5899,5901,5903,5905,5907,5910,5912],{"class":1074,"line":2756},[1072,5898,5843],{"class":1955},[1072,5900,1959],{"class":1089},[1072,5902,3626],{"class":2138},[1072,5904,2068],{"class":1089},[1072,5906,2114],{"class":1099},[1072,5908,5909],{"class":1103},"homepage_*",[1072,5911,2114],{"class":1099},[1072,5913,2419],{"class":1089},[1072,5915,5916],{"class":1074,"line":2786},[1072,5917,1376],{"emptyLinePlaceholder":1375},[1072,5919,5920,5922,5924,5926,5928,5930,5932,5934,5936,5938,5941],{"class":1074,"line":2791},[1072,5921,2545],{"class":1089},[1072,5923,5735],{"class":2064},[1072,5925,5738],{"class":1089},[1072,5927,5741],{"class":2138},[1072,5929,1354],{"class":1089},[1072,5931,5746],{"class":2138},[1072,5933,5749],{"class":1089},[1072,5935,5752],{"class":2215},[1072,5937,2108],{"class":1089},[1072,5939,5940],{"class":2138},"Order",[1072,5942,2419],{"class":1089},[1072,5944,5945,5947,5950,5952,5954,5956,5958,5960,5962,5964],{"class":1074,"line":2801},[1072,5946,2573],{"class":2021},[1072,5948,5949],{"class":2064}," invalidate_order_cache",[1072,5951,2068],{"class":1089},[1072,5953,5771],{"class":2071},[1072,5955,1354],{"class":1089},[1072,5957,5553],{"class":2071},[1072,5959,1354],{"class":1089},[1072,5961,2084],{"class":1720},[1072,5963,2087],{"class":2071},[1072,5965,2090],{"class":1089},[1072,5967,5968,5970,5973],{"class":1074,"line":2828},[1072,5969,2035],{"class":2034},[1072,5971,5972],{"class":2038},"Invalidate order-related caches",[1072,5974,2042],{"class":2034},[1072,5976,5977,5979,5981,5983,5985,5987,5989,5991,5993,5995],{"class":1074,"line":2853},[1072,5978,5797],{"class":1955},[1072,5980,1959],{"class":1089},[1072,5982,5802],{"class":2138},[1072,5984,2068],{"class":1089},[1072,5986,5940],{"class":2138},[1072,5988,1354],{"class":1089},[1072,5990,5553],{"class":2138},[1072,5992,1959],{"class":1089},[1072,5994,2777],{"class":2615},[1072,5996,2419],{"class":1089},[1072,5998,5999],{"class":1074,"line":2875},[1072,6000,2047],{"class":1955},[1072,6002,6003],{"class":1074,"line":2899},[1072,6004,6005],{"class":1078},"    # Invalidate user statistics\n",[1072,6007,6008,6011,6013,6015,6017,6019,6022,6024,6026,6028,6030,6032,6034,6036,6038],{"class":1074,"line":2924},[1072,6009,6010],{"class":1955},"    cache",[1072,6012,1959],{"class":1089},[1072,6014,3626],{"class":2138},[1072,6016,2068],{"class":1089},[1072,6018,3979],{"class":2021},[1072,6020,6021],{"class":1103},"\"user_stats_",[1072,6023,2118],{"class":2117},[1072,6025,5533],{"class":2138},[1072,6027,1959],{"class":1089},[1072,6029,4506],{"class":2615},[1072,6031,1959],{"class":1089},[1072,6033,2777],{"class":2615},[1072,6035,2123],{"class":2117},[1072,6037,5355],{"class":1103},[1072,6039,2419],{"class":1089},[1072,6041,6042],{"class":1074,"line":2934},[1072,6043,2047],{"class":1955},[1072,6045,6046],{"class":1074,"line":2944},[1072,6047,6048],{"class":1078},"    # Invalidate product popularity caches\n",[1072,6050,6051,6054,6057,6059,6061,6063,6065,6067,6070],{"class":1074,"line":2964},[1072,6052,6053],{"class":1951},"    for",[1072,6055,6056],{"class":1955}," item ",[1072,6058,3808],{"class":1951},[1072,6060,5553],{"class":1955},[1072,6062,1959],{"class":1089},[1072,6064,4616],{"class":2615},[1072,6066,1959],{"class":1089},[1072,6068,6069],{"class":2138},"all",[1072,6071,5593],{"class":1089},[1072,6073,6074,6076,6078,6080,6082,6084,6087,6089,6092,6094,6096,6098,6100,6102,6104],{"class":1074,"line":2987},[1072,6075,5843],{"class":1955},[1072,6077,1959],{"class":1089},[1072,6079,3626],{"class":2138},[1072,6081,2068],{"class":1089},[1072,6083,3979],{"class":2021},[1072,6085,6086],{"class":1103},"\"product_popularity_",[1072,6088,2118],{"class":2117},[1072,6090,6091],{"class":2138},"item",[1072,6093,1959],{"class":1089},[1072,6095,4157],{"class":2615},[1072,6097,1959],{"class":1089},[1072,6099,2777],{"class":2615},[1072,6101,2123],{"class":2117},[1072,6103,5355],{"class":1103},[1072,6105,2419],{"class":1089},[1030,6107,695],{"id":6108},"template-fragment-caching",[1038,6110,6112],{"id":6111},"strategic-fragment-caching","Strategic Fragment Caching",[1043,6114,6118],{"className":6115,"code":6116,"language":6117,"meta":1052,"style":1052},"language-html shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","\u003C!-- templates/products/detail.html -->\n{% load cache %}\n\n\u003Cdiv class=\"product-detail\">\n    \u003C!-- Cache expensive product information -->\n    {% cache 3600 product_info product.id product.updated_at %}\n    \u003Cdiv class=\"product-info\">\n        \u003Ch1>{{ product.name }}\u003C/h1>\n        \u003Cp class=\"price\">${{ product.price }}\u003C/p>\n        \u003Cdiv class=\"description\">{{ product.description|markdown }}\u003C/div>\n        \n        \u003C!-- Cache related products separately -->\n        {% cache 1800 related_products product.category.id %}\n        \u003Cdiv class=\"related-products\">\n            \u003Ch3>Related Products\u003C/h3>\n            {% for related in product.get_related_products %}\n                \u003Cdiv class=\"related-item\">\n                    \u003Ca href=\"{{ related.get_absolute_url }}\">{{ related.name }}\u003C/a>\n                \u003C/div>\n            {% endfor %}\n        \u003C/div>\n        {% endcache %}\n    \u003C/div>\n    {% endcache %}\n    \n    \u003C!-- Don't cache user-specific content -->\n    \u003Cdiv class=\"user-actions\">\n        {% if user.is_authenticated %}\n            \u003Cbutton class=\"add-to-cart\" data-product-id=\"{{ product.id }}\">\n                Add to Cart\n            \u003C/button>\n            {% if product in user.wishlist.products.all %}\n                \u003Cbutton class=\"remove-wishlist\">Remove from Wishlist\u003C/button>\n            {% else %}\n                \u003Cbutton class=\"add-wishlist\">Add to Wishlist\u003C/button>\n            {% endif %}\n        {% endif %}\n    \u003C/div>\n    \n    \u003C!-- Cache reviews with pagination -->\n    {% cache 900 product_reviews product.id page_number %}\n    \u003Cdiv class=\"reviews\">\n        \u003Ch3>Customer Reviews\u003C/h3>\n        {% for review in reviews %}\n            \u003Cdiv class=\"review\">\n                \u003Cdiv class=\"rating\">{{ review.rating }}/5\u003C/div>\n                \u003Cdiv class=\"comment\">{{ review.comment }}\u003C/div>\n                \u003Cdiv class=\"author\">{{ review.author.username }}\u003C/div>\n            \u003C/div>\n        {% endfor %}\n    \u003C/div>\n    {% endcache %}\n\u003C/div>\n","html",[1050,6119,6120,6125,6130,6134,6159,6164,6169,6189,6209,6236,6264,6268,6273,6278,6297,6315,6320,6340,6371,6380,6385,6394,6399,6408,6413,6417,6422,6441,6446,6478,6483,6492,6497,6525,6530,6558,6563,6568,6576,6580,6585,6590,6609,6626,6631,6650,6678,6706,6734,6742,6747,6755,6759],{"__ignoreMap":1052},[1072,6121,6122],{"class":1074,"line":1075},[1072,6123,6124],{"class":1078},"\u003C!-- templates/products/detail.html -->\n",[1072,6126,6127],{"class":1074,"line":1082},[1072,6128,6129],{"class":1955},"{% load cache %}\n",[1072,6131,6132],{"class":1074,"line":1096},[1072,6133,1376],{"emptyLinePlaceholder":1375},[1072,6135,6136,6139,6143,6147,6149,6151,6154,6156],{"class":1074,"line":1115},[1072,6137,6138],{"class":1089},"\u003C",[1072,6140,6142],{"class":6141},"sJFLg","div",[1072,6144,6146],{"class":6145},"s5q8q"," class",[1072,6148,2108],{"class":1089},[1072,6150,2114],{"class":1099},[1072,6152,6153],{"class":1103},"product-detail",[1072,6155,2114],{"class":1099},[1072,6157,6158],{"class":1089},">\n",[1072,6160,6161],{"class":1074,"line":1139},[1072,6162,6163],{"class":1078},"    \u003C!-- Cache expensive product information -->\n",[1072,6165,6166],{"class":1074,"line":1160},[1072,6167,6168],{"class":1955},"    {% cache 3600 product_info product.id product.updated_at %}\n",[1072,6170,6171,6174,6176,6178,6180,6182,6185,6187],{"class":1074,"line":1174},[1072,6172,6173],{"class":1089},"    \u003C",[1072,6175,6142],{"class":6141},[1072,6177,6146],{"class":6145},[1072,6179,2108],{"class":1089},[1072,6181,2114],{"class":1099},[1072,6183,6184],{"class":1103},"product-info",[1072,6186,2114],{"class":1099},[1072,6188,6158],{"class":1089},[1072,6190,6191,6194,6196,6199,6202,6205,6207],{"class":1074,"line":1196},[1072,6192,6193],{"class":1089},"        \u003C",[1072,6195,1022],{"class":6141},[1072,6197,6198],{"class":1089},">",[1072,6200,6201],{"class":1955},"{{ product.name }}",[1072,6203,6204],{"class":1089},"\u003C/",[1072,6206,1022],{"class":6141},[1072,6208,6158],{"class":1089},[1072,6210,6211,6213,6215,6217,6219,6221,6223,6225,6227,6230,6232,6234],{"class":1074,"line":1210},[1072,6212,6193],{"class":1089},[1072,6214,1026],{"class":6141},[1072,6216,6146],{"class":6145},[1072,6218,2108],{"class":1089},[1072,6220,2114],{"class":1099},[1072,6222,4229],{"class":1103},[1072,6224,2114],{"class":1099},[1072,6226,6198],{"class":1089},[1072,6228,6229],{"class":1955},"${{ product.price }}",[1072,6231,6204],{"class":1089},[1072,6233,1026],{"class":6141},[1072,6235,6158],{"class":1089},[1072,6237,6238,6240,6242,6244,6246,6248,6251,6253,6255,6258,6260,6262],{"class":1074,"line":1229},[1072,6239,6193],{"class":1089},[1072,6241,6142],{"class":6141},[1072,6243,6146],{"class":6145},[1072,6245,2108],{"class":1089},[1072,6247,2114],{"class":1099},[1072,6249,6250],{"class":1103},"description",[1072,6252,2114],{"class":1099},[1072,6254,6198],{"class":1089},[1072,6256,6257],{"class":1955},"{{ product.description|markdown }}",[1072,6259,6204],{"class":1089},[1072,6261,6142],{"class":6141},[1072,6263,6158],{"class":1089},[1072,6265,6266],{"class":1074,"line":1247},[1072,6267,3280],{"class":1955},[1072,6269,6270],{"class":1074,"line":1253},[1072,6271,6272],{"class":1078},"        \u003C!-- Cache related products separately -->\n",[1072,6274,6275],{"class":1074,"line":1274},[1072,6276,6277],{"class":1955},"        {% cache 1800 related_products product.category.id %}\n",[1072,6279,6280,6282,6284,6286,6288,6290,6293,6295],{"class":1074,"line":1295},[1072,6281,6193],{"class":1089},[1072,6283,6142],{"class":6141},[1072,6285,6146],{"class":6145},[1072,6287,2108],{"class":1089},[1072,6289,2114],{"class":1099},[1072,6291,6292],{"class":1103},"related-products",[1072,6294,2114],{"class":1099},[1072,6296,6158],{"class":1089},[1072,6298,6299,6302,6304,6306,6309,6311,6313],{"class":1074,"line":1301},[1072,6300,6301],{"class":1089},"            \u003C",[1072,6303,1038],{"class":6141},[1072,6305,6198],{"class":1089},[1072,6307,6308],{"class":1955},"Related Products",[1072,6310,6204],{"class":1089},[1072,6312,1038],{"class":6141},[1072,6314,6158],{"class":1089},[1072,6316,6317],{"class":1074,"line":1322},[1072,6318,6319],{"class":1955},"            {% for related in product.get_related_products %}\n",[1072,6321,6322,6325,6327,6329,6331,6333,6336,6338],{"class":1074,"line":1339},[1072,6323,6324],{"class":1089},"                \u003C",[1072,6326,6142],{"class":6141},[1072,6328,6146],{"class":6145},[1072,6330,2108],{"class":1089},[1072,6332,2114],{"class":1099},[1072,6334,6335],{"class":1103},"related-item",[1072,6337,2114],{"class":1099},[1072,6339,6158],{"class":1089},[1072,6341,6342,6345,6348,6351,6353,6355,6358,6360,6362,6365,6367,6369],{"class":1074,"line":1360},[1072,6343,6344],{"class":1089},"                    \u003C",[1072,6346,6347],{"class":6141},"a",[1072,6349,6350],{"class":6145}," href",[1072,6352,2108],{"class":1089},[1072,6354,2114],{"class":1099},[1072,6356,6357],{"class":1103},"{{ related.get_absolute_url }}",[1072,6359,2114],{"class":1099},[1072,6361,6198],{"class":1089},[1072,6363,6364],{"class":1955},"{{ related.name }}",[1072,6366,6204],{"class":1089},[1072,6368,6347],{"class":6141},[1072,6370,6158],{"class":1089},[1072,6372,6373,6376,6378],{"class":1074,"line":1366},[1072,6374,6375],{"class":1089},"                \u003C/",[1072,6377,6142],{"class":6141},[1072,6379,6158],{"class":1089},[1072,6381,6382],{"class":1074,"line":1372},[1072,6383,6384],{"class":1955},"            {% endfor %}\n",[1072,6386,6387,6390,6392],{"class":1074,"line":1379},[1072,6388,6389],{"class":1089},"        \u003C/",[1072,6391,6142],{"class":6141},[1072,6393,6158],{"class":1089},[1072,6395,6396],{"class":1074,"line":1385},[1072,6397,6398],{"class":1955},"        {% endcache %}\n",[1072,6400,6401,6404,6406],{"class":1074,"line":1394},[1072,6402,6403],{"class":1089},"    \u003C/",[1072,6405,6142],{"class":6141},[1072,6407,6158],{"class":1089},[1072,6409,6410],{"class":1074,"line":1407},[1072,6411,6412],{"class":1955},"    {% endcache %}\n",[1072,6414,6415],{"class":1074,"line":1426},[1072,6416,2047],{"class":1955},[1072,6418,6419],{"class":1074,"line":1445},[1072,6420,6421],{"class":1078},"    \u003C!-- Don't cache user-specific content -->\n",[1072,6423,6424,6426,6428,6430,6432,6434,6437,6439],{"class":1074,"line":1458},[1072,6425,6173],{"class":1089},[1072,6427,6142],{"class":6141},[1072,6429,6146],{"class":6145},[1072,6431,2108],{"class":1089},[1072,6433,2114],{"class":1099},[1072,6435,6436],{"class":1103},"user-actions",[1072,6438,2114],{"class":1099},[1072,6440,6158],{"class":1089},[1072,6442,6443],{"class":1074,"line":1477},[1072,6444,6445],{"class":1955},"        {% if user.is_authenticated %}\n",[1072,6447,6448,6450,6453,6455,6457,6459,6462,6464,6467,6469,6471,6474,6476],{"class":1074,"line":1482},[1072,6449,6301],{"class":1089},[1072,6451,6452],{"class":6141},"button",[1072,6454,6146],{"class":6145},[1072,6456,2108],{"class":1089},[1072,6458,2114],{"class":1099},[1072,6460,6461],{"class":1103},"add-to-cart",[1072,6463,2114],{"class":1099},[1072,6465,6466],{"class":6145}," data-product-id",[1072,6468,2108],{"class":1089},[1072,6470,2114],{"class":1099},[1072,6472,6473],{"class":1103},"{{ product.id }}",[1072,6475,2114],{"class":1099},[1072,6477,6158],{"class":1089},[1072,6479,6480],{"class":1074,"line":1497},[1072,6481,6482],{"class":1955},"                Add to Cart\n",[1072,6484,6485,6488,6490],{"class":1074,"line":1503},[1072,6486,6487],{"class":1089},"            \u003C/",[1072,6489,6452],{"class":6141},[1072,6491,6158],{"class":1089},[1072,6493,6494],{"class":1074,"line":1517},[1072,6495,6496],{"class":1955},"            {% if product in user.wishlist.products.all %}\n",[1072,6498,6499,6501,6503,6505,6507,6509,6512,6514,6516,6519,6521,6523],{"class":1074,"line":1536},[1072,6500,6324],{"class":1089},[1072,6502,6452],{"class":6141},[1072,6504,6146],{"class":6145},[1072,6506,2108],{"class":1089},[1072,6508,2114],{"class":1099},[1072,6510,6511],{"class":1103},"remove-wishlist",[1072,6513,2114],{"class":1099},[1072,6515,6198],{"class":1089},[1072,6517,6518],{"class":1955},"Remove from Wishlist",[1072,6520,6204],{"class":1089},[1072,6522,6452],{"class":6141},[1072,6524,6158],{"class":1089},[1072,6526,6527],{"class":1074,"line":1556},[1072,6528,6529],{"class":1955},"            {% else %}\n",[1072,6531,6532,6534,6536,6538,6540,6542,6545,6547,6549,6552,6554,6556],{"class":1074,"line":1569},[1072,6533,6324],{"class":1089},[1072,6535,6452],{"class":6141},[1072,6537,6146],{"class":6145},[1072,6539,2108],{"class":1089},[1072,6541,2114],{"class":1099},[1072,6543,6544],{"class":1103},"add-wishlist",[1072,6546,2114],{"class":1099},[1072,6548,6198],{"class":1089},[1072,6550,6551],{"class":1955},"Add to Wishlist",[1072,6553,6204],{"class":1089},[1072,6555,6452],{"class":6141},[1072,6557,6158],{"class":1089},[1072,6559,6560],{"class":1074,"line":1588},[1072,6561,6562],{"class":1955},"            {% endif %}\n",[1072,6564,6565],{"class":1074,"line":1593},[1072,6566,6567],{"class":1955},"        {% endif %}\n",[1072,6569,6570,6572,6574],{"class":1074,"line":1612},[1072,6571,6403],{"class":1089},[1072,6573,6142],{"class":6141},[1072,6575,6158],{"class":1089},[1072,6577,6578],{"class":1074,"line":1617},[1072,6579,2047],{"class":1955},[1072,6581,6582],{"class":1074,"line":1631},[1072,6583,6584],{"class":1078},"    \u003C!-- Cache reviews with pagination -->\n",[1072,6586,6587],{"class":1074,"line":1650},[1072,6588,6589],{"class":1955},"    {% cache 900 product_reviews product.id page_number %}\n",[1072,6591,6592,6594,6596,6598,6600,6602,6605,6607],{"class":1074,"line":1670},[1072,6593,6173],{"class":1089},[1072,6595,6142],{"class":6141},[1072,6597,6146],{"class":6145},[1072,6599,2108],{"class":1089},[1072,6601,2114],{"class":1099},[1072,6603,6604],{"class":1103},"reviews",[1072,6606,2114],{"class":1099},[1072,6608,6158],{"class":1089},[1072,6610,6611,6613,6615,6617,6620,6622,6624],{"class":1074,"line":1683},[1072,6612,6193],{"class":1089},[1072,6614,1038],{"class":6141},[1072,6616,6198],{"class":1089},[1072,6618,6619],{"class":1955},"Customer Reviews",[1072,6621,6204],{"class":1089},[1072,6623,1038],{"class":6141},[1072,6625,6158],{"class":1089},[1072,6627,6628],{"class":1074,"line":1702},[1072,6629,6630],{"class":1955},"        {% for review in reviews %}\n",[1072,6632,6633,6635,6637,6639,6641,6643,6646,6648],{"class":1074,"line":1707},[1072,6634,6301],{"class":1089},[1072,6636,6142],{"class":6141},[1072,6638,6146],{"class":6145},[1072,6640,2108],{"class":1089},[1072,6642,2114],{"class":1099},[1072,6644,6645],{"class":1103},"review",[1072,6647,2114],{"class":1099},[1072,6649,6158],{"class":1089},[1072,6651,6652,6654,6656,6658,6660,6662,6665,6667,6669,6672,6674,6676],{"class":1074,"line":1732},[1072,6653,6324],{"class":1089},[1072,6655,6142],{"class":6141},[1072,6657,6146],{"class":6145},[1072,6659,2108],{"class":1089},[1072,6661,2114],{"class":1099},[1072,6663,6664],{"class":1103},"rating",[1072,6666,2114],{"class":1099},[1072,6668,6198],{"class":1089},[1072,6670,6671],{"class":1955},"{{ review.rating }}/5",[1072,6673,6204],{"class":1089},[1072,6675,6142],{"class":6141},[1072,6677,6158],{"class":1089},[1072,6679,6680,6682,6684,6686,6688,6690,6693,6695,6697,6700,6702,6704],{"class":1074,"line":1737},[1072,6681,6324],{"class":1089},[1072,6683,6142],{"class":6141},[1072,6685,6146],{"class":6145},[1072,6687,2108],{"class":1089},[1072,6689,2114],{"class":1099},[1072,6691,6692],{"class":1103},"comment",[1072,6694,2114],{"class":1099},[1072,6696,6198],{"class":1089},[1072,6698,6699],{"class":1955},"{{ review.comment }}",[1072,6701,6204],{"class":1089},[1072,6703,6142],{"class":6141},[1072,6705,6158],{"class":1089},[1072,6707,6708,6710,6712,6714,6716,6718,6721,6723,6725,6728,6730,6732],{"class":1074,"line":1742},[1072,6709,6324],{"class":1089},[1072,6711,6142],{"class":6141},[1072,6713,6146],{"class":6145},[1072,6715,2108],{"class":1089},[1072,6717,2114],{"class":1099},[1072,6719,6720],{"class":1103},"author",[1072,6722,2114],{"class":1099},[1072,6724,6198],{"class":1089},[1072,6726,6727],{"class":1955},"{{ review.author.username }}",[1072,6729,6204],{"class":1089},[1072,6731,6142],{"class":6141},[1072,6733,6158],{"class":1089},[1072,6735,6736,6738,6740],{"class":1074,"line":1747},[1072,6737,6487],{"class":1089},[1072,6739,6142],{"class":6141},[1072,6741,6158],{"class":1089},[1072,6743,6744],{"class":1074,"line":1753},[1072,6745,6746],{"class":1955},"        {% endfor %}\n",[1072,6748,6749,6751,6753],{"class":1074,"line":1769},[1072,6750,6403],{"class":1089},[1072,6752,6142],{"class":6141},[1072,6754,6158],{"class":1089},[1072,6756,6757],{"class":1074,"line":2731},[1072,6758,6412],{"class":1955},[1072,6760,6761,6763,6765],{"class":1074,"line":2746},[1072,6762,6204],{"class":1089},[1072,6764,6142],{"class":6141},[1072,6766,6158],{"class":1089},[1038,6768,6770],{"id":6769},"dynamic-fragment-caching","Dynamic Fragment Caching",[1043,6772,6774],{"className":1066,"code":6773,"language":1068,"meta":1052,"style":1052},"# Custom template tags for dynamic caching\nfrom django import template\nfrom django.core.cache import cache\nfrom django.template.loader import render_to_string\nimport hashlib\n\nregister = template.Library()\n\n@register.simple_tag(takes_context=True)\ndef cache_include(context, template_name, cache_key, timeout=300, **kwargs):\n    \"\"\"Include template with caching\"\"\"\n    # Build complete cache key\n    full_cache_key = f\"template_{cache_key}\"\n    if kwargs:\n        key_suffix = hashlib.md5(str(sorted(kwargs.items())).encode()).hexdigest()\n        full_cache_key += f\"_{key_suffix}\"\n    \n    # Try to get from cache\n    cached_content = cache.get(full_cache_key)\n    if cached_content is not None:\n        return cached_content\n    \n    # Render template\n    template_context = context.flatten()\n    template_context.update(kwargs)\n    \n    content = render_to_string(template_name, template_context)\n    \n    # Cache the result\n    cache.set(full_cache_key, content, timeout)\n    \n    return content\n\n@register.simple_tag\ndef cache_expensive_computation(cache_key, timeout=300):\n    \"\"\"Cache expensive computations in templates\"\"\"\n    def decorator(func):\n        cached_result = cache.get(cache_key)\n        if cached_result is not None:\n            return cached_result\n        \n        result = func()\n        cache.set(cache_key, result, timeout)\n        return result\n    \n    return decorator\n",[1050,6775,6776,6781,6793,6811,6832,6838,6842,6859,6863,6886,6924,6933,6938,6958,6966,7005,7025,7029,7034,7054,7069,7076,7080,7085,7101,7116,7120,7142,7146,7151,7174,7178,7185,7189,7200,7221,7230,7242,7261,7276,7283,7287,7297,7319,7325,7329],{"__ignoreMap":1052},[1072,6777,6778],{"class":1074,"line":1075},[1072,6779,6780],{"class":1078},"# Custom template tags for dynamic caching\n",[1072,6782,6783,6785,6788,6790],{"class":1074,"line":1082},[1072,6784,1952],{"class":1951},[1072,6786,6787],{"class":1955}," django ",[1072,6789,1970],{"class":1951},[1072,6791,6792],{"class":1955}," template\n",[1072,6794,6795,6797,6799,6801,6803,6805,6807,6809],{"class":1074,"line":1096},[1072,6796,1952],{"class":1951},[1072,6798,1956],{"class":1955},[1072,6800,1959],{"class":1089},[1072,6802,1962],{"class":1955},[1072,6804,1959],{"class":1089},[1072,6806,1967],{"class":1955},[1072,6808,1970],{"class":1951},[1072,6810,1973],{"class":1955},[1072,6812,6813,6815,6817,6819,6822,6824,6827,6829],{"class":1074,"line":1115},[1072,6814,1952],{"class":1951},[1072,6816,1956],{"class":1955},[1072,6818,1959],{"class":1089},[1072,6820,6821],{"class":1955},"template",[1072,6823,1959],{"class":1089},[1072,6825,6826],{"class":1955},"loader ",[1072,6828,1970],{"class":1951},[1072,6830,6831],{"class":1955}," render_to_string\n",[1072,6833,6834,6836],{"class":1074,"line":1139},[1072,6835,1970],{"class":1951},[1072,6837,2005],{"class":1955},[1072,6839,6840],{"class":1074,"line":1160},[1072,6841,1376],{"emptyLinePlaceholder":1375},[1072,6843,6844,6847,6849,6852,6854,6857],{"class":1074,"line":1174},[1072,6845,6846],{"class":1955},"register ",[1072,6848,2108],{"class":1089},[1072,6850,6851],{"class":1955}," template",[1072,6853,1959],{"class":1089},[1072,6855,6856],{"class":2138},"Library",[1072,6858,3447],{"class":1089},[1072,6860,6861],{"class":1074,"line":1196},[1072,6862,1376],{"emptyLinePlaceholder":1375},[1072,6864,6865,6867,6870,6872,6875,6877,6880,6882,6884],{"class":1074,"line":1210},[1072,6866,2545],{"class":1089},[1072,6868,6869],{"class":2064},"register",[1072,6871,1959],{"class":1089},[1072,6873,6874],{"class":2064},"simple_tag",[1072,6876,2068],{"class":1089},[1072,6878,6879],{"class":2215},"takes_context",[1072,6881,2108],{"class":1089},[1072,6883,2221],{"class":1241},[1072,6885,2419],{"class":1089},[1072,6887,6888,6890,6893,6895,6898,6900,6903,6905,6908,6910,6912,6914,6916,6918,6920,6922],{"class":1074,"line":1229},[1072,6889,2573],{"class":2021},[1072,6891,6892],{"class":2064}," cache_include",[1072,6894,2068],{"class":1089},[1072,6896,6897],{"class":2071},"context",[1072,6899,1354],{"class":1089},[1072,6901,6902],{"class":2071}," template_name",[1072,6904,1354],{"class":1089},[1072,6906,6907],{"class":2071}," cache_key",[1072,6909,1354],{"class":1089},[1072,6911,2502],{"class":2071},[1072,6913,2108],{"class":1720},[1072,6915,2275],{"class":1223},[1072,6917,1354],{"class":1089},[1072,6919,2084],{"class":1720},[1072,6921,2087],{"class":2071},[1072,6923,2090],{"class":1089},[1072,6925,6926,6928,6931],{"class":1074,"line":1247},[1072,6927,2035],{"class":2034},[1072,6929,6930],{"class":2038},"Include template with caching",[1072,6932,2042],{"class":2034},[1072,6934,6935],{"class":1074,"line":1253},[1072,6936,6937],{"class":1078},"    # Build complete cache key\n",[1072,6939,6940,6943,6945,6947,6950,6952,6954,6956],{"class":1074,"line":1274},[1072,6941,6942],{"class":1955},"    full_cache_key ",[1072,6944,2108],{"class":1089},[1072,6946,2111],{"class":2021},[1072,6948,6949],{"class":1103},"\"template_",[1072,6951,2118],{"class":2117},[1072,6953,2416],{"class":1955},[1072,6955,2123],{"class":2117},[1072,6957,2163],{"class":1103},[1072,6959,6960,6962,6964],{"class":1074,"line":1295},[1072,6961,5830],{"class":1951},[1072,6963,2171],{"class":1955},[1072,6965,2029],{"class":1089},[1072,6967,6968,6971,6973,6975,6977,6979,6981,6983,6985,6987,6989,6991,6993,6995,6997,6999,7001,7003],{"class":1074,"line":1301},[1072,6969,6970],{"class":1955},"        key_suffix ",[1072,6972,2108],{"class":1089},[1072,6974,4587],{"class":1955},[1072,6976,1959],{"class":1089},[1072,6978,2196],{"class":2138},[1072,6980,2068],{"class":1089},[1072,6982,2150],{"class":2055},[1072,6984,2068],{"class":1089},[1072,6986,4603],{"class":2144},[1072,6988,2068],{"class":1089},[1072,6990,2087],{"class":2138},[1072,6992,1959],{"class":1089},[1072,6994,4616],{"class":2138},[1072,6996,4619],{"class":1089},[1072,6998,2227],{"class":2138},[1072,7000,2230],{"class":1089},[1072,7002,2233],{"class":2138},[1072,7004,3447],{"class":1089},[1072,7006,7007,7010,7012,7014,7016,7018,7021,7023],{"class":1074,"line":1322},[1072,7008,7009],{"class":1955},"        full_cache_key ",[1072,7011,2181],{"class":1089},[1072,7013,2111],{"class":2021},[1072,7015,4644],{"class":1103},[1072,7017,2118],{"class":2117},[1072,7019,7020],{"class":1955},"key_suffix",[1072,7022,2123],{"class":2117},[1072,7024,2163],{"class":1103},[1072,7026,7027],{"class":1074,"line":1339},[1072,7028,2047],{"class":1955},[1072,7030,7031],{"class":1074,"line":1360},[1072,7032,7033],{"class":1078},"    # Try to get from cache\n",[1072,7035,7036,7039,7041,7043,7045,7047,7049,7052],{"class":1074,"line":1366},[1072,7037,7038],{"class":1955},"    cached_content ",[1072,7040,2108],{"class":1089},[1072,7042,2406],{"class":1955},[1072,7044,1959],{"class":1089},[1072,7046,2411],{"class":2138},[1072,7048,2068],{"class":1089},[1072,7050,7051],{"class":2138},"full_cache_key",[1072,7053,2419],{"class":1089},[1072,7055,7056,7058,7061,7063,7065,7067],{"class":1074,"line":1372},[1072,7057,5830],{"class":1951},[1072,7059,7060],{"class":1955}," cached_content ",[1072,7062,2430],{"class":1720},[1072,7064,2433],{"class":1720},[1072,7066,2436],{"class":1241},[1072,7068,2029],{"class":1089},[1072,7070,7071,7073],{"class":1074,"line":1379},[1072,7072,2245],{"class":1951},[1072,7074,7075],{"class":1955}," cached_content\n",[1072,7077,7078],{"class":1074,"line":1385},[1072,7079,2047],{"class":1955},[1072,7081,7082],{"class":1074,"line":1394},[1072,7083,7084],{"class":1078},"    # Render template\n",[1072,7086,7087,7090,7092,7094,7096,7099],{"class":1074,"line":1407},[1072,7088,7089],{"class":1955},"    template_context ",[1072,7091,2108],{"class":1089},[1072,7093,4982],{"class":1955},[1072,7095,1959],{"class":1089},[1072,7097,7098],{"class":2138},"flatten",[1072,7100,3447],{"class":1089},[1072,7102,7103,7106,7108,7110,7112,7114],{"class":1074,"line":1426},[1072,7104,7105],{"class":1955},"    template_context",[1072,7107,1959],{"class":1089},[1072,7109,3898],{"class":2138},[1072,7111,2068],{"class":1089},[1072,7113,2087],{"class":2138},[1072,7115,2419],{"class":1089},[1072,7117,7118],{"class":1074,"line":1445},[1072,7119,2047],{"class":1955},[1072,7121,7122,7125,7127,7130,7132,7135,7137,7140],{"class":1074,"line":1458},[1072,7123,7124],{"class":1955},"    content ",[1072,7126,2108],{"class":1089},[1072,7128,7129],{"class":2138}," render_to_string",[1072,7131,2068],{"class":1089},[1072,7133,7134],{"class":2138},"template_name",[1072,7136,1354],{"class":1089},[1072,7138,7139],{"class":2138}," template_context",[1072,7141,2419],{"class":1089},[1072,7143,7144],{"class":1074,"line":1477},[1072,7145,2047],{"class":1955},[1072,7147,7148],{"class":1074,"line":1482},[1072,7149,7150],{"class":1078},"    # Cache the result\n",[1072,7152,7153,7155,7157,7159,7161,7163,7165,7168,7170,7172],{"class":1074,"line":1497},[1072,7154,6010],{"class":1955},[1072,7156,1959],{"class":1089},[1072,7158,2488],{"class":2138},[1072,7160,2068],{"class":1089},[1072,7162,7051],{"class":2138},[1072,7164,1354],{"class":1089},[1072,7166,7167],{"class":2138}," content",[1072,7169,1354],{"class":1089},[1072,7171,2502],{"class":2138},[1072,7173,2419],{"class":1089},[1072,7175,7176],{"class":1074,"line":1503},[1072,7177,2047],{"class":1955},[1072,7179,7180,7182],{"class":1074,"line":1517},[1072,7181,2607],{"class":1951},[1072,7183,7184],{"class":1955}," content\n",[1072,7186,7187],{"class":1074,"line":1536},[1072,7188,1376],{"emptyLinePlaceholder":1375},[1072,7190,7191,7193,7195,7197],{"class":1074,"line":1556},[1072,7192,2545],{"class":1089},[1072,7194,6869],{"class":2064},[1072,7196,1959],{"class":1089},[1072,7198,7199],{"class":2064},"simple_tag\n",[1072,7201,7202,7204,7207,7209,7211,7213,7215,7217,7219],{"class":1074,"line":1569},[1072,7203,2573],{"class":2021},[1072,7205,7206],{"class":2064}," cache_expensive_computation",[1072,7208,2068],{"class":1089},[1072,7210,2416],{"class":2071},[1072,7212,1354],{"class":1089},[1072,7214,2502],{"class":2071},[1072,7216,2108],{"class":1720},[1072,7218,2275],{"class":1223},[1072,7220,2090],{"class":1089},[1072,7222,7223,7225,7228],{"class":1074,"line":1588},[1072,7224,2035],{"class":2034},[1072,7226,7227],{"class":2038},"Cache expensive computations in templates",[1072,7229,2042],{"class":2034},[1072,7231,7232,7234,7236,7238,7240],{"class":1074,"line":1593},[1072,7233,2061],{"class":2021},[1072,7235,2294],{"class":2064},[1072,7237,2068],{"class":1089},[1072,7239,2299],{"class":2071},[1072,7241,2090],{"class":1089},[1072,7243,7244,7247,7249,7251,7253,7255,7257,7259],{"class":1074,"line":1612},[1072,7245,7246],{"class":1955},"        cached_result ",[1072,7248,2108],{"class":1089},[1072,7250,2406],{"class":1955},[1072,7252,1959],{"class":1089},[1072,7254,2411],{"class":2138},[1072,7256,2068],{"class":1089},[1072,7258,2416],{"class":2138},[1072,7260,2419],{"class":1089},[1072,7262,7263,7265,7268,7270,7272,7274],{"class":1074,"line":1617},[1072,7264,2168],{"class":1951},[1072,7266,7267],{"class":1955}," cached_result ",[1072,7269,2430],{"class":1720},[1072,7271,2433],{"class":1720},[1072,7273,2436],{"class":1241},[1072,7275,2029],{"class":1089},[1072,7277,7278,7280],{"class":1074,"line":1631},[1072,7279,2521],{"class":1951},[1072,7281,7282],{"class":1955}," cached_result\n",[1072,7284,7285],{"class":1074,"line":1650},[1072,7286,3280],{"class":1955},[1072,7288,7289,7291,7293,7295],{"class":1074,"line":1670},[1072,7290,3290],{"class":1955},[1072,7292,2108],{"class":1089},[1072,7294,2464],{"class":2138},[1072,7296,3447],{"class":1089},[1072,7298,7299,7301,7303,7305,7307,7309,7311,7313,7315,7317],{"class":1074,"line":1683},[1072,7300,5843],{"class":1955},[1072,7302,1959],{"class":1089},[1072,7304,2488],{"class":2138},[1072,7306,2068],{"class":1089},[1072,7308,2416],{"class":2138},[1072,7310,1354],{"class":1089},[1072,7312,2497],{"class":2138},[1072,7314,1354],{"class":1089},[1072,7316,2502],{"class":2138},[1072,7318,2419],{"class":1089},[1072,7320,7321,7323],{"class":1074,"line":1702},[1072,7322,2245],{"class":1951},[1072,7324,2446],{"class":1955},[1072,7326,7327],{"class":1074,"line":1707},[1072,7328,2047],{"class":1955},[1072,7330,7331,7333],{"class":1074,"line":1732},[1072,7332,2607],{"class":1951},[1072,7334,2531],{"class":1955},[1030,7336,7338],{"id":7337},"database-query-result-caching","Database Query Result Caching",[1038,7340,7342],{"id":7341},"orm-query-caching","ORM Query Caching",[1043,7344,7346],{"className":1066,"code":7345,"language":1068,"meta":1052,"style":1052},"from django.core.cache import cache\nfrom django.db import models\nimport hashlib\n\nclass CachedQuerySet(models.QuerySet):\n    \"\"\"QuerySet with automatic caching\"\"\"\n    \n    def cache(self, timeout=300, key_prefix=None):\n        \"\"\"Enable caching for this queryset\"\"\"\n        self._cache_timeout = timeout\n        self._cache_key_prefix = key_prefix or self.model._meta.label_lower\n        return self\n    \n    def _get_cache_key(self):\n        \"\"\"Generate cache key from query\"\"\"\n        query_str = str(self.query)\n        query_hash = hashlib.md5(query_str.encode()).hexdigest()\n        return f\"{self._cache_key_prefix}_query_{query_hash}\"\n    \n    def __iter__(self):\n        if hasattr(self, '_cache_timeout'):\n            cache_key = self._get_cache_key()\n            cached_result = cache.get(cache_key)\n            \n            if cached_result is not None:\n                return iter(cached_result)\n            \n            # Execute query and cache results\n            result = list(super().__iter__())\n            cache.set(cache_key, result, self._cache_timeout)\n            return iter(result)\n        \n        return super().__iter__()\n\nclass CachedManager(models.Manager):\n    \"\"\"Manager with caching support\"\"\"\n    \n    def get_queryset(self):\n        return CachedQuerySet(self.model, using=self._db)\n    \n    def cached(self, timeout=300, key_prefix=None):\n        \"\"\"Get cached queryset\"\"\"\n        return self.get_queryset().cache(timeout, key_prefix)\n\n# Model with caching\nclass Product(models.Model):\n    name = models.CharField(max_length=200)\n    category = models.ForeignKey('Category', on_delete=models.CASCADE)\n    price = models.DecimalField(max_digits=10, decimal_places=2)\n    is_active = models.BooleanField(default=True)\n    \n    objects = CachedManager()\n    \n    @classmethod\n    def get_popular_products(cls, limit=10, timeout=3600):\n        \"\"\"Get popular products with caching\"\"\"\n        cache_key = f\"popular_products_{limit}\"\n        cached_products = cache.get(cache_key)\n        \n        if cached_products is None:\n            cached_products = list(\n                cls.objects.filter(is_active=True)\n                .annotate(order_count=Count('orderitem'))\n                .order_by('-order_count')[:limit]\n            )\n            cache.set(cache_key, cached_products, timeout)\n        \n        return cached_products\n\n# Usage\npopular_products = Product.objects.cached(timeout=1800).filter(\n    is_active=True\n).select_related('category')[:20]\n",[1050,7347,7348,7366,7382,7388,7392,7410,7419,7423,7452,7461,7475,7507,7514,7518,7531,7540,7560,7588,7617,7621,7634,7654,7670,7689,7693,7707,7721,7725,7730,7752,7778,7791,7795,7808,7812,7830,7839,7843,7855,7885,7889,7918,7927,7952,7956,7961,7978,8005,8044,8079,8103,8107,8118,8122,8129,8158,8166,8186,8205,8209,8222,8233,8256,8284,8305,8310,8333,8337,8344,8348,8353,8386,8395],{"__ignoreMap":1052},[1072,7349,7350,7352,7354,7356,7358,7360,7362,7364],{"class":1074,"line":1075},[1072,7351,1952],{"class":1951},[1072,7353,1956],{"class":1955},[1072,7355,1959],{"class":1089},[1072,7357,1962],{"class":1955},[1072,7359,1959],{"class":1089},[1072,7361,1967],{"class":1955},[1072,7363,1970],{"class":1951},[1072,7365,1973],{"class":1955},[1072,7367,7368,7370,7372,7374,7377,7379],{"class":1074,"line":1082},[1072,7369,1952],{"class":1951},[1072,7371,1956],{"class":1955},[1072,7373,1959],{"class":1089},[1072,7375,7376],{"class":1955},"db ",[1072,7378,1970],{"class":1951},[1072,7380,7381],{"class":1955}," models\n",[1072,7383,7384,7386],{"class":1074,"line":1096},[1072,7385,1970],{"class":1951},[1072,7387,2005],{"class":1955},[1072,7389,7390],{"class":1074,"line":1115},[1072,7391,1376],{"emptyLinePlaceholder":1375},[1072,7393,7394,7396,7399,7401,7403,7405,7408],{"class":1074,"line":1139},[1072,7395,2022],{"class":2021},[1072,7397,7398],{"class":2025}," CachedQuerySet",[1072,7400,2068],{"class":1089},[1072,7402,3087],{"class":5067},[1072,7404,1959],{"class":1089},[1072,7406,7407],{"class":5067},"QuerySet",[1072,7409,2090],{"class":1089},[1072,7411,7412,7414,7417],{"class":1074,"line":1160},[1072,7413,2035],{"class":2034},[1072,7415,7416],{"class":2038},"QuerySet with automatic caching",[1072,7418,2042],{"class":2034},[1072,7420,7421],{"class":1074,"line":1174},[1072,7422,2047],{"class":1955},[1072,7424,7425,7427,7429,7431,7433,7435,7437,7439,7441,7443,7446,7448,7450],{"class":1074,"line":1196},[1072,7426,2061],{"class":2021},[1072,7428,2406],{"class":2064},[1072,7430,2068],{"class":1089},[1072,7432,3164],{"class":3163},[1072,7434,1354],{"class":1089},[1072,7436,2502],{"class":2071},[1072,7438,2108],{"class":1720},[1072,7440,2275],{"class":1223},[1072,7442,1354],{"class":1089},[1072,7444,7445],{"class":2071}," key_prefix",[1072,7447,2108],{"class":1720},[1072,7449,5288],{"class":1241},[1072,7451,2090],{"class":1089},[1072,7453,7454,7456,7459],{"class":1074,"line":1210},[1072,7455,2095],{"class":2034},[1072,7457,7458],{"class":2038},"Enable caching for this queryset",[1072,7460,2042],{"class":2034},[1072,7462,7463,7465,7467,7470,7472],{"class":1074,"line":1229},[1072,7464,3184],{"class":1085},[1072,7466,1959],{"class":1089},[1072,7468,7469],{"class":2615},"_cache_timeout",[1072,7471,1090],{"class":1089},[1072,7473,7474],{"class":1955}," timeout\n",[1072,7476,7477,7479,7481,7484,7486,7489,7492,7494,7496,7499,7501,7503,7505],{"class":1074,"line":1247},[1072,7478,3184],{"class":1085},[1072,7480,1959],{"class":1089},[1072,7482,7483],{"class":2615},"_cache_key_prefix",[1072,7485,1090],{"class":1089},[1072,7487,7488],{"class":1955}," key_prefix ",[1072,7490,7491],{"class":1720},"or",[1072,7493,3295],{"class":1085},[1072,7495,1959],{"class":1089},[1072,7497,7498],{"class":2615},"model",[1072,7500,1959],{"class":1089},[1072,7502,5314],{"class":2615},[1072,7504,1959],{"class":1089},[1072,7506,5319],{"class":2615},[1072,7508,7509,7511],{"class":1074,"line":1253},[1072,7510,2245],{"class":1951},[1072,7512,7513],{"class":1085}," self\n",[1072,7515,7516],{"class":1074,"line":1274},[1072,7517,2047],{"class":1955},[1072,7519,7520,7522,7525,7527,7529],{"class":1074,"line":1295},[1072,7521,2061],{"class":2021},[1072,7523,7524],{"class":2064}," _get_cache_key",[1072,7526,2068],{"class":1089},[1072,7528,3164],{"class":3163},[1072,7530,2090],{"class":1089},[1072,7532,7533,7535,7538],{"class":1074,"line":1301},[1072,7534,2095],{"class":2034},[1072,7536,7537],{"class":2038},"Generate cache key from query",[1072,7539,2042],{"class":2034},[1072,7541,7542,7545,7547,7549,7551,7553,7555,7558],{"class":1074,"line":1322},[1072,7543,7544],{"class":1955},"        query_str ",[1072,7546,2108],{"class":1089},[1072,7548,4236],{"class":2055},[1072,7550,2068],{"class":1089},[1072,7552,3164],{"class":1085},[1072,7554,1959],{"class":1089},[1072,7556,7557],{"class":2615},"query",[1072,7559,2419],{"class":1089},[1072,7561,7562,7565,7567,7569,7571,7573,7575,7578,7580,7582,7584,7586],{"class":1074,"line":1339},[1072,7563,7564],{"class":1955},"        query_hash ",[1072,7566,2108],{"class":1089},[1072,7568,4587],{"class":1955},[1072,7570,1959],{"class":1089},[1072,7572,2196],{"class":2138},[1072,7574,2068],{"class":1089},[1072,7576,7577],{"class":2138},"query_str",[1072,7579,1959],{"class":1089},[1072,7581,2227],{"class":2138},[1072,7583,2230],{"class":1089},[1072,7585,2233],{"class":2138},[1072,7587,3447],{"class":1089},[1072,7589,7590,7592,7594,7596,7598,7600,7602,7604,7606,7609,7611,7613,7615],{"class":1074,"line":1360},[1072,7591,2245],{"class":1951},[1072,7593,2111],{"class":2021},[1072,7595,2114],{"class":1103},[1072,7597,2118],{"class":2117},[1072,7599,3164],{"class":1085},[1072,7601,1959],{"class":1089},[1072,7603,7483],{"class":2615},[1072,7605,2123],{"class":2117},[1072,7607,7608],{"class":1103},"_query_",[1072,7610,2118],{"class":2117},[1072,7612,4649],{"class":1955},[1072,7614,2123],{"class":2117},[1072,7616,2163],{"class":1103},[1072,7618,7619],{"class":1074,"line":1366},[1072,7620,2047],{"class":1955},[1072,7622,7623,7625,7628,7630,7632],{"class":1074,"line":1372},[1072,7624,2061],{"class":2021},[1072,7626,7627],{"class":2144}," __iter__",[1072,7629,2068],{"class":1089},[1072,7631,3164],{"class":3163},[1072,7633,2090],{"class":1089},[1072,7635,7636,7638,7640,7642,7644,7646,7648,7650,7652],{"class":1074,"line":1379},[1072,7637,2168],{"class":1951},[1072,7639,3611],{"class":2144},[1072,7641,2068],{"class":1089},[1072,7643,3164],{"class":1085},[1072,7645,1354],{"class":1089},[1072,7647,1128],{"class":1099},[1072,7649,7469],{"class":1103},[1072,7651,1107],{"class":1099},[1072,7653,2090],{"class":1089},[1072,7655,7656,7659,7661,7663,7665,7668],{"class":1074,"line":1385},[1072,7657,7658],{"class":1955},"            cache_key ",[1072,7660,2108],{"class":1089},[1072,7662,3295],{"class":1085},[1072,7664,1959],{"class":1089},[1072,7666,7667],{"class":2138},"_get_cache_key",[1072,7669,3447],{"class":1089},[1072,7671,7672,7675,7677,7679,7681,7683,7685,7687],{"class":1074,"line":1394},[1072,7673,7674],{"class":1955},"            cached_result ",[1072,7676,2108],{"class":1089},[1072,7678,2406],{"class":1955},[1072,7680,1959],{"class":1089},[1072,7682,2411],{"class":2138},[1072,7684,2068],{"class":1089},[1072,7686,2416],{"class":2138},[1072,7688,2419],{"class":1089},[1072,7690,7691],{"class":1074,"line":1407},[1072,7692,2516],{"class":1955},[1072,7694,7695,7697,7699,7701,7703,7705],{"class":1074,"line":1426},[1072,7696,3855],{"class":1951},[1072,7698,7267],{"class":1955},[1072,7700,2430],{"class":1720},[1072,7702,2433],{"class":1720},[1072,7704,2436],{"class":1241},[1072,7706,2029],{"class":1089},[1072,7708,7709,7711,7714,7716,7719],{"class":1074,"line":1445},[1072,7710,2509],{"class":1951},[1072,7712,7713],{"class":2144}," iter",[1072,7715,2068],{"class":1089},[1072,7717,7718],{"class":2138},"cached_result",[1072,7720,2419],{"class":1089},[1072,7722,7723],{"class":1074,"line":1458},[1072,7724,2516],{"class":1955},[1072,7726,7727],{"class":1074,"line":1477},[1072,7728,7729],{"class":1078},"            # Execute query and cache results\n",[1072,7731,7732,7735,7737,7740,7742,7745,7747,7750],{"class":1074,"line":1482},[1072,7733,7734],{"class":1955},"            result ",[1072,7736,2108],{"class":1089},[1072,7738,7739],{"class":2055}," list",[1072,7741,2068],{"class":1089},[1072,7743,7744],{"class":2055},"super",[1072,7746,3022],{"class":1089},[1072,7748,7749],{"class":2144},"__iter__",[1072,7751,3744],{"class":1089},[1072,7753,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776],{"class":1074,"line":1497},[1072,7755,5501],{"class":1955},[1072,7757,1959],{"class":1089},[1072,7759,2488],{"class":2138},[1072,7761,2068],{"class":1089},[1072,7763,2416],{"class":2138},[1072,7765,1354],{"class":1089},[1072,7767,2497],{"class":2138},[1072,7769,1354],{"class":1089},[1072,7771,3295],{"class":1085},[1072,7773,1959],{"class":1089},[1072,7775,7469],{"class":2615},[1072,7777,2419],{"class":1089},[1072,7779,7780,7782,7784,7786,7789],{"class":1074,"line":1503},[1072,7781,2521],{"class":1951},[1072,7783,7713],{"class":2144},[1072,7785,2068],{"class":1089},[1072,7787,7788],{"class":2138},"result",[1072,7790,2419],{"class":1089},[1072,7792,7793],{"class":1074,"line":1517},[1072,7794,3280],{"class":1955},[1072,7796,7797,7799,7802,7804,7806],{"class":1074,"line":1536},[1072,7798,2245],{"class":1951},[1072,7800,7801],{"class":2055}," super",[1072,7803,3022],{"class":1089},[1072,7805,7749],{"class":2144},[1072,7807,3447],{"class":1089},[1072,7809,7810],{"class":1074,"line":1556},[1072,7811,1376],{"emptyLinePlaceholder":1375},[1072,7813,7814,7816,7819,7821,7823,7825,7828],{"class":1074,"line":1569},[1072,7815,2022],{"class":2021},[1072,7817,7818],{"class":2025}," CachedManager",[1072,7820,2068],{"class":1089},[1072,7822,3087],{"class":5067},[1072,7824,1959],{"class":1089},[1072,7826,7827],{"class":5067},"Manager",[1072,7829,2090],{"class":1089},[1072,7831,7832,7834,7837],{"class":1074,"line":1588},[1072,7833,2035],{"class":2034},[1072,7835,7836],{"class":2038},"Manager with caching support",[1072,7838,2042],{"class":2034},[1072,7840,7841],{"class":1074,"line":1593},[1072,7842,2047],{"class":1955},[1072,7844,7845,7847,7849,7851,7853],{"class":1074,"line":1612},[1072,7846,2061],{"class":2021},[1072,7848,5124],{"class":2064},[1072,7850,2068],{"class":1089},[1072,7852,3164],{"class":3163},[1072,7854,2090],{"class":1089},[1072,7856,7857,7859,7861,7863,7865,7867,7869,7871,7874,7876,7878,7880,7883],{"class":1074,"line":1617},[1072,7858,2245],{"class":1951},[1072,7860,7398],{"class":2138},[1072,7862,2068],{"class":1089},[1072,7864,3164],{"class":1085},[1072,7866,1959],{"class":1089},[1072,7868,7498],{"class":2615},[1072,7870,1354],{"class":1089},[1072,7872,7873],{"class":2215}," using",[1072,7875,2108],{"class":1089},[1072,7877,3164],{"class":1085},[1072,7879,1959],{"class":1089},[1072,7881,7882],{"class":2615},"_db",[1072,7884,2419],{"class":1089},[1072,7886,7887],{"class":1074,"line":1631},[1072,7888,2047],{"class":1955},[1072,7890,7891,7893,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916],{"class":1074,"line":1650},[1072,7892,2061],{"class":2021},[1072,7894,7895],{"class":2064}," cached",[1072,7897,2068],{"class":1089},[1072,7899,3164],{"class":3163},[1072,7901,1354],{"class":1089},[1072,7903,2502],{"class":2071},[1072,7905,2108],{"class":1720},[1072,7907,2275],{"class":1223},[1072,7909,1354],{"class":1089},[1072,7911,7445],{"class":2071},[1072,7913,2108],{"class":1720},[1072,7915,5288],{"class":1241},[1072,7917,2090],{"class":1089},[1072,7919,7920,7922,7925],{"class":1074,"line":1670},[1072,7921,2095],{"class":2034},[1072,7923,7924],{"class":2038},"Get cached queryset",[1072,7926,2042],{"class":2034},[1072,7928,7929,7931,7933,7935,7938,7940,7942,7944,7946,7948,7950],{"class":1074,"line":1683},[1072,7930,2245],{"class":1951},[1072,7932,3295],{"class":1085},[1072,7934,1959],{"class":1089},[1072,7936,7937],{"class":2138},"get_queryset",[1072,7939,3022],{"class":1089},[1072,7941,1988],{"class":2138},[1072,7943,2068],{"class":1089},[1072,7945,2270],{"class":2138},[1072,7947,1354],{"class":1089},[1072,7949,7445],{"class":2138},[1072,7951,2419],{"class":1089},[1072,7953,7954],{"class":1074,"line":1702},[1072,7955,1376],{"emptyLinePlaceholder":1375},[1072,7957,7958],{"class":1074,"line":1707},[1072,7959,7960],{"class":1078},"# Model with caching\n",[1072,7962,7963,7965,7967,7969,7971,7973,7976],{"class":1074,"line":1732},[1072,7964,2022],{"class":2021},[1072,7966,2610],{"class":2025},[1072,7968,2068],{"class":1089},[1072,7970,3087],{"class":5067},[1072,7972,1959],{"class":1089},[1072,7974,7975],{"class":5067},"Model",[1072,7977,2090],{"class":1089},[1072,7979,7980,7983,7985,7988,7990,7993,7995,7998,8000,8003],{"class":1074,"line":1737},[1072,7981,7982],{"class":1955},"    name ",[1072,7984,2108],{"class":1089},[1072,7986,7987],{"class":1955}," models",[1072,7989,1959],{"class":1089},[1072,7991,7992],{"class":2138},"CharField",[1072,7994,2068],{"class":1089},[1072,7996,7997],{"class":2215},"max_length",[1072,7999,2108],{"class":1089},[1072,8001,8002],{"class":1223},"200",[1072,8004,2419],{"class":1089},[1072,8006,8007,8010,8012,8014,8016,8019,8021,8023,8026,8028,8030,8033,8035,8037,8039,8042],{"class":1074,"line":1742},[1072,8008,8009],{"class":1955},"    category ",[1072,8011,2108],{"class":1089},[1072,8013,7987],{"class":1955},[1072,8015,1959],{"class":1089},[1072,8017,8018],{"class":2138},"ForeignKey",[1072,8020,2068],{"class":1089},[1072,8022,1107],{"class":1099},[1072,8024,8025],{"class":1103},"Category",[1072,8027,1107],{"class":1099},[1072,8029,1354],{"class":1089},[1072,8031,8032],{"class":2215}," on_delete",[1072,8034,2108],{"class":1089},[1072,8036,3087],{"class":2138},[1072,8038,1959],{"class":1089},[1072,8040,8041],{"class":4574},"CASCADE",[1072,8043,2419],{"class":1089},[1072,8045,8046,8049,8051,8053,8055,8058,8060,8063,8065,8067,8069,8072,8074,8077],{"class":1074,"line":1747},[1072,8047,8048],{"class":1955},"    price ",[1072,8050,2108],{"class":1089},[1072,8052,7987],{"class":1955},[1072,8054,1959],{"class":1089},[1072,8056,8057],{"class":2138},"DecimalField",[1072,8059,2068],{"class":1089},[1072,8061,8062],{"class":2215},"max_digits",[1072,8064,2108],{"class":1089},[1072,8066,2591],{"class":1223},[1072,8068,1354],{"class":1089},[1072,8070,8071],{"class":2215}," decimal_places",[1072,8073,2108],{"class":1089},[1072,8075,8076],{"class":1223},"2",[1072,8078,2419],{"class":1089},[1072,8080,8081,8084,8086,8088,8090,8093,8095,8097,8099,8101],{"class":1074,"line":1753},[1072,8082,8083],{"class":1955},"    is_active ",[1072,8085,2108],{"class":1089},[1072,8087,7987],{"class":1955},[1072,8089,1959],{"class":1089},[1072,8091,8092],{"class":2138},"BooleanField",[1072,8094,2068],{"class":1089},[1072,8096,1104],{"class":2215},[1072,8098,2108],{"class":1089},[1072,8100,2221],{"class":1241},[1072,8102,2419],{"class":1089},[1072,8104,8105],{"class":1074,"line":1769},[1072,8106,2047],{"class":1955},[1072,8108,8109,8112,8114,8116],{"class":1074,"line":2731},[1072,8110,8111],{"class":1955},"    objects ",[1072,8113,2108],{"class":1089},[1072,8115,7818],{"class":2138},[1072,8117,3447],{"class":1089},[1072,8119,8120],{"class":1074,"line":2746},[1072,8121,2047],{"class":1955},[1072,8123,8124,8126],{"class":1074,"line":2756},[1072,8125,2052],{"class":1089},[1072,8127,8128],{"class":2055},"classmethod\n",[1072,8130,8131,8133,8135,8137,8140,8142,8144,8146,8148,8150,8152,8154,8156],{"class":1074,"line":2786},[1072,8132,2061],{"class":2021},[1072,8134,2576],{"class":2064},[1072,8136,2068],{"class":1089},[1072,8138,8139],{"class":2071},"cls",[1072,8141,1354],{"class":1089},[1072,8143,2586],{"class":2071},[1072,8145,2108],{"class":1720},[1072,8147,2591],{"class":1223},[1072,8149,1354],{"class":1089},[1072,8151,2502],{"class":2071},[1072,8153,2108],{"class":1720},[1072,8155,2723],{"class":1223},[1072,8157,2090],{"class":1089},[1072,8159,8160,8162,8164],{"class":1074,"line":2791},[1072,8161,2095],{"class":2034},[1072,8163,2600],{"class":2038},[1072,8165,2042],{"class":2034},[1072,8167,8168,8171,8173,8175,8178,8180,8182,8184],{"class":1074,"line":2801},[1072,8169,8170],{"class":1955},"        cache_key ",[1072,8172,2108],{"class":1089},[1072,8174,2111],{"class":2021},[1072,8176,8177],{"class":1103},"\"popular_products_",[1072,8179,2118],{"class":2117},[1072,8181,2697],{"class":1955},[1072,8183,2123],{"class":2117},[1072,8185,2163],{"class":1103},[1072,8187,8188,8191,8193,8195,8197,8199,8201,8203],{"class":1074,"line":2828},[1072,8189,8190],{"class":1955},"        cached_products ",[1072,8192,2108],{"class":1089},[1072,8194,2406],{"class":1955},[1072,8196,1959],{"class":1089},[1072,8198,2411],{"class":2138},[1072,8200,2068],{"class":1089},[1072,8202,2416],{"class":2138},[1072,8204,2419],{"class":1089},[1072,8206,8207],{"class":1074,"line":2853},[1072,8208,3280],{"class":1955},[1072,8210,8211,8213,8216,8218,8220],{"class":1074,"line":2875},[1072,8212,2168],{"class":1951},[1072,8214,8215],{"class":1955}," cached_products ",[1072,8217,2430],{"class":1720},[1072,8219,2436],{"class":1241},[1072,8221,2029],{"class":1089},[1072,8223,8224,8227,8229,8231],{"class":1074,"line":2899},[1072,8225,8226],{"class":1955},"            cached_products ",[1072,8228,2108],{"class":1089},[1072,8230,7739],{"class":2055},[1072,8232,2346],{"class":1089},[1072,8234,8235,8238,8240,8242,8244,8246,8248,8250,8252,8254],{"class":1074,"line":2924},[1072,8236,8237],{"class":1085},"                cls",[1072,8239,1959],{"class":1089},[1072,8241,2616],{"class":2615},[1072,8243,1959],{"class":1089},[1072,8245,2621],{"class":2138},[1072,8247,2068],{"class":1089},[1072,8249,5161],{"class":2215},[1072,8251,2108],{"class":1089},[1072,8253,2221],{"class":1241},[1072,8255,2419],{"class":1089},[1072,8257,8258,8261,8263,8265,8268,8270,8272,8274,8276,8279,8281],{"class":1074,"line":2934},[1072,8259,8260],{"class":1089},"                .",[1072,8262,2652],{"class":2138},[1072,8264,2068],{"class":1089},[1072,8266,8267],{"class":2215},"order_count",[1072,8269,2108],{"class":1089},[1072,8271,2664],{"class":2138},[1072,8273,2068],{"class":1089},[1072,8275,1107],{"class":1099},[1072,8277,8278],{"class":1103},"orderitem",[1072,8280,1107],{"class":1099},[1072,8282,8283],{"class":1089},"))\n",[1072,8285,8286,8288,8290,8292,8294,8297,8299,8301,8303],{"class":1074,"line":2944},[1072,8287,8260],{"class":1089},[1072,8289,2682],{"class":2138},[1072,8291,2068],{"class":1089},[1072,8293,1107],{"class":1099},[1072,8295,8296],{"class":1103},"-order_count",[1072,8298,1107],{"class":1099},[1072,8300,2694],{"class":1089},[1072,8302,2697],{"class":2138},[1072,8304,2700],{"class":1089},[1072,8306,8307],{"class":1074,"line":2964},[1072,8308,8309],{"class":1089},"            )\n",[1072,8311,8312,8314,8316,8318,8320,8322,8324,8327,8329,8331],{"class":1074,"line":2987},[1072,8313,5501],{"class":1955},[1072,8315,1959],{"class":1089},[1072,8317,2488],{"class":2138},[1072,8319,2068],{"class":1089},[1072,8321,2416],{"class":2138},[1072,8323,1354],{"class":1089},[1072,8325,8326],{"class":2138}," cached_products",[1072,8328,1354],{"class":1089},[1072,8330,2502],{"class":2138},[1072,8332,2419],{"class":1089},[1072,8334,8335],{"class":1074,"line":3028},[1072,8336,3280],{"class":1955},[1072,8338,8339,8341],{"class":1074,"line":3033},[1072,8340,2245],{"class":1951},[1072,8342,8343],{"class":1955}," cached_products\n",[1072,8345,8346],{"class":1074,"line":3038},[1072,8347,1376],{"emptyLinePlaceholder":1375},[1072,8349,8350],{"class":1074,"line":3938},[1072,8351,8352],{"class":1078},"# Usage\n",[1072,8354,8355,8358,8360,8362,8364,8366,8368,8371,8373,8375,8377,8380,8382,8384],{"class":1074,"line":3943},[1072,8356,8357],{"class":1955},"popular_products ",[1072,8359,2108],{"class":1089},[1072,8361,2610],{"class":1955},[1072,8363,1959],{"class":1089},[1072,8365,2616],{"class":2615},[1072,8367,1959],{"class":1089},[1072,8369,8370],{"class":2138},"cached",[1072,8372,2068],{"class":1089},[1072,8374,2270],{"class":2215},[1072,8376,2108],{"class":1089},[1072,8378,8379],{"class":1223},"1800",[1072,8381,2224],{"class":1089},[1072,8383,2621],{"class":2138},[1072,8385,2346],{"class":1089},[1072,8387,8388,8391,8393],{"class":1074,"line":3958},[1072,8389,8390],{"class":2215},"    is_active",[1072,8392,2108],{"class":1089},[1072,8394,2644],{"class":1241},[1072,8396,8397,8399,8401,8403,8405,8407,8409,8411,8414],{"class":1074,"line":3968},[1072,8398,2224],{"class":1089},[1072,8400,4099],{"class":2138},[1072,8402,2068],{"class":1089},[1072,8404,1107],{"class":1099},[1072,8406,4106],{"class":1103},[1072,8408,1107],{"class":1099},[1072,8410,2694],{"class":1089},[1072,8412,8413],{"class":1223},"20",[1072,8415,2700],{"class":1089},[1038,8417,8419],{"id":8418},"aggregation-caching","Aggregation Caching",[1043,8421,8423],{"className":1066,"code":8422,"language":1068,"meta":1052,"style":1052},"class StatisticsCache:\n    \"\"\"Cache for expensive statistical computations\"\"\"\n    \n    @staticmethod\n    def get_daily_stats(date, recalculate=False):\n        \"\"\"Get daily statistics with caching\"\"\"\n        cache_key = f\"daily_stats_{date.strftime('%Y%m%d')}\"\n        \n        if not recalculate:\n            cached_stats = cache.get(cache_key)\n            if cached_stats is not None:\n                return cached_stats\n        \n        # Calculate statistics\n        stats = {\n            'total_orders': Order.objects.filter(\n                created_at__date=date\n            ).count(),\n            \n            'total_revenue': Order.objects.filter(\n                created_at__date=date,\n                status='completed'\n            ).aggregate(\n                total=Sum('total_amount')\n            )['total'] or 0,\n            \n            'new_users': User.objects.filter(\n                date_joined__date=date\n            ).count(),\n            \n            'top_products': list(\n                Product.objects.filter(\n                    orderitem__order__created_at__date=date\n                ).annotate(\n                    quantity_sold=Sum('orderitem__quantity')\n                ).order_by('-quantity_sold')[:5].values(\n                    'id', 'name', 'quantity_sold'\n                )\n            ),\n        }\n        \n        # Cache for 24 hours (longer for past dates)\n        timeout = 86400 if date \u003C timezone.now().date() else 3600\n        cache.set(cache_key, stats, timeout)\n        \n        return stats\n    \n    @staticmethod\n    def get_user_lifetime_value(user_id):\n        \"\"\"Calculate and cache user lifetime value\"\"\"\n        cache_key = f\"user_ltv_{user_id}\"\n        cached_ltv = cache.get(cache_key)\n        \n        if cached_ltv is None:\n            user_orders = Order.objects.filter(\n                user_id=user_id,\n                status='completed'\n            )\n            \n            ltv_data = user_orders.aggregate(\n                total_spent=Sum('total_amount'),\n                order_count=Count('id'),\n                avg_order_value=Avg('total_amount'),\n                first_order=Min('created_at'),\n                last_order=Max('created_at')\n            )\n            \n            # Calculate customer lifetime in days\n            if ltv_data['first_order'] and ltv_data['last_order']:\n                lifetime_days = (\n                    ltv_data['last_order'] - ltv_data['first_order']\n                ).days + 1\n                ltv_data['lifetime_days'] = lifetime_days\n                ltv_data['avg_days_between_orders'] = (\n                    lifetime_days / max(ltv_data['order_count'], 1)\n                )\n            \n            # Cache for 6 hours\n            cache.set(cache_key, ltv_data, 21600)\n            cached_ltv = ltv_data\n        \n        return cached_ltv\n",[1050,8424,8425,8434,8443,8447,8453,8477,8486,8524,8528,8538,8557,8572,8579,8583,8588,8597,8620,8630,8639,8643,8666,8676,8690,8698,8717,8736,8740,8763,8772,8780,8784,8799,8814,8823,8832,8852,8878,8904,8908,8913,8917,8921,8926,8963,8986,8990,8996,9000,9006,9019,9028,9047,9066,9070,9083,9102,9113,9125,9129,9133,9149,9168,9187,9207,9228,9248,9252,9256,9261,9295,9305,9334,9347,9368,9387,9417,9421,9425,9430,9453,9463,9467],{"__ignoreMap":1052},[1072,8426,8427,8429,8432],{"class":1074,"line":1075},[1072,8428,2022],{"class":2021},[1072,8430,8431],{"class":2025}," StatisticsCache",[1072,8433,2029],{"class":1089},[1072,8435,8436,8438,8441],{"class":1074,"line":1082},[1072,8437,2035],{"class":2034},[1072,8439,8440],{"class":2038},"Cache for expensive statistical computations",[1072,8442,2042],{"class":2034},[1072,8444,8445],{"class":1074,"line":1096},[1072,8446,2047],{"class":1955},[1072,8448,8449,8451],{"class":1074,"line":1115},[1072,8450,2052],{"class":1089},[1072,8452,2056],{"class":2055},[1072,8454,8455,8457,8460,8462,8465,8467,8470,8472,8475],{"class":1074,"line":1139},[1072,8456,2061],{"class":2021},[1072,8458,8459],{"class":2064}," get_daily_stats",[1072,8461,2068],{"class":1089},[1072,8463,8464],{"class":2071},"date",[1072,8466,1354],{"class":1089},[1072,8468,8469],{"class":2071}," recalculate",[1072,8471,2108],{"class":1720},[1072,8473,8474],{"class":1241},"False",[1072,8476,2090],{"class":1089},[1072,8478,8479,8481,8484],{"class":1074,"line":1160},[1072,8480,2095],{"class":2034},[1072,8482,8483],{"class":2038},"Get daily statistics with caching",[1072,8485,2042],{"class":2034},[1072,8487,8488,8490,8492,8494,8497,8499,8501,8503,8506,8508,8510,8513,8516,8518,8520,8522],{"class":1074,"line":1174},[1072,8489,8170],{"class":1955},[1072,8491,2108],{"class":1089},[1072,8493,2111],{"class":2021},[1072,8495,8496],{"class":1103},"\"daily_stats_",[1072,8498,2118],{"class":2117},[1072,8500,8464],{"class":1955},[1072,8502,1959],{"class":1089},[1072,8504,8505],{"class":2138},"strftime",[1072,8507,2068],{"class":1089},[1072,8509,1107],{"class":1099},[1072,8511,8512],{"class":1103},"%Y%m",[1072,8514,8515],{"class":2117},"%d",[1072,8517,1107],{"class":1099},[1072,8519,2565],{"class":1089},[1072,8521,2123],{"class":2117},[1072,8523,2163],{"class":1103},[1072,8525,8526],{"class":1074,"line":1196},[1072,8527,3280],{"class":1955},[1072,8529,8530,8532,8534,8536],{"class":1074,"line":1210},[1072,8531,2168],{"class":1951},[1072,8533,2433],{"class":1720},[1072,8535,8469],{"class":1955},[1072,8537,2029],{"class":1089},[1072,8539,8540,8543,8545,8547,8549,8551,8553,8555],{"class":1074,"line":1229},[1072,8541,8542],{"class":1955},"            cached_stats ",[1072,8544,2108],{"class":1089},[1072,8546,2406],{"class":1955},[1072,8548,1959],{"class":1089},[1072,8550,2411],{"class":2138},[1072,8552,2068],{"class":1089},[1072,8554,2416],{"class":2138},[1072,8556,2419],{"class":1089},[1072,8558,8559,8561,8564,8566,8568,8570],{"class":1074,"line":1247},[1072,8560,3855],{"class":1951},[1072,8562,8563],{"class":1955}," cached_stats ",[1072,8565,2430],{"class":1720},[1072,8567,2433],{"class":1720},[1072,8569,2436],{"class":1241},[1072,8571,2029],{"class":1089},[1072,8573,8574,8576],{"class":1074,"line":1253},[1072,8575,2509],{"class":1951},[1072,8577,8578],{"class":1955}," cached_stats\n",[1072,8580,8581],{"class":1074,"line":1274},[1072,8582,3280],{"class":1955},[1072,8584,8585],{"class":1074,"line":1295},[1072,8586,8587],{"class":1078},"        # Calculate statistics\n",[1072,8589,8590,8593,8595],{"class":1074,"line":1301},[1072,8591,8592],{"class":1955},"        stats ",[1072,8594,2108],{"class":1089},[1072,8596,1093],{"class":1089},[1072,8598,8599,8601,8603,8605,8607,8610,8612,8614,8616,8618],{"class":1074,"line":1322},[1072,8600,1177],{"class":1099},[1072,8602,2806],{"class":1103},[1072,8604,1107],{"class":1099},[1072,8606,1110],{"class":1089},[1072,8608,8609],{"class":1955}," Order",[1072,8611,1959],{"class":1089},[1072,8613,2616],{"class":2615},[1072,8615,1959],{"class":1089},[1072,8617,2621],{"class":2138},[1072,8619,2346],{"class":1089},[1072,8621,8622,8625,8627],{"class":1074,"line":1339},[1072,8623,8624],{"class":2215},"                created_at__date",[1072,8626,2108],{"class":1089},[1072,8628,8629],{"class":2138},"date\n",[1072,8631,8632,8635,8637],{"class":1074,"line":1360},[1072,8633,8634],{"class":1089},"            ).",[1072,8636,2822],{"class":2138},[1072,8638,2825],{"class":1089},[1072,8640,8641],{"class":1074,"line":1366},[1072,8642,2516],{"class":1955},[1072,8644,8645,8647,8650,8652,8654,8656,8658,8660,8662,8664],{"class":1074,"line":1372},[1072,8646,1177],{"class":1099},[1072,8648,8649],{"class":1103},"total_revenue",[1072,8651,1107],{"class":1099},[1072,8653,1110],{"class":1089},[1072,8655,8609],{"class":1955},[1072,8657,1959],{"class":1089},[1072,8659,2616],{"class":2615},[1072,8661,1959],{"class":1089},[1072,8663,2621],{"class":2138},[1072,8665,2346],{"class":1089},[1072,8667,8668,8670,8672,8674],{"class":1074,"line":1379},[1072,8669,8624],{"class":2215},[1072,8671,2108],{"class":1089},[1072,8673,8464],{"class":2138},[1072,8675,1136],{"class":1089},[1072,8677,8678,8681,8683,8685,8688],{"class":1074,"line":1385},[1072,8679,8680],{"class":2215},"                status",[1072,8682,2108],{"class":1089},[1072,8684,1107],{"class":1099},[1072,8686,8687],{"class":1103},"completed",[1072,8689,1766],{"class":1099},[1072,8691,8692,8694,8696],{"class":1074,"line":1394},[1072,8693,8634],{"class":1089},[1072,8695,2848],{"class":2138},[1072,8697,2346],{"class":1089},[1072,8699,8700,8703,8705,8707,8709,8711,8713,8715],{"class":1074,"line":1407},[1072,8701,8702],{"class":2215},"                total",[1072,8704,2108],{"class":1089},[1072,8706,2861],{"class":2138},[1072,8708,2068],{"class":1089},[1072,8710,1107],{"class":1099},[1072,8712,2868],{"class":1103},[1072,8714,1107],{"class":1099},[1072,8716,2419],{"class":1089},[1072,8718,8719,8722,8724,8726,8728,8730,8732,8734],{"class":1074,"line":1426},[1072,8720,8721],{"class":1089},"            )[",[1072,8723,1107],{"class":1099},[1072,8725,2883],{"class":1103},[1072,8727,1107],{"class":1099},[1072,8729,2888],{"class":1089},[1072,8731,2891],{"class":1720},[1072,8733,2894],{"class":1223},[1072,8735,1136],{"class":1089},[1072,8737,8738],{"class":1074,"line":1445},[1072,8739,2516],{"class":1955},[1072,8741,8742,8744,8747,8749,8751,8753,8755,8757,8759,8761],{"class":1074,"line":1458},[1072,8743,1177],{"class":1099},[1072,8745,8746],{"class":1103},"new_users",[1072,8748,1107],{"class":1099},[1072,8750,1110],{"class":1089},[1072,8752,2764],{"class":1955},[1072,8754,1959],{"class":1089},[1072,8756,2616],{"class":2615},[1072,8758,1959],{"class":1089},[1072,8760,2621],{"class":2138},[1072,8762,2346],{"class":1089},[1072,8764,8765,8768,8770],{"class":1074,"line":1477},[1072,8766,8767],{"class":2215},"                date_joined__date",[1072,8769,2108],{"class":1089},[1072,8771,8629],{"class":2138},[1072,8773,8774,8776,8778],{"class":1074,"line":1482},[1072,8775,8634],{"class":1089},[1072,8777,2822],{"class":2138},[1072,8779,2825],{"class":1089},[1072,8781,8782],{"class":1074,"line":1497},[1072,8783,2516],{"class":1955},[1072,8785,8786,8788,8791,8793,8795,8797],{"class":1074,"line":1503},[1072,8787,1177],{"class":1099},[1072,8789,8790],{"class":1103},"top_products",[1072,8792,1107],{"class":1099},[1072,8794,1110],{"class":1089},[1072,8796,7739],{"class":2055},[1072,8798,2346],{"class":1089},[1072,8800,8801,8804,8806,8808,8810,8812],{"class":1074,"line":1517},[1072,8802,8803],{"class":2138},"                Product",[1072,8805,1959],{"class":1089},[1072,8807,2616],{"class":2615},[1072,8809,1959],{"class":1089},[1072,8811,2621],{"class":2138},[1072,8813,2346],{"class":1089},[1072,8815,8816,8819,8821],{"class":1074,"line":1536},[1072,8817,8818],{"class":2215},"                    orderitem__order__created_at__date",[1072,8820,2108],{"class":1089},[1072,8822,8629],{"class":2138},[1072,8824,8825,8828,8830],{"class":1074,"line":1556},[1072,8826,8827],{"class":1089},"                ).",[1072,8829,2652],{"class":2138},[1072,8831,2346],{"class":1089},[1072,8833,8834,8837,8839,8841,8843,8845,8848,8850],{"class":1074,"line":1569},[1072,8835,8836],{"class":2215},"                    quantity_sold",[1072,8838,2108],{"class":1089},[1072,8840,2861],{"class":2138},[1072,8842,2068],{"class":1089},[1072,8844,1107],{"class":1099},[1072,8846,8847],{"class":1103},"orderitem__quantity",[1072,8849,1107],{"class":1099},[1072,8851,2419],{"class":1089},[1072,8853,8854,8856,8858,8860,8862,8865,8867,8869,8871,8874,8876],{"class":1074,"line":1588},[1072,8855,8827],{"class":1089},[1072,8857,2682],{"class":2138},[1072,8859,2068],{"class":1089},[1072,8861,1107],{"class":1099},[1072,8863,8864],{"class":1103},"-quantity_sold",[1072,8866,1107],{"class":1099},[1072,8868,2694],{"class":1089},[1072,8870,4906],{"class":1223},[1072,8872,8873],{"class":1089},"].",[1072,8875,2919],{"class":2138},[1072,8877,2346],{"class":1089},[1072,8879,8880,8883,8885,8887,8889,8891,8893,8895,8897,8899,8902],{"class":1074,"line":1593},[1072,8881,8882],{"class":1099},"                    '",[1072,8884,2777],{"class":1103},[1072,8886,1107],{"class":1099},[1072,8888,1354],{"class":1089},[1072,8890,1128],{"class":1099},[1072,8892,4209],{"class":1103},[1072,8894,1107],{"class":1099},[1072,8896,1354],{"class":1089},[1072,8898,1128],{"class":1099},[1072,8900,8901],{"class":1103},"quantity_sold",[1072,8903,1766],{"class":1099},[1072,8905,8906],{"class":1074,"line":1612},[1072,8907,2386],{"class":1089},[1072,8909,8910],{"class":1074,"line":1617},[1072,8911,8912],{"class":1089},"            ),\n",[1072,8914,8915],{"class":1074,"line":1631},[1072,8916,1925],{"class":1089},[1072,8918,8919],{"class":1074,"line":1650},[1072,8920,3280],{"class":1955},[1072,8922,8923],{"class":1074,"line":1670},[1072,8924,8925],{"class":1078},"        # Cache for 24 hours (longer for past dates)\n",[1072,8927,8928,8931,8933,8935,8938,8941,8943,8946,8948,8951,8953,8955,8957,8960],{"class":1074,"line":1683},[1072,8929,8930],{"class":1955},"        timeout ",[1072,8932,2108],{"class":1089},[1072,8934,1604],{"class":1223},[1072,8936,8937],{"class":1951}," if",[1072,8939,8940],{"class":1955}," date ",[1072,8942,6138],{"class":1720},[1072,8944,8945],{"class":1955}," timezone",[1072,8947,1959],{"class":1089},[1072,8949,8950],{"class":2138},"now",[1072,8952,3022],{"class":1089},[1072,8954,8464],{"class":2138},[1072,8956,2236],{"class":1089},[1072,8958,8959],{"class":1951}," else",[1072,8961,8962],{"class":1223}," 3600\n",[1072,8964,8965,8967,8969,8971,8973,8975,8977,8980,8982,8984],{"class":1074,"line":1702},[1072,8966,5843],{"class":1955},[1072,8968,1959],{"class":1089},[1072,8970,2488],{"class":2138},[1072,8972,2068],{"class":1089},[1072,8974,2416],{"class":2138},[1072,8976,1354],{"class":1089},[1072,8978,8979],{"class":2138}," stats",[1072,8981,1354],{"class":1089},[1072,8983,2502],{"class":2138},[1072,8985,2419],{"class":1089},[1072,8987,8988],{"class":1074,"line":1707},[1072,8989,3280],{"class":1955},[1072,8991,8992,8994],{"class":1074,"line":1732},[1072,8993,2245],{"class":1951},[1072,8995,3043],{"class":1955},[1072,8997,8998],{"class":1074,"line":1737},[1072,8999,2047],{"class":1955},[1072,9001,9002,9004],{"class":1074,"line":1742},[1072,9003,2052],{"class":1089},[1072,9005,2056],{"class":2055},[1072,9007,9008,9010,9013,9015,9017],{"class":1074,"line":1747},[1072,9009,2061],{"class":2021},[1072,9011,9012],{"class":2064}," get_user_lifetime_value",[1072,9014,2068],{"class":1089},[1072,9016,2741],{"class":2071},[1072,9018,2090],{"class":1089},[1072,9020,9021,9023,9026],{"class":1074,"line":1753},[1072,9022,2095],{"class":2034},[1072,9024,9025],{"class":2038},"Calculate and cache user lifetime value",[1072,9027,2042],{"class":2034},[1072,9029,9030,9032,9034,9036,9039,9041,9043,9045],{"class":1074,"line":1769},[1072,9031,8170],{"class":1955},[1072,9033,2108],{"class":1089},[1072,9035,2111],{"class":2021},[1072,9037,9038],{"class":1103},"\"user_ltv_",[1072,9040,2118],{"class":2117},[1072,9042,2741],{"class":1955},[1072,9044,2123],{"class":2117},[1072,9046,2163],{"class":1103},[1072,9048,9049,9052,9054,9056,9058,9060,9062,9064],{"class":1074,"line":2731},[1072,9050,9051],{"class":1955},"        cached_ltv ",[1072,9053,2108],{"class":1089},[1072,9055,2406],{"class":1955},[1072,9057,1959],{"class":1089},[1072,9059,2411],{"class":2138},[1072,9061,2068],{"class":1089},[1072,9063,2416],{"class":2138},[1072,9065,2419],{"class":1089},[1072,9067,9068],{"class":1074,"line":2746},[1072,9069,3280],{"class":1955},[1072,9071,9072,9074,9077,9079,9081],{"class":1074,"line":2756},[1072,9073,2168],{"class":1951},[1072,9075,9076],{"class":1955}," cached_ltv ",[1072,9078,2430],{"class":1720},[1072,9080,2436],{"class":1241},[1072,9082,2029],{"class":1089},[1072,9084,9085,9088,9090,9092,9094,9096,9098,9100],{"class":1074,"line":2786},[1072,9086,9087],{"class":1955},"            user_orders ",[1072,9089,2108],{"class":1089},[1072,9091,8609],{"class":1955},[1072,9093,1959],{"class":1089},[1072,9095,2616],{"class":2615},[1072,9097,1959],{"class":1089},[1072,9099,2621],{"class":2138},[1072,9101,2346],{"class":1089},[1072,9103,9104,9107,9109,9111],{"class":1074,"line":2791},[1072,9105,9106],{"class":2215},"                user_id",[1072,9108,2108],{"class":1089},[1072,9110,2741],{"class":2138},[1072,9112,1136],{"class":1089},[1072,9114,9115,9117,9119,9121,9123],{"class":1074,"line":2801},[1072,9116,8680],{"class":2215},[1072,9118,2108],{"class":1089},[1072,9120,1107],{"class":1099},[1072,9122,8687],{"class":1103},[1072,9124,1766],{"class":1099},[1072,9126,9127],{"class":1074,"line":2828},[1072,9128,8309],{"class":1089},[1072,9130,9131],{"class":1074,"line":2853},[1072,9132,2516],{"class":1955},[1072,9134,9135,9138,9140,9143,9145,9147],{"class":1074,"line":2875},[1072,9136,9137],{"class":1955},"            ltv_data ",[1072,9139,2108],{"class":1089},[1072,9141,9142],{"class":1955}," user_orders",[1072,9144,1959],{"class":1089},[1072,9146,2848],{"class":2138},[1072,9148,2346],{"class":1089},[1072,9150,9151,9154,9156,9158,9160,9162,9164,9166],{"class":1074,"line":2899},[1072,9152,9153],{"class":2215},"                total_spent",[1072,9155,2108],{"class":1089},[1072,9157,2861],{"class":2138},[1072,9159,2068],{"class":1089},[1072,9161,1107],{"class":1099},[1072,9163,2868],{"class":1103},[1072,9165,1107],{"class":1099},[1072,9167,4247],{"class":1089},[1072,9169,9170,9173,9175,9177,9179,9181,9183,9185],{"class":1074,"line":2924},[1072,9171,9172],{"class":2215},"                order_count",[1072,9174,2108],{"class":1089},[1072,9176,2664],{"class":2138},[1072,9178,2068],{"class":1089},[1072,9180,1107],{"class":1099},[1072,9182,2777],{"class":1103},[1072,9184,1107],{"class":1099},[1072,9186,4247],{"class":1089},[1072,9188,9189,9192,9194,9197,9199,9201,9203,9205],{"class":1074,"line":2934},[1072,9190,9191],{"class":2215},"                avg_order_value",[1072,9193,2108],{"class":1089},[1072,9195,9196],{"class":2138},"Avg",[1072,9198,2068],{"class":1089},[1072,9200,1107],{"class":1099},[1072,9202,2868],{"class":1103},[1072,9204,1107],{"class":1099},[1072,9206,4247],{"class":1089},[1072,9208,9209,9212,9214,9217,9219,9221,9224,9226],{"class":1074,"line":2944},[1072,9210,9211],{"class":2215},"                first_order",[1072,9213,2108],{"class":1089},[1072,9215,9216],{"class":2138},"Min",[1072,9218,2068],{"class":1089},[1072,9220,1107],{"class":1099},[1072,9222,9223],{"class":1103},"created_at",[1072,9225,1107],{"class":1099},[1072,9227,4247],{"class":1089},[1072,9229,9230,9233,9235,9238,9240,9242,9244,9246],{"class":1074,"line":2964},[1072,9231,9232],{"class":2215},"                last_order",[1072,9234,2108],{"class":1089},[1072,9236,9237],{"class":2138},"Max",[1072,9239,2068],{"class":1089},[1072,9241,1107],{"class":1099},[1072,9243,9223],{"class":1103},[1072,9245,1107],{"class":1099},[1072,9247,2419],{"class":1089},[1072,9249,9250],{"class":1074,"line":2987},[1072,9251,8309],{"class":1089},[1072,9253,9254],{"class":1074,"line":3028},[1072,9255,2516],{"class":1955},[1072,9257,9258],{"class":1074,"line":3033},[1072,9259,9260],{"class":1078},"            # Calculate customer lifetime in days\n",[1072,9262,9263,9265,9268,9270,9272,9275,9277,9279,9281,9283,9285,9287,9290,9292],{"class":1074,"line":3038},[1072,9264,3855],{"class":1951},[1072,9266,9267],{"class":1955}," ltv_data",[1072,9269,3196],{"class":1089},[1072,9271,1107],{"class":1099},[1072,9273,9274],{"class":1103},"first_order",[1072,9276,1107],{"class":1099},[1072,9278,2888],{"class":1089},[1072,9280,5608],{"class":1720},[1072,9282,9267],{"class":1955},[1072,9284,3196],{"class":1089},[1072,9286,1107],{"class":1099},[1072,9288,9289],{"class":1103},"last_order",[1072,9291,1107],{"class":1099},[1072,9293,9294],{"class":1089},"]:\n",[1072,9296,9297,9300,9302],{"class":1074,"line":3938},[1072,9298,9299],{"class":1955},"                lifetime_days ",[1072,9301,2108],{"class":1089},[1072,9303,9304],{"class":1089}," (\n",[1072,9306,9307,9310,9312,9314,9316,9318,9320,9322,9324,9326,9328,9330,9332],{"class":1074,"line":3943},[1072,9308,9309],{"class":1955},"                    ltv_data",[1072,9311,3196],{"class":1089},[1072,9313,1107],{"class":1099},[1072,9315,9289],{"class":1103},[1072,9317,1107],{"class":1099},[1072,9319,2888],{"class":1089},[1072,9321,3730],{"class":1720},[1072,9323,9267],{"class":1955},[1072,9325,3196],{"class":1089},[1072,9327,1107],{"class":1099},[1072,9329,9274],{"class":1103},[1072,9331,1107],{"class":1099},[1072,9333,2700],{"class":1089},[1072,9335,9336,9338,9341,9344],{"class":1074,"line":3958},[1072,9337,8827],{"class":1089},[1072,9339,9340],{"class":2615},"days",[1072,9342,9343],{"class":1720}," +",[1072,9345,9346],{"class":1223}," 1\n",[1072,9348,9349,9352,9354,9356,9359,9361,9363,9365],{"class":1074,"line":3968},[1072,9350,9351],{"class":1955},"                ltv_data",[1072,9353,3196],{"class":1089},[1072,9355,1107],{"class":1099},[1072,9357,9358],{"class":1103},"lifetime_days",[1072,9360,1107],{"class":1099},[1072,9362,2888],{"class":1089},[1072,9364,1090],{"class":1089},[1072,9366,9367],{"class":1955}," lifetime_days\n",[1072,9369,9370,9372,9374,9376,9379,9381,9383,9385],{"class":1074,"line":4007},[1072,9371,9351],{"class":1955},[1072,9373,3196],{"class":1089},[1072,9375,1107],{"class":1099},[1072,9377,9378],{"class":1103},"avg_days_between_orders",[1072,9380,1107],{"class":1099},[1072,9382,2888],{"class":1089},[1072,9384,1090],{"class":1089},[1072,9386,9304],{"class":1089},[1072,9388,9389,9392,9395,9398,9400,9403,9405,9407,9409,9411,9413,9415],{"class":1074,"line":4012},[1072,9390,9391],{"class":1955},"                    lifetime_days ",[1072,9393,9394],{"class":1720},"/",[1072,9396,9397],{"class":2144}," max",[1072,9399,2068],{"class":1089},[1072,9401,9402],{"class":2138},"ltv_data",[1072,9404,3196],{"class":1089},[1072,9406,1107],{"class":1099},[1072,9408,8267],{"class":1103},[1072,9410,1107],{"class":1099},[1072,9412,5749],{"class":1089},[1072,9414,1334],{"class":1223},[1072,9416,2419],{"class":1089},[1072,9418,9419],{"class":1074,"line":4026},[1072,9420,2386],{"class":1089},[1072,9422,9423],{"class":1074,"line":4069},[1072,9424,2516],{"class":1955},[1072,9426,9427],{"class":1074,"line":4113},[1072,9428,9429],{"class":1078},"            # Cache for 6 hours\n",[1072,9431,9432,9434,9436,9438,9440,9442,9444,9446,9448,9451],{"class":1074,"line":4118},[1072,9433,5501],{"class":1955},[1072,9435,1959],{"class":1089},[1072,9437,2488],{"class":2138},[1072,9439,2068],{"class":1089},[1072,9441,2416],{"class":2138},[1072,9443,1354],{"class":1089},[1072,9445,9267],{"class":2138},[1072,9447,1354],{"class":1089},[1072,9449,9450],{"class":1223}," 21600",[1072,9452,2419],{"class":1089},[1072,9454,9455,9458,9460],{"class":1074,"line":4127},[1072,9456,9457],{"class":1955},"            cached_ltv ",[1072,9459,2108],{"class":1089},[1072,9461,9462],{"class":1955}," ltv_data\n",[1072,9464,9465],{"class":1074,"line":4143},[1072,9466,3280],{"class":1955},[1072,9468,9469,9471],{"class":1074,"line":4168},[1072,9470,2245],{"class":1951},[1072,9472,9473],{"class":1955}," cached_ltv\n",[1030,9475,9477],{"id":9476},"cache-warming-strategies","Cache Warming Strategies",[1038,9479,9481],{"id":9480},"proactive-cache-warming","Proactive Cache Warming",[1043,9483,9485],{"className":1066,"code":9484,"language":1068,"meta":1052,"style":1052},"from django.core.management.base import BaseCommand\nfrom django.core.cache import cache\nfrom concurrent.futures import ThreadPoolExecutor\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass Command(BaseCommand):\n    \"\"\"Management command for cache warming\"\"\"\n    help = 'Warm up application caches'\n    \n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--categories',\n            action='store_true',\n            help='Warm category caches'\n        )\n        parser.add_argument(\n            '--products',\n            action='store_true',\n            help='Warm product caches'\n        )\n        parser.add_argument(\n            '--concurrent',\n            type=int,\n            default=5,\n            help='Number of concurrent workers'\n        )\n    \n    def handle(self, *args, **options):\n        if options['categories']:\n            self.warm_category_caches(options['concurrent'])\n        \n        if options['products']:\n            self.warm_product_caches(options['concurrent'])\n    \n    def warm_category_caches(self, max_workers):\n        \"\"\"Warm category-related caches\"\"\"\n        categories = Category.objects.filter(is_active=True)\n        \n        def warm_category(category):\n            try:\n                # Warm product count cache\n                cache_key = f\"category_product_count_{category.id}\"\n                count = category.products.filter(is_active=True).count()\n                cache.set(cache_key, count, 3600)\n                \n                # Warm popular products cache\n                cache_key = f\"category_popular_products_{category.id}\"\n                popular = list(\n                    category.products.filter(is_active=True)\n                    .annotate(order_count=Count('orderitem'))\n                    .order_by('-order_count')[:10]\n                )\n                cache.set(cache_key, popular, 1800)\n                \n                logger.info(f\"Warmed cache for category: {category.name}\")\n                \n            except Exception as e:\n                logger.error(f\"Error warming cache for category {category.id}: {e}\")\n        \n        with ThreadPoolExecutor(max_workers=max_workers) as executor:\n            executor.map(warm_category, categories)\n    \n    def warm_product_caches(self, max_workers):\n        \"\"\"Warm product-related caches\"\"\"\n        products = Product.objects.filter(is_active=True).select_related('category')\n        \n        def warm_product(product):\n            try:\n                # Warm product details cache\n                cache_key = f\"product_details_{product.id}\"\n                details = {\n                    'id': product.id,\n                    'name': product.name,\n                    'price': str(product.price),\n                    'category': product.category.name,\n                }\n                cache.set(cache_key, details, 3600)\n                \n                # Warm related products cache\n                cache_key = f\"product_related_{product.id}\"\n                related = list(\n                    Product.objects.filter(\n                        category=product.category,\n                        is_active=True\n                    ).exclude(id=product.id)[:5]\n                )\n                cache.set(cache_key, related, 1800)\n                \n                logger.info(f\"Warmed cache for product: {product.name}\")\n                \n            except Exception as e:\n                logger.error(f\"Error warming cache for product {product.id}: {e}\")\n        \n        with ThreadPoolExecutor(max_workers=max_workers) as executor:\n            executor.map(warm_product, products)\n\n# Automatic cache warming after deployments\nclass CacheWarmer:\n    \"\"\"Automatic cache warming service\"\"\"\n    \n    @staticmethod\n    def warm_critical_caches():\n        \"\"\"Warm the most critical caches\"\"\"\n        critical_operations = [\n            ('homepage_stats', CacheWarmer._warm_homepage_stats),\n            ('popular_products', CacheWarmer._warm_popular_products),\n            ('category_navigation', CacheWarmer._warm_category_navigation),\n        ]\n        \n        for cache_name, operation in critical_operations:\n            try:\n                operation()\n                logger.info(f\"Successfully warmed {cache_name}\")\n            except Exception as e:\n                logger.error(f\"Failed to warm {cache_name}: {e}\")\n    \n    @staticmethod\n    def _warm_homepage_stats():\n        \"\"\"Warm homepage statistics\"\"\"\n        stats = {\n            'total_products': Product.objects.filter(is_active=True).count(),\n            'total_categories': Category.objects.filter(is_active=True).count(),\n            'featured_products': list(\n                Product.objects.filter(\n                    is_active=True,\n                    is_featured=True\n                ).select_related('category')[:6]\n            ),\n        }\n        cache.set('homepage_stats', stats, 3600)\n    \n    @staticmethod\n    def _warm_popular_products():\n        \"\"\"Warm popular products cache\"\"\"\n        popular = Product.get_popular_products(limit=20)\n        cache.set('popular_products_20', popular, 3600)\n    \n    @staticmethod\n    def _warm_category_navigation():\n        \"\"\"Warm category navigation cache\"\"\"\n        categories = list(\n            Category.objects.filter(is_active=True)\n            .annotate(product_count=Count('products'))\n            .order_by('name')\n        )\n        cache.set('category_navigation', categories, 7200)\n",[1050,9486,9487,9512,9530,9547,9554,9558,9579,9583,9597,9606,9620,9624,9642,9654,9665,9681,9695,9700,9710,9721,9735,9748,9752,9762,9773,9785,9796,9809,9813,9817,9843,9861,9886,9890,9907,9930,9934,9952,9961,9989,9993,10006,10012,10017,10040,10072,10096,10100,10105,10128,10139,10162,10187,10207,10211,10235,10239,10270,10274,10290,10330,10334,10360,10381,10385,10402,10411,10449,10453,10466,10472,10477,10500,10509,10527,10545,10567,10589,10594,10617,10621,10626,10649,10660,10675,10690,10699,10724,10728,10751,10755,10785,10790,10803,10841,10846,10869,10889,10894,10900,10910,10920,10925,10932,10942,10952,10962,10986,11009,11032,11037,11042,11062,11069,11077,11104,11117,11151,11156,11163,11173,11183,11192,11228,11264,11280,11295,11307,11317,11339,11344,11349,11376,11381,11388,11398,11408,11433,11461,11466,11473,11483,11493,11504,11528,11555,11572,11577],{"__ignoreMap":1052},[1072,9488,9489,9491,9493,9495,9497,9499,9502,9504,9507,9509],{"class":1074,"line":1075},[1072,9490,1952],{"class":1951},[1072,9492,1956],{"class":1955},[1072,9494,1959],{"class":1089},[1072,9496,1962],{"class":1955},[1072,9498,1959],{"class":1089},[1072,9500,9501],{"class":1955},"management",[1072,9503,1959],{"class":1089},[1072,9505,9506],{"class":1955},"base ",[1072,9508,1970],{"class":1951},[1072,9510,9511],{"class":1955}," BaseCommand\n",[1072,9513,9514,9516,9518,9520,9522,9524,9526,9528],{"class":1074,"line":1082},[1072,9515,1952],{"class":1951},[1072,9517,1956],{"class":1955},[1072,9519,1959],{"class":1089},[1072,9521,1962],{"class":1955},[1072,9523,1959],{"class":1089},[1072,9525,1967],{"class":1955},[1072,9527,1970],{"class":1951},[1072,9529,1973],{"class":1955},[1072,9531,9532,9534,9537,9539,9542,9544],{"class":1074,"line":1096},[1072,9533,1952],{"class":1951},[1072,9535,9536],{"class":1955}," concurrent",[1072,9538,1959],{"class":1089},[1072,9540,9541],{"class":1955},"futures ",[1072,9543,1970],{"class":1951},[1072,9545,9546],{"class":1955}," ThreadPoolExecutor\n",[1072,9548,9549,9551],{"class":1074,"line":1115},[1072,9550,1970],{"class":1951},[1072,9552,9553],{"class":1955}," logging\n",[1072,9555,9556],{"class":1074,"line":1139},[1072,9557,1376],{"emptyLinePlaceholder":1375},[1072,9559,9560,9563,9565,9568,9570,9573,9575,9577],{"class":1074,"line":1160},[1072,9561,9562],{"class":1955},"logger ",[1072,9564,2108],{"class":1089},[1072,9566,9567],{"class":1955}," logging",[1072,9569,1959],{"class":1089},[1072,9571,9572],{"class":2138},"getLogger",[1072,9574,2068],{"class":1089},[1072,9576,2364],{"class":2363},[1072,9578,2419],{"class":1089},[1072,9580,9581],{"class":1074,"line":1174},[1072,9582,1376],{"emptyLinePlaceholder":1375},[1072,9584,9585,9587,9590,9592,9595],{"class":1074,"line":1196},[1072,9586,2022],{"class":2021},[1072,9588,9589],{"class":2025}," Command",[1072,9591,2068],{"class":1089},[1072,9593,9594],{"class":5067},"BaseCommand",[1072,9596,2090],{"class":1089},[1072,9598,9599,9601,9604],{"class":1074,"line":1210},[1072,9600,2035],{"class":2034},[1072,9602,9603],{"class":2038},"Management command for cache warming",[1072,9605,2042],{"class":2034},[1072,9607,9608,9611,9613,9615,9618],{"class":1074,"line":1229},[1072,9609,9610],{"class":2144},"    help",[1072,9612,1090],{"class":1089},[1072,9614,1128],{"class":1099},[1072,9616,9617],{"class":1103},"Warm up application caches",[1072,9619,1766],{"class":1099},[1072,9621,9622],{"class":1074,"line":1247},[1072,9623,2047],{"class":1955},[1072,9625,9626,9628,9631,9633,9635,9637,9640],{"class":1074,"line":1253},[1072,9627,2061],{"class":2021},[1072,9629,9630],{"class":2064}," add_arguments",[1072,9632,2068],{"class":1089},[1072,9634,3164],{"class":3163},[1072,9636,1354],{"class":1089},[1072,9638,9639],{"class":2071}," parser",[1072,9641,2090],{"class":1089},[1072,9643,9644,9647,9649,9652],{"class":1074,"line":1274},[1072,9645,9646],{"class":1955},"        parser",[1072,9648,1959],{"class":1089},[1072,9650,9651],{"class":2138},"add_argument",[1072,9653,2346],{"class":1089},[1072,9655,9656,9658,9661,9663],{"class":1074,"line":1295},[1072,9657,1177],{"class":1099},[1072,9659,9660],{"class":1103},"--categories",[1072,9662,1107],{"class":1099},[1072,9664,1136],{"class":1089},[1072,9666,9667,9670,9672,9674,9677,9679],{"class":1074,"line":1301},[1072,9668,9669],{"class":2215},"            action",[1072,9671,2108],{"class":1089},[1072,9673,1107],{"class":1099},[1072,9675,9676],{"class":1103},"store_true",[1072,9678,1107],{"class":1099},[1072,9680,1136],{"class":1089},[1072,9682,9683,9686,9688,9690,9693],{"class":1074,"line":1322},[1072,9684,9685],{"class":2215},"            help",[1072,9687,2108],{"class":1089},[1072,9689,1107],{"class":1099},[1072,9691,9692],{"class":1103},"Warm category caches",[1072,9694,1766],{"class":1099},[1072,9696,9697],{"class":1074,"line":1339},[1072,9698,9699],{"class":1089},"        )\n",[1072,9701,9702,9704,9706,9708],{"class":1074,"line":1360},[1072,9703,9646],{"class":1955},[1072,9705,1959],{"class":1089},[1072,9707,9651],{"class":2138},[1072,9709,2346],{"class":1089},[1072,9711,9712,9714,9717,9719],{"class":1074,"line":1366},[1072,9713,1177],{"class":1099},[1072,9715,9716],{"class":1103},"--products",[1072,9718,1107],{"class":1099},[1072,9720,1136],{"class":1089},[1072,9722,9723,9725,9727,9729,9731,9733],{"class":1074,"line":1372},[1072,9724,9669],{"class":2215},[1072,9726,2108],{"class":1089},[1072,9728,1107],{"class":1099},[1072,9730,9676],{"class":1103},[1072,9732,1107],{"class":1099},[1072,9734,1136],{"class":1089},[1072,9736,9737,9739,9741,9743,9746],{"class":1074,"line":1379},[1072,9738,9685],{"class":2215},[1072,9740,2108],{"class":1089},[1072,9742,1107],{"class":1099},[1072,9744,9745],{"class":1103},"Warm product caches",[1072,9747,1766],{"class":1099},[1072,9749,9750],{"class":1074,"line":1385},[1072,9751,9699],{"class":1089},[1072,9753,9754,9756,9758,9760],{"class":1074,"line":1394},[1072,9755,9646],{"class":1955},[1072,9757,1959],{"class":1089},[1072,9759,9651],{"class":2138},[1072,9761,2346],{"class":1089},[1072,9763,9764,9766,9769,9771],{"class":1074,"line":1407},[1072,9765,1177],{"class":1099},[1072,9767,9768],{"class":1103},"--concurrent",[1072,9770,1107],{"class":1099},[1072,9772,1136],{"class":1089},[1072,9774,9775,9778,9780,9783],{"class":1074,"line":1426},[1072,9776,9777],{"class":2215},"            type",[1072,9779,2108],{"class":1089},[1072,9781,9782],{"class":2055},"int",[1072,9784,1136],{"class":1089},[1072,9786,9787,9790,9792,9794],{"class":1074,"line":1445},[1072,9788,9789],{"class":2215},"            default",[1072,9791,2108],{"class":1089},[1072,9793,4906],{"class":1223},[1072,9795,1136],{"class":1089},[1072,9797,9798,9800,9802,9804,9807],{"class":1074,"line":1458},[1072,9799,9685],{"class":2215},[1072,9801,2108],{"class":1089},[1072,9803,1107],{"class":1099},[1072,9805,9806],{"class":1103},"Number of concurrent workers",[1072,9808,1766],{"class":1099},[1072,9810,9811],{"class":1074,"line":1477},[1072,9812,9699],{"class":1089},[1072,9814,9815],{"class":1074,"line":1482},[1072,9816,2047],{"class":1955},[1072,9818,9819,9821,9824,9826,9828,9830,9832,9834,9836,9838,9841],{"class":1074,"line":1497},[1072,9820,2061],{"class":2021},[1072,9822,9823],{"class":2064}," handle",[1072,9825,2068],{"class":1089},[1072,9827,3164],{"class":3163},[1072,9829,1354],{"class":1089},[1072,9831,1721],{"class":1720},[1072,9833,2079],{"class":2071},[1072,9835,1354],{"class":1089},[1072,9837,2084],{"class":1720},[1072,9839,9840],{"class":2071},"options",[1072,9842,2090],{"class":1089},[1072,9844,9845,9847,9850,9852,9854,9857,9859],{"class":1074,"line":1503},[1072,9846,2168],{"class":1951},[1072,9848,9849],{"class":1955}," options",[1072,9851,3196],{"class":1089},[1072,9853,1107],{"class":1099},[1072,9855,9856],{"class":1103},"categories",[1072,9858,1107],{"class":1099},[1072,9860,9294],{"class":1089},[1072,9862,9863,9865,9867,9870,9872,9874,9876,9878,9881,9883],{"class":1074,"line":1517},[1072,9864,3635],{"class":1085},[1072,9866,1959],{"class":1089},[1072,9868,9869],{"class":2138},"warm_category_caches",[1072,9871,2068],{"class":1089},[1072,9873,9840],{"class":2138},[1072,9875,3196],{"class":1089},[1072,9877,1107],{"class":1099},[1072,9879,9880],{"class":1103},"concurrent",[1072,9882,1107],{"class":1099},[1072,9884,9885],{"class":1089},"])\n",[1072,9887,9888],{"class":1074,"line":1536},[1072,9889,3280],{"class":1955},[1072,9891,9892,9894,9896,9898,9900,9903,9905],{"class":1074,"line":1556},[1072,9893,2168],{"class":1951},[1072,9895,9849],{"class":1955},[1072,9897,3196],{"class":1089},[1072,9899,1107],{"class":1099},[1072,9901,9902],{"class":1103},"products",[1072,9904,1107],{"class":1099},[1072,9906,9294],{"class":1089},[1072,9908,9909,9911,9913,9916,9918,9920,9922,9924,9926,9928],{"class":1074,"line":1569},[1072,9910,3635],{"class":1085},[1072,9912,1959],{"class":1089},[1072,9914,9915],{"class":2138},"warm_product_caches",[1072,9917,2068],{"class":1089},[1072,9919,9840],{"class":2138},[1072,9921,3196],{"class":1089},[1072,9923,1107],{"class":1099},[1072,9925,9880],{"class":1103},[1072,9927,1107],{"class":1099},[1072,9929,9885],{"class":1089},[1072,9931,9932],{"class":1074,"line":1588},[1072,9933,2047],{"class":1955},[1072,9935,9936,9938,9941,9943,9945,9947,9950],{"class":1074,"line":1593},[1072,9937,2061],{"class":2021},[1072,9939,9940],{"class":2064}," warm_category_caches",[1072,9942,2068],{"class":1089},[1072,9944,3164],{"class":3163},[1072,9946,1354],{"class":1089},[1072,9948,9949],{"class":2071}," max_workers",[1072,9951,2090],{"class":1089},[1072,9953,9954,9956,9959],{"class":1074,"line":1612},[1072,9955,2095],{"class":2034},[1072,9957,9958],{"class":2038},"Warm category-related caches",[1072,9960,2042],{"class":2034},[1072,9962,9963,9966,9968,9971,9973,9975,9977,9979,9981,9983,9985,9987],{"class":1074,"line":1617},[1072,9964,9965],{"class":1955},"        categories ",[1072,9967,2108],{"class":1089},[1072,9969,9970],{"class":1955}," Category",[1072,9972,1959],{"class":1089},[1072,9974,2616],{"class":2615},[1072,9976,1959],{"class":1089},[1072,9978,2621],{"class":2138},[1072,9980,2068],{"class":1089},[1072,9982,5161],{"class":2215},[1072,9984,2108],{"class":1089},[1072,9986,2221],{"class":1241},[1072,9988,2419],{"class":1089},[1072,9990,9991],{"class":1074,"line":1631},[1072,9992,3280],{"class":1955},[1072,9994,9995,9997,10000,10002,10004],{"class":1074,"line":1650},[1072,9996,2291],{"class":2021},[1072,9998,9999],{"class":2064}," warm_category",[1072,10001,2068],{"class":1089},[1072,10003,4106],{"class":2071},[1072,10005,2090],{"class":1089},[1072,10007,10008,10010],{"class":1074,"line":1670},[1072,10009,3379],{"class":1951},[1072,10011,2029],{"class":1089},[1072,10013,10014],{"class":1074,"line":1683},[1072,10015,10016],{"class":1078},"                # Warm product count cache\n",[1072,10018,10019,10021,10023,10025,10028,10030,10032,10034,10036,10038],{"class":1074,"line":1702},[1072,10020,2334],{"class":1955},[1072,10022,2108],{"class":1089},[1072,10024,2111],{"class":2021},[1072,10026,10027],{"class":1103},"\"category_product_count_",[1072,10029,2118],{"class":2117},[1072,10031,4106],{"class":1955},[1072,10033,1959],{"class":1089},[1072,10035,2777],{"class":2615},[1072,10037,2123],{"class":2117},[1072,10039,2163],{"class":1103},[1072,10041,10042,10045,10047,10050,10052,10054,10056,10058,10060,10062,10064,10066,10068,10070],{"class":1074,"line":1707},[1072,10043,10044],{"class":1955},"                count ",[1072,10046,2108],{"class":1089},[1072,10048,10049],{"class":1955}," category",[1072,10051,1959],{"class":1089},[1072,10053,9902],{"class":2615},[1072,10055,1959],{"class":1089},[1072,10057,2621],{"class":2138},[1072,10059,2068],{"class":1089},[1072,10061,5161],{"class":2215},[1072,10063,2108],{"class":1089},[1072,10065,2221],{"class":1241},[1072,10067,2224],{"class":1089},[1072,10069,2822],{"class":2138},[1072,10071,3447],{"class":1089},[1072,10073,10074,10076,10078,10080,10082,10084,10086,10089,10091,10094],{"class":1074,"line":1732},[1072,10075,2483],{"class":1955},[1072,10077,1959],{"class":1089},[1072,10079,2488],{"class":2138},[1072,10081,2068],{"class":1089},[1072,10083,2416],{"class":2138},[1072,10085,1354],{"class":1089},[1072,10087,10088],{"class":2138}," count",[1072,10090,1354],{"class":1089},[1072,10092,10093],{"class":1223}," 3600",[1072,10095,2419],{"class":1089},[1072,10097,10098],{"class":1074,"line":1737},[1072,10099,2391],{"class":1955},[1072,10101,10102],{"class":1074,"line":1742},[1072,10103,10104],{"class":1078},"                # Warm popular products cache\n",[1072,10106,10107,10109,10111,10113,10116,10118,10120,10122,10124,10126],{"class":1074,"line":1747},[1072,10108,2334],{"class":1955},[1072,10110,2108],{"class":1089},[1072,10112,2111],{"class":2021},[1072,10114,10115],{"class":1103},"\"category_popular_products_",[1072,10117,2118],{"class":2117},[1072,10119,4106],{"class":1955},[1072,10121,1959],{"class":1089},[1072,10123,2777],{"class":2615},[1072,10125,2123],{"class":2117},[1072,10127,2163],{"class":1103},[1072,10129,10130,10133,10135,10137],{"class":1074,"line":1753},[1072,10131,10132],{"class":1955},"                popular ",[1072,10134,2108],{"class":1089},[1072,10136,7739],{"class":2055},[1072,10138,2346],{"class":1089},[1072,10140,10141,10144,10146,10148,10150,10152,10154,10156,10158,10160],{"class":1074,"line":1769},[1072,10142,10143],{"class":2138},"                    category",[1072,10145,1959],{"class":1089},[1072,10147,9902],{"class":2615},[1072,10149,1959],{"class":1089},[1072,10151,2621],{"class":2138},[1072,10153,2068],{"class":1089},[1072,10155,5161],{"class":2215},[1072,10157,2108],{"class":1089},[1072,10159,2221],{"class":1241},[1072,10161,2419],{"class":1089},[1072,10163,10164,10167,10169,10171,10173,10175,10177,10179,10181,10183,10185],{"class":1074,"line":2731},[1072,10165,10166],{"class":1089},"                    .",[1072,10168,2652],{"class":2138},[1072,10170,2068],{"class":1089},[1072,10172,8267],{"class":2215},[1072,10174,2108],{"class":1089},[1072,10176,2664],{"class":2138},[1072,10178,2068],{"class":1089},[1072,10180,1107],{"class":1099},[1072,10182,8278],{"class":1103},[1072,10184,1107],{"class":1099},[1072,10186,8283],{"class":1089},[1072,10188,10189,10191,10193,10195,10197,10199,10201,10203,10205],{"class":1074,"line":2746},[1072,10190,10166],{"class":1089},[1072,10192,2682],{"class":2138},[1072,10194,2068],{"class":1089},[1072,10196,1107],{"class":1099},[1072,10198,8296],{"class":1103},[1072,10200,1107],{"class":1099},[1072,10202,2694],{"class":1089},[1072,10204,2591],{"class":1223},[1072,10206,2700],{"class":1089},[1072,10208,10209],{"class":1074,"line":2756},[1072,10210,2386],{"class":1089},[1072,10212,10213,10215,10217,10219,10221,10223,10225,10228,10230,10233],{"class":1074,"line":2786},[1072,10214,2483],{"class":1955},[1072,10216,1959],{"class":1089},[1072,10218,2488],{"class":2138},[1072,10220,2068],{"class":1089},[1072,10222,2416],{"class":2138},[1072,10224,1354],{"class":1089},[1072,10226,10227],{"class":2138}," popular",[1072,10229,1354],{"class":1089},[1072,10231,10232],{"class":1223}," 1800",[1072,10234,2419],{"class":1089},[1072,10236,10237],{"class":1074,"line":2791},[1072,10238,2391],{"class":1955},[1072,10240,10241,10244,10246,10249,10251,10253,10256,10258,10260,10262,10264,10266,10268],{"class":1074,"line":2801},[1072,10242,10243],{"class":1955},"                logger",[1072,10245,1959],{"class":1089},[1072,10247,10248],{"class":2138},"info",[1072,10250,2068],{"class":1089},[1072,10252,3979],{"class":2021},[1072,10254,10255],{"class":1103},"\"Warmed cache for category: ",[1072,10257,2118],{"class":2117},[1072,10259,4106],{"class":2138},[1072,10261,1959],{"class":1089},[1072,10263,4209],{"class":2615},[1072,10265,2123],{"class":2117},[1072,10267,2114],{"class":1103},[1072,10269,2419],{"class":1089},[1072,10271,10272],{"class":1074,"line":2828},[1072,10273,2391],{"class":1955},[1072,10275,10276,10279,10282,10285,10288],{"class":1074,"line":2853},[1072,10277,10278],{"class":1951},"            except",[1072,10280,10281],{"class":2055}," Exception",[1072,10283,10284],{"class":1951}," as",[1072,10286,10287],{"class":1955}," e",[1072,10289,2029],{"class":1089},[1072,10291,10292,10294,10296,10299,10301,10303,10306,10308,10310,10312,10314,10316,10319,10321,10324,10326,10328],{"class":1074,"line":2875},[1072,10293,10243],{"class":1955},[1072,10295,1959],{"class":1089},[1072,10297,10298],{"class":2138},"error",[1072,10300,2068],{"class":1089},[1072,10302,3979],{"class":2021},[1072,10304,10305],{"class":1103},"\"Error warming cache for category ",[1072,10307,2118],{"class":2117},[1072,10309,4106],{"class":2138},[1072,10311,1959],{"class":1089},[1072,10313,2777],{"class":2615},[1072,10315,2123],{"class":2117},[1072,10317,10318],{"class":1103},": ",[1072,10320,2118],{"class":2117},[1072,10322,10323],{"class":2138},"e",[1072,10325,2123],{"class":2117},[1072,10327,2114],{"class":1103},[1072,10329,2419],{"class":1089},[1072,10331,10332],{"class":1074,"line":2899},[1072,10333,3280],{"class":1955},[1072,10335,10336,10339,10342,10344,10347,10349,10351,10353,10355,10358],{"class":1074,"line":2924},[1072,10337,10338],{"class":1951},"        with",[1072,10340,10341],{"class":2138}," ThreadPoolExecutor",[1072,10343,2068],{"class":1089},[1072,10345,10346],{"class":2215},"max_workers",[1072,10348,2108],{"class":1089},[1072,10350,10346],{"class":2138},[1072,10352,2565],{"class":1089},[1072,10354,10284],{"class":1951},[1072,10356,10357],{"class":1955}," executor",[1072,10359,2029],{"class":1089},[1072,10361,10362,10365,10367,10369,10371,10374,10376,10379],{"class":1074,"line":2934},[1072,10363,10364],{"class":1955},"            executor",[1072,10366,1959],{"class":1089},[1072,10368,2145],{"class":2138},[1072,10370,2068],{"class":1089},[1072,10372,10373],{"class":2138},"warm_category",[1072,10375,1354],{"class":1089},[1072,10377,10378],{"class":2138}," categories",[1072,10380,2419],{"class":1089},[1072,10382,10383],{"class":1074,"line":2944},[1072,10384,2047],{"class":1955},[1072,10386,10387,10389,10392,10394,10396,10398,10400],{"class":1074,"line":2964},[1072,10388,2061],{"class":2021},[1072,10390,10391],{"class":2064}," warm_product_caches",[1072,10393,2068],{"class":1089},[1072,10395,3164],{"class":3163},[1072,10397,1354],{"class":1089},[1072,10399,9949],{"class":2071},[1072,10401,2090],{"class":1089},[1072,10403,10404,10406,10409],{"class":1074,"line":2987},[1072,10405,2095],{"class":2034},[1072,10407,10408],{"class":2038},"Warm product-related caches",[1072,10410,2042],{"class":2034},[1072,10412,10413,10415,10417,10419,10421,10423,10425,10427,10429,10431,10433,10435,10437,10439,10441,10443,10445,10447],{"class":1074,"line":3028},[1072,10414,4072],{"class":1955},[1072,10416,2108],{"class":1089},[1072,10418,2610],{"class":1955},[1072,10420,1959],{"class":1089},[1072,10422,2616],{"class":2615},[1072,10424,1959],{"class":1089},[1072,10426,2621],{"class":2138},[1072,10428,2068],{"class":1089},[1072,10430,5161],{"class":2215},[1072,10432,2108],{"class":1089},[1072,10434,2221],{"class":1241},[1072,10436,2224],{"class":1089},[1072,10438,4099],{"class":2138},[1072,10440,2068],{"class":1089},[1072,10442,1107],{"class":1099},[1072,10444,4106],{"class":1103},[1072,10446,1107],{"class":1099},[1072,10448,2419],{"class":1089},[1072,10450,10451],{"class":1074,"line":3033},[1072,10452,3280],{"class":1955},[1072,10454,10455,10457,10460,10462,10464],{"class":1074,"line":3038},[1072,10456,2291],{"class":2021},[1072,10458,10459],{"class":2064}," warm_product",[1072,10461,2068],{"class":1089},[1072,10463,4157],{"class":2071},[1072,10465,2090],{"class":1089},[1072,10467,10468,10470],{"class":1074,"line":3938},[1072,10469,3379],{"class":1951},[1072,10471,2029],{"class":1089},[1072,10473,10474],{"class":1074,"line":3943},[1072,10475,10476],{"class":1078},"                # Warm product details cache\n",[1072,10478,10479,10481,10483,10485,10488,10490,10492,10494,10496,10498],{"class":1074,"line":3958},[1072,10480,2334],{"class":1955},[1072,10482,2108],{"class":1089},[1072,10484,2111],{"class":2021},[1072,10486,10487],{"class":1103},"\"product_details_",[1072,10489,2118],{"class":2117},[1072,10491,4157],{"class":1955},[1072,10493,1959],{"class":1089},[1072,10495,2777],{"class":2615},[1072,10497,2123],{"class":2117},[1072,10499,2163],{"class":1103},[1072,10501,10502,10505,10507],{"class":1074,"line":3968},[1072,10503,10504],{"class":1955},"                details ",[1072,10506,2108],{"class":1089},[1072,10508,1093],{"class":1089},[1072,10510,10511,10513,10515,10517,10519,10521,10523,10525],{"class":1074,"line":4007},[1072,10512,8882],{"class":1099},[1072,10514,2777],{"class":1103},[1072,10516,1107],{"class":1099},[1072,10518,1110],{"class":1089},[1072,10520,4195],{"class":1955},[1072,10522,1959],{"class":1089},[1072,10524,2777],{"class":2615},[1072,10526,1136],{"class":1089},[1072,10528,10529,10531,10533,10535,10537,10539,10541,10543],{"class":1074,"line":4012},[1072,10530,8882],{"class":1099},[1072,10532,4209],{"class":1103},[1072,10534,1107],{"class":1099},[1072,10536,1110],{"class":1089},[1072,10538,4195],{"class":1955},[1072,10540,1959],{"class":1089},[1072,10542,4209],{"class":2615},[1072,10544,1136],{"class":1089},[1072,10546,10547,10549,10551,10553,10555,10557,10559,10561,10563,10565],{"class":1074,"line":4026},[1072,10548,8882],{"class":1099},[1072,10550,4229],{"class":1103},[1072,10552,1107],{"class":1099},[1072,10554,1110],{"class":1089},[1072,10556,4236],{"class":2055},[1072,10558,2068],{"class":1089},[1072,10560,4157],{"class":2138},[1072,10562,1959],{"class":1089},[1072,10564,4229],{"class":2615},[1072,10566,4247],{"class":1089},[1072,10568,10569,10571,10573,10575,10577,10579,10581,10583,10585,10587],{"class":1074,"line":4069},[1072,10570,8882],{"class":1099},[1072,10572,4106],{"class":1103},[1072,10574,1107],{"class":1099},[1072,10576,1110],{"class":1089},[1072,10578,4195],{"class":1955},[1072,10580,1959],{"class":1089},[1072,10582,4106],{"class":2615},[1072,10584,1959],{"class":1089},[1072,10586,4209],{"class":2615},[1072,10588,1136],{"class":1089},[1072,10590,10591],{"class":1074,"line":4113},[1072,10592,10593],{"class":1089},"                }\n",[1072,10595,10596,10598,10600,10602,10604,10606,10608,10611,10613,10615],{"class":1074,"line":4118},[1072,10597,2483],{"class":1955},[1072,10599,1959],{"class":1089},[1072,10601,2488],{"class":2138},[1072,10603,2068],{"class":1089},[1072,10605,2416],{"class":2138},[1072,10607,1354],{"class":1089},[1072,10609,10610],{"class":2138}," details",[1072,10612,1354],{"class":1089},[1072,10614,10093],{"class":1223},[1072,10616,2419],{"class":1089},[1072,10618,10619],{"class":1074,"line":4127},[1072,10620,2391],{"class":1955},[1072,10622,10623],{"class":1074,"line":4143},[1072,10624,10625],{"class":1078},"                # Warm related products cache\n",[1072,10627,10628,10630,10632,10634,10637,10639,10641,10643,10645,10647],{"class":1074,"line":4168},[1072,10629,2334],{"class":1955},[1072,10631,2108],{"class":1089},[1072,10633,2111],{"class":2021},[1072,10635,10636],{"class":1103},"\"product_related_",[1072,10638,2118],{"class":2117},[1072,10640,4157],{"class":1955},[1072,10642,1959],{"class":1089},[1072,10644,2777],{"class":2615},[1072,10646,2123],{"class":2117},[1072,10648,2163],{"class":1103},[1072,10650,10651,10654,10656,10658],{"class":1074,"line":4184},[1072,10652,10653],{"class":1955},"                related ",[1072,10655,2108],{"class":1089},[1072,10657,7739],{"class":2055},[1072,10659,2346],{"class":1089},[1072,10661,10662,10665,10667,10669,10671,10673],{"class":1074,"line":4204},[1072,10663,10664],{"class":2138},"                    Product",[1072,10666,1959],{"class":1089},[1072,10668,2616],{"class":2615},[1072,10670,1959],{"class":1089},[1072,10672,2621],{"class":2138},[1072,10674,2346],{"class":1089},[1072,10676,10677,10680,10682,10684,10686,10688],{"class":1074,"line":4224},[1072,10678,10679],{"class":2215},"                        category",[1072,10681,2108],{"class":1089},[1072,10683,4157],{"class":2138},[1072,10685,1959],{"class":1089},[1072,10687,4106],{"class":2615},[1072,10689,1136],{"class":1089},[1072,10691,10692,10695,10697],{"class":1074,"line":4250},[1072,10693,10694],{"class":2215},"                        is_active",[1072,10696,2108],{"class":1089},[1072,10698,2644],{"class":1241},[1072,10700,10701,10703,10706,10708,10710,10712,10714,10716,10718,10720,10722],{"class":1074,"line":4273},[1072,10702,4628],{"class":1089},[1072,10704,10705],{"class":2138},"exclude",[1072,10707,2068],{"class":1089},[1072,10709,2777],{"class":2215},[1072,10711,2108],{"class":1089},[1072,10713,4157],{"class":2138},[1072,10715,1959],{"class":1089},[1072,10717,2777],{"class":2615},[1072,10719,2694],{"class":1089},[1072,10721,4906],{"class":1223},[1072,10723,2700],{"class":1089},[1072,10725,10726],{"class":1074,"line":4279},[1072,10727,2386],{"class":1089},[1072,10729,10730,10732,10734,10736,10738,10740,10742,10745,10747,10749],{"class":1074,"line":4286},[1072,10731,2483],{"class":1955},[1072,10733,1959],{"class":1089},[1072,10735,2488],{"class":2138},[1072,10737,2068],{"class":1089},[1072,10739,2416],{"class":2138},[1072,10741,1354],{"class":1089},[1072,10743,10744],{"class":2138}," related",[1072,10746,1354],{"class":1089},[1072,10748,10232],{"class":1223},[1072,10750,2419],{"class":1089},[1072,10752,10753],{"class":1074,"line":4291},[1072,10754,2391],{"class":1955},[1072,10756,10758,10760,10762,10764,10766,10768,10771,10773,10775,10777,10779,10781,10783],{"class":1074,"line":10757},91,[1072,10759,10243],{"class":1955},[1072,10761,1959],{"class":1089},[1072,10763,10248],{"class":2138},[1072,10765,2068],{"class":1089},[1072,10767,3979],{"class":2021},[1072,10769,10770],{"class":1103},"\"Warmed cache for product: ",[1072,10772,2118],{"class":2117},[1072,10774,4157],{"class":2138},[1072,10776,1959],{"class":1089},[1072,10778,4209],{"class":2615},[1072,10780,2123],{"class":2117},[1072,10782,2114],{"class":1103},[1072,10784,2419],{"class":1089},[1072,10786,10788],{"class":1074,"line":10787},92,[1072,10789,2391],{"class":1955},[1072,10791,10793,10795,10797,10799,10801],{"class":1074,"line":10792},93,[1072,10794,10278],{"class":1951},[1072,10796,10281],{"class":2055},[1072,10798,10284],{"class":1951},[1072,10800,10287],{"class":1955},[1072,10802,2029],{"class":1089},[1072,10804,10806,10808,10810,10812,10814,10816,10819,10821,10823,10825,10827,10829,10831,10833,10835,10837,10839],{"class":1074,"line":10805},94,[1072,10807,10243],{"class":1955},[1072,10809,1959],{"class":1089},[1072,10811,10298],{"class":2138},[1072,10813,2068],{"class":1089},[1072,10815,3979],{"class":2021},[1072,10817,10818],{"class":1103},"\"Error warming cache for product ",[1072,10820,2118],{"class":2117},[1072,10822,4157],{"class":2138},[1072,10824,1959],{"class":1089},[1072,10826,2777],{"class":2615},[1072,10828,2123],{"class":2117},[1072,10830,10318],{"class":1103},[1072,10832,2118],{"class":2117},[1072,10834,10323],{"class":2138},[1072,10836,2123],{"class":2117},[1072,10838,2114],{"class":1103},[1072,10840,2419],{"class":1089},[1072,10842,10844],{"class":1074,"line":10843},95,[1072,10845,3280],{"class":1955},[1072,10847,10849,10851,10853,10855,10857,10859,10861,10863,10865,10867],{"class":1074,"line":10848},96,[1072,10850,10338],{"class":1951},[1072,10852,10341],{"class":2138},[1072,10854,2068],{"class":1089},[1072,10856,10346],{"class":2215},[1072,10858,2108],{"class":1089},[1072,10860,10346],{"class":2138},[1072,10862,2565],{"class":1089},[1072,10864,10284],{"class":1951},[1072,10866,10357],{"class":1955},[1072,10868,2029],{"class":1089},[1072,10870,10872,10874,10876,10878,10880,10883,10885,10887],{"class":1074,"line":10871},97,[1072,10873,10364],{"class":1955},[1072,10875,1959],{"class":1089},[1072,10877,2145],{"class":2138},[1072,10879,2068],{"class":1089},[1072,10881,10882],{"class":2138},"warm_product",[1072,10884,1354],{"class":1089},[1072,10886,4138],{"class":2138},[1072,10888,2419],{"class":1089},[1072,10890,10892],{"class":1074,"line":10891},98,[1072,10893,1376],{"emptyLinePlaceholder":1375},[1072,10895,10897],{"class":1074,"line":10896},99,[1072,10898,10899],{"class":1078},"# Automatic cache warming after deployments\n",[1072,10901,10903,10905,10908],{"class":1074,"line":10902},100,[1072,10904,2022],{"class":2021},[1072,10906,10907],{"class":2025}," CacheWarmer",[1072,10909,2029],{"class":1089},[1072,10911,10913,10915,10918],{"class":1074,"line":10912},101,[1072,10914,2035],{"class":2034},[1072,10916,10917],{"class":2038},"Automatic cache warming service",[1072,10919,2042],{"class":2034},[1072,10921,10923],{"class":1074,"line":10922},102,[1072,10924,2047],{"class":1955},[1072,10926,10928,10930],{"class":1074,"line":10927},103,[1072,10929,2052],{"class":1089},[1072,10931,2056],{"class":2055},[1072,10933,10935,10937,10940],{"class":1074,"line":10934},104,[1072,10936,2061],{"class":2021},[1072,10938,10939],{"class":2064}," warm_critical_caches",[1072,10941,5593],{"class":1089},[1072,10943,10945,10947,10950],{"class":1074,"line":10944},105,[1072,10946,2095],{"class":2034},[1072,10948,10949],{"class":2038},"Warm the most critical caches",[1072,10951,2042],{"class":2034},[1072,10953,10955,10958,10960],{"class":1074,"line":10954},106,[1072,10956,10957],{"class":1955},"        critical_operations ",[1072,10959,2108],{"class":1089},[1072,10961,1846],{"class":1089},[1072,10963,10965,10968,10970,10973,10975,10977,10979,10981,10984],{"class":1074,"line":10964},107,[1072,10966,10967],{"class":1089},"            (",[1072,10969,1107],{"class":1099},[1072,10971,10972],{"class":1103},"homepage_stats",[1072,10974,1107],{"class":1099},[1072,10976,1354],{"class":1089},[1072,10978,10907],{"class":1955},[1072,10980,1959],{"class":1089},[1072,10982,10983],{"class":2615},"_warm_homepage_stats",[1072,10985,4247],{"class":1089},[1072,10987,10989,10991,10993,10996,10998,11000,11002,11004,11007],{"class":1074,"line":10988},108,[1072,10990,10967],{"class":1089},[1072,10992,1107],{"class":1099},[1072,10994,10995],{"class":1103},"popular_products",[1072,10997,1107],{"class":1099},[1072,10999,1354],{"class":1089},[1072,11001,10907],{"class":1955},[1072,11003,1959],{"class":1089},[1072,11005,11006],{"class":2615},"_warm_popular_products",[1072,11008,4247],{"class":1089},[1072,11010,11012,11014,11016,11019,11021,11023,11025,11027,11030],{"class":1074,"line":11011},109,[1072,11013,10967],{"class":1089},[1072,11015,1107],{"class":1099},[1072,11017,11018],{"class":1103},"category_navigation",[1072,11020,1107],{"class":1099},[1072,11022,1354],{"class":1089},[1072,11024,10907],{"class":1955},[1072,11026,1959],{"class":1089},[1072,11028,11029],{"class":2615},"_warm_category_navigation",[1072,11031,4247],{"class":1089},[1072,11033,11035],{"class":1074,"line":11034},110,[1072,11036,5396],{"class":1089},[1072,11038,11040],{"class":1074,"line":11039},111,[1072,11041,3280],{"class":1955},[1072,11043,11045,11047,11050,11052,11055,11057,11060],{"class":1074,"line":11044},112,[1072,11046,4130],{"class":1951},[1072,11048,11049],{"class":1955}," cache_name",[1072,11051,1354],{"class":1089},[1072,11053,11054],{"class":1955}," operation ",[1072,11056,3808],{"class":1951},[1072,11058,11059],{"class":1955}," critical_operations",[1072,11061,2029],{"class":1089},[1072,11063,11065,11067],{"class":1074,"line":11064},113,[1072,11066,3379],{"class":1951},[1072,11068,2029],{"class":1089},[1072,11070,11072,11075],{"class":1074,"line":11071},114,[1072,11073,11074],{"class":2138},"                operation",[1072,11076,3447],{"class":1089},[1072,11078,11080,11082,11084,11086,11088,11090,11093,11095,11098,11100,11102],{"class":1074,"line":11079},115,[1072,11081,10243],{"class":1955},[1072,11083,1959],{"class":1089},[1072,11085,10248],{"class":2138},[1072,11087,2068],{"class":1089},[1072,11089,3979],{"class":2021},[1072,11091,11092],{"class":1103},"\"Successfully warmed ",[1072,11094,2118],{"class":2117},[1072,11096,11097],{"class":2138},"cache_name",[1072,11099,2123],{"class":2117},[1072,11101,2114],{"class":1103},[1072,11103,2419],{"class":1089},[1072,11105,11107,11109,11111,11113,11115],{"class":1074,"line":11106},116,[1072,11108,10278],{"class":1951},[1072,11110,10281],{"class":2055},[1072,11112,10284],{"class":1951},[1072,11114,10287],{"class":1955},[1072,11116,2029],{"class":1089},[1072,11118,11120,11122,11124,11126,11128,11130,11133,11135,11137,11139,11141,11143,11145,11147,11149],{"class":1074,"line":11119},117,[1072,11121,10243],{"class":1955},[1072,11123,1959],{"class":1089},[1072,11125,10298],{"class":2138},[1072,11127,2068],{"class":1089},[1072,11129,3979],{"class":2021},[1072,11131,11132],{"class":1103},"\"Failed to warm ",[1072,11134,2118],{"class":2117},[1072,11136,11097],{"class":2138},[1072,11138,2123],{"class":2117},[1072,11140,10318],{"class":1103},[1072,11142,2118],{"class":2117},[1072,11144,10323],{"class":2138},[1072,11146,2123],{"class":2117},[1072,11148,2114],{"class":1103},[1072,11150,2419],{"class":1089},[1072,11152,11154],{"class":1074,"line":11153},118,[1072,11155,2047],{"class":1955},[1072,11157,11159,11161],{"class":1074,"line":11158},119,[1072,11160,2052],{"class":1089},[1072,11162,2056],{"class":2055},[1072,11164,11166,11168,11171],{"class":1074,"line":11165},120,[1072,11167,2061],{"class":2021},[1072,11169,11170],{"class":2064}," _warm_homepage_stats",[1072,11172,5593],{"class":1089},[1072,11174,11176,11178,11181],{"class":1074,"line":11175},121,[1072,11177,2095],{"class":2034},[1072,11179,11180],{"class":2038},"Warm homepage statistics",[1072,11182,2042],{"class":2034},[1072,11184,11186,11188,11190],{"class":1074,"line":11185},122,[1072,11187,8592],{"class":1955},[1072,11189,2108],{"class":1089},[1072,11191,1093],{"class":1089},[1072,11193,11195,11197,11200,11202,11204,11206,11208,11210,11212,11214,11216,11218,11220,11222,11224,11226],{"class":1074,"line":11194},123,[1072,11196,1177],{"class":1099},[1072,11198,11199],{"class":1103},"total_products",[1072,11201,1107],{"class":1099},[1072,11203,1110],{"class":1089},[1072,11205,2610],{"class":1955},[1072,11207,1959],{"class":1089},[1072,11209,2616],{"class":2615},[1072,11211,1959],{"class":1089},[1072,11213,2621],{"class":2138},[1072,11215,2068],{"class":1089},[1072,11217,5161],{"class":2215},[1072,11219,2108],{"class":1089},[1072,11221,2221],{"class":1241},[1072,11223,2224],{"class":1089},[1072,11225,2822],{"class":2138},[1072,11227,2825],{"class":1089},[1072,11229,11231,11233,11236,11238,11240,11242,11244,11246,11248,11250,11252,11254,11256,11258,11260,11262],{"class":1074,"line":11230},124,[1072,11232,1177],{"class":1099},[1072,11234,11235],{"class":1103},"total_categories",[1072,11237,1107],{"class":1099},[1072,11239,1110],{"class":1089},[1072,11241,9970],{"class":1955},[1072,11243,1959],{"class":1089},[1072,11245,2616],{"class":2615},[1072,11247,1959],{"class":1089},[1072,11249,2621],{"class":2138},[1072,11251,2068],{"class":1089},[1072,11253,5161],{"class":2215},[1072,11255,2108],{"class":1089},[1072,11257,2221],{"class":1241},[1072,11259,2224],{"class":1089},[1072,11261,2822],{"class":2138},[1072,11263,2825],{"class":1089},[1072,11265,11267,11269,11272,11274,11276,11278],{"class":1074,"line":11266},125,[1072,11268,1177],{"class":1099},[1072,11270,11271],{"class":1103},"featured_products",[1072,11273,1107],{"class":1099},[1072,11275,1110],{"class":1089},[1072,11277,7739],{"class":2055},[1072,11279,2346],{"class":1089},[1072,11281,11283,11285,11287,11289,11291,11293],{"class":1074,"line":11282},126,[1072,11284,8803],{"class":2138},[1072,11286,1959],{"class":1089},[1072,11288,2616],{"class":2615},[1072,11290,1959],{"class":1089},[1072,11292,2621],{"class":2138},[1072,11294,2346],{"class":1089},[1072,11296,11298,11301,11303,11305],{"class":1074,"line":11297},127,[1072,11299,11300],{"class":2215},"                    is_active",[1072,11302,2108],{"class":1089},[1072,11304,2221],{"class":1241},[1072,11306,1136],{"class":1089},[1072,11308,11310,11313,11315],{"class":1074,"line":11309},128,[1072,11311,11312],{"class":2215},"                    is_featured",[1072,11314,2108],{"class":1089},[1072,11316,2644],{"class":1241},[1072,11318,11320,11322,11324,11326,11328,11330,11332,11334,11337],{"class":1074,"line":11319},129,[1072,11321,8827],{"class":1089},[1072,11323,4099],{"class":2138},[1072,11325,2068],{"class":1089},[1072,11327,1107],{"class":1099},[1072,11329,4106],{"class":1103},[1072,11331,1107],{"class":1099},[1072,11333,2694],{"class":1089},[1072,11335,11336],{"class":1223},"6",[1072,11338,2700],{"class":1089},[1072,11340,11342],{"class":1074,"line":11341},130,[1072,11343,8912],{"class":1089},[1072,11345,11347],{"class":1074,"line":11346},131,[1072,11348,1925],{"class":1089},[1072,11350,11352,11354,11356,11358,11360,11362,11364,11366,11368,11370,11372,11374],{"class":1074,"line":11351},132,[1072,11353,5843],{"class":1955},[1072,11355,1959],{"class":1089},[1072,11357,2488],{"class":2138},[1072,11359,2068],{"class":1089},[1072,11361,1107],{"class":1099},[1072,11363,10972],{"class":1103},[1072,11365,1107],{"class":1099},[1072,11367,1354],{"class":1089},[1072,11369,8979],{"class":2138},[1072,11371,1354],{"class":1089},[1072,11373,10093],{"class":1223},[1072,11375,2419],{"class":1089},[1072,11377,11379],{"class":1074,"line":11378},133,[1072,11380,2047],{"class":1955},[1072,11382,11384,11386],{"class":1074,"line":11383},134,[1072,11385,2052],{"class":1089},[1072,11387,2056],{"class":2055},[1072,11389,11391,11393,11396],{"class":1074,"line":11390},135,[1072,11392,2061],{"class":2021},[1072,11394,11395],{"class":2064}," _warm_popular_products",[1072,11397,5593],{"class":1089},[1072,11399,11401,11403,11406],{"class":1074,"line":11400},136,[1072,11402,2095],{"class":2034},[1072,11404,11405],{"class":2038},"Warm popular products cache",[1072,11407,2042],{"class":2034},[1072,11409,11411,11414,11416,11418,11420,11423,11425,11427,11429,11431],{"class":1074,"line":11410},137,[1072,11412,11413],{"class":1955},"        popular ",[1072,11415,2108],{"class":1089},[1072,11417,2610],{"class":1955},[1072,11419,1959],{"class":1089},[1072,11421,11422],{"class":2138},"get_popular_products",[1072,11424,2068],{"class":1089},[1072,11426,2697],{"class":2215},[1072,11428,2108],{"class":1089},[1072,11430,8413],{"class":1223},[1072,11432,2419],{"class":1089},[1072,11434,11436,11438,11440,11442,11444,11446,11449,11451,11453,11455,11457,11459],{"class":1074,"line":11435},138,[1072,11437,5843],{"class":1955},[1072,11439,1959],{"class":1089},[1072,11441,2488],{"class":2138},[1072,11443,2068],{"class":1089},[1072,11445,1107],{"class":1099},[1072,11447,11448],{"class":1103},"popular_products_20",[1072,11450,1107],{"class":1099},[1072,11452,1354],{"class":1089},[1072,11454,10227],{"class":2138},[1072,11456,1354],{"class":1089},[1072,11458,10093],{"class":1223},[1072,11460,2419],{"class":1089},[1072,11462,11464],{"class":1074,"line":11463},139,[1072,11465,2047],{"class":1955},[1072,11467,11469,11471],{"class":1074,"line":11468},140,[1072,11470,2052],{"class":1089},[1072,11472,2056],{"class":2055},[1072,11474,11476,11478,11481],{"class":1074,"line":11475},141,[1072,11477,2061],{"class":2021},[1072,11479,11480],{"class":2064}," _warm_category_navigation",[1072,11482,5593],{"class":1089},[1072,11484,11486,11488,11491],{"class":1074,"line":11485},142,[1072,11487,2095],{"class":2034},[1072,11489,11490],{"class":2038},"Warm category navigation cache",[1072,11492,2042],{"class":2034},[1072,11494,11496,11498,11500,11502],{"class":1074,"line":11495},143,[1072,11497,9965],{"class":1955},[1072,11499,2108],{"class":1089},[1072,11501,7739],{"class":2055},[1072,11503,2346],{"class":1089},[1072,11505,11507,11510,11512,11514,11516,11518,11520,11522,11524,11526],{"class":1074,"line":11506},144,[1072,11508,11509],{"class":2138},"            Category",[1072,11511,1959],{"class":1089},[1072,11513,2616],{"class":2615},[1072,11515,1959],{"class":1089},[1072,11517,2621],{"class":2138},[1072,11519,2068],{"class":1089},[1072,11521,5161],{"class":2215},[1072,11523,2108],{"class":1089},[1072,11525,2221],{"class":1241},[1072,11527,2419],{"class":1089},[1072,11529,11531,11534,11536,11538,11541,11543,11545,11547,11549,11551,11553],{"class":1074,"line":11530},145,[1072,11532,11533],{"class":1089},"            .",[1072,11535,2652],{"class":2138},[1072,11537,2068],{"class":1089},[1072,11539,11540],{"class":2215},"product_count",[1072,11542,2108],{"class":1089},[1072,11544,2664],{"class":2138},[1072,11546,2068],{"class":1089},[1072,11548,1107],{"class":1099},[1072,11550,9902],{"class":1103},[1072,11552,1107],{"class":1099},[1072,11554,8283],{"class":1089},[1072,11556,11558,11560,11562,11564,11566,11568,11570],{"class":1074,"line":11557},146,[1072,11559,11533],{"class":1089},[1072,11561,2682],{"class":2138},[1072,11563,2068],{"class":1089},[1072,11565,1107],{"class":1099},[1072,11567,4209],{"class":1103},[1072,11569,1107],{"class":1099},[1072,11571,2419],{"class":1089},[1072,11573,11575],{"class":1074,"line":11574},147,[1072,11576,9699],{"class":1089},[1072,11578,11580,11582,11584,11586,11588,11590,11592,11594,11596,11598,11600,11603],{"class":1074,"line":11579},148,[1072,11581,5843],{"class":1955},[1072,11583,1959],{"class":1089},[1072,11585,2488],{"class":2138},[1072,11587,2068],{"class":1089},[1072,11589,1107],{"class":1099},[1072,11591,11018],{"class":1103},[1072,11593,1107],{"class":1099},[1072,11595,1354],{"class":1089},[1072,11597,10378],{"class":2138},[1072,11599,1354],{"class":1089},[1072,11601,11602],{"class":1223}," 7200",[1072,11604,2419],{"class":1089},[1030,11606,11608],{"id":11607},"cache-monitoring-and-metrics","Cache Monitoring and Metrics",[1038,11610,11612],{"id":11611},"cache-performance-monitoring","Cache Performance Monitoring",[1043,11614,11616],{"className":1066,"code":11615,"language":1068,"meta":1052,"style":1052},"from django.core.cache import cache\nfrom django.utils.deprecation import MiddlewareMixin\nimport time\nimport logging\n\nlogger = logging.getLogger('cache_performance')\n\nclass CacheMonitoringMiddleware(MiddlewareMixin):\n    \"\"\"Monitor cache performance and hit rates\"\"\"\n    \n    def process_request(self, request):\n        request.cache_stats = {\n            'hits': 0,\n            'misses': 0,\n            'sets': 0,\n            'start_time': time.time()\n        }\n    \n    def process_response(self, request, response):\n        if hasattr(request, 'cache_stats'):\n            stats = request.cache_stats\n            duration = time.time() - stats['start_time']\n            \n            # Calculate hit rate\n            total_operations = stats['hits'] + stats['misses']\n            hit_rate = (stats['hits'] / total_operations * 100) if total_operations > 0 else 0\n            \n            # Log cache performance\n            logger.info(\n                f\"Cache stats for {request.path}: \"\n                f\"hits={stats['hits']}, misses={stats['misses']}, \"\n                f\"sets={stats['sets']}, hit_rate={hit_rate:.1f}%, \"\n                f\"duration={duration:.3f}s\"\n            )\n            \n            # Add headers for monitoring\n            response['X-Cache-Hits'] = str(stats['hits'])\n            response['X-Cache-Misses'] = str(stats['misses'])\n            response['X-Cache-Hit-Rate'] = f\"{hit_rate:.1f}%\"\n        \n        return response\n\n# Cache statistics collector\nclass CacheStats:\n    \"\"\"Collect and analyze cache statistics\"\"\"\n    \n    @staticmethod\n    def get_cache_info():\n        \"\"\"Get cache backend information\"\"\"\n        try:\n            # Redis-specific stats\n            if hasattr(cache, '_cache') and hasattr(cache._cache, 'get_client'):\n                client = cache._cache.get_client()\n                info = client.info()\n                \n                return {\n                    'backend': 'Redis',\n                    'memory_used': info.get('used_memory_human'),\n                    'memory_peak': info.get('used_memory_peak_human'),\n                    'connected_clients': info.get('connected_clients'),\n                    'total_commands': info.get('total_commands_processed'),\n                    'keyspace_hits': info.get('keyspace_hits'),\n                    'keyspace_misses': info.get('keyspace_misses'),\n                    'hit_rate': (\n                        info.get('keyspace_hits', 0) / \n                        max(info.get('keyspace_hits', 0) + info.get('keyspace_misses', 0), 1) * 100\n                    )\n                }\n        except Exception as e:\n            logger.error(f\"Error getting cache info: {e}\")\n        \n        return {'backend': 'Unknown', 'error': 'Could not retrieve cache info'}\n    \n    @staticmethod\n    def analyze_cache_keys(pattern='*'):\n        \"\"\"Analyze cache key patterns and sizes\"\"\"\n        try:\n            if hasattr(cache, '_cache') and hasattr(cache._cache, 'get_client'):\n                client = cache._cache.get_client()\n                keys = client.keys(pattern)\n                \n                analysis = {\n                    'total_keys': len(keys),\n                    'key_patterns': {},\n                    'large_keys': [],\n                }\n                \n                for key in keys[:1000]:  # Limit analysis to prevent performance issues\n                    # Analyze key patterns\n                    prefix = key.decode().split('_')[0] if '_' in key.decode() else 'other'\n                    analysis['key_patterns'][prefix] = analysis['key_patterns'].get(prefix, 0) + 1\n                    \n                    # Check key size\n                    try:\n                        size = client.memory_usage(key)\n                        if size and size > 10000:  # Keys larger than 10KB\n                            analysis['large_keys'].append({\n                                'key': key.decode(),\n                                'size': size\n                            })\n                    except:\n                        pass\n                \n                return analysis\n        except Exception as e:\n            logger.error(f\"Error analyzing cache keys: {e}\")\n        \n        return {'error': 'Could not analyze cache keys'}\n",[1050,11617,11618,11636,11656,11662,11668,11672,11695,11699,11713,11722,11726,11743,11757,11772,11787,11802,11823,11827,11831,11852,11872,11886,11915,11919,11924,11957,12005,12009,12014,12025,12045,12090,12129,12149,12153,12157,12162,12196,12229,12261,12265,12271,12275,12280,12289,12298,12302,12308,12317,12326,12333,12338,12382,12401,12417,12421,12427,12447,12476,12504,12531,12559,12586,12613,12625,12653,12711,12716,12720,12733,12758,12762,12803,12807,12813,12834,12843,12849,12891,12909,12928,12932,12941,12961,12975,12989,12993,12997,13020,13025,13086,13137,13142,13147,13154,13174,13197,13218,13237,13251,13256,13263,13268,13272,13279,13291,13316,13320],{"__ignoreMap":1052},[1072,11619,11620,11622,11624,11626,11628,11630,11632,11634],{"class":1074,"line":1075},[1072,11621,1952],{"class":1951},[1072,11623,1956],{"class":1955},[1072,11625,1959],{"class":1089},[1072,11627,1962],{"class":1955},[1072,11629,1959],{"class":1089},[1072,11631,1967],{"class":1955},[1072,11633,1970],{"class":1951},[1072,11635,1973],{"class":1955},[1072,11637,11638,11640,11642,11644,11646,11648,11651,11653],{"class":1074,"line":1082},[1072,11639,1952],{"class":1951},[1072,11641,1956],{"class":1955},[1072,11643,1959],{"class":1089},[1072,11645,4390],{"class":1955},[1072,11647,1959],{"class":1089},[1072,11649,11650],{"class":1955},"deprecation ",[1072,11652,1970],{"class":1951},[1072,11654,11655],{"class":1955}," MiddlewareMixin\n",[1072,11657,11658,11660],{"class":1074,"line":1096},[1072,11659,1970],{"class":1951},[1072,11661,3125],{"class":1955},[1072,11663,11664,11666],{"class":1074,"line":1115},[1072,11665,1970],{"class":1951},[1072,11667,9553],{"class":1955},[1072,11669,11670],{"class":1074,"line":1139},[1072,11671,1376],{"emptyLinePlaceholder":1375},[1072,11673,11674,11676,11678,11680,11682,11684,11686,11688,11691,11693],{"class":1074,"line":1160},[1072,11675,9562],{"class":1955},[1072,11677,2108],{"class":1089},[1072,11679,9567],{"class":1955},[1072,11681,1959],{"class":1089},[1072,11683,9572],{"class":2138},[1072,11685,2068],{"class":1089},[1072,11687,1107],{"class":1099},[1072,11689,11690],{"class":1103},"cache_performance",[1072,11692,1107],{"class":1099},[1072,11694,2419],{"class":1089},[1072,11696,11697],{"class":1074,"line":1174},[1072,11698,1376],{"emptyLinePlaceholder":1375},[1072,11700,11701,11703,11706,11708,11711],{"class":1074,"line":1196},[1072,11702,2022],{"class":2021},[1072,11704,11705],{"class":2025}," CacheMonitoringMiddleware",[1072,11707,2068],{"class":1089},[1072,11709,11710],{"class":5067},"MiddlewareMixin",[1072,11712,2090],{"class":1089},[1072,11714,11715,11717,11720],{"class":1074,"line":1210},[1072,11716,2035],{"class":2034},[1072,11718,11719],{"class":2038},"Monitor cache performance and hit rates",[1072,11721,2042],{"class":2034},[1072,11723,11724],{"class":1074,"line":1229},[1072,11725,2047],{"class":1955},[1072,11727,11728,11730,11733,11735,11737,11739,11741],{"class":1074,"line":1247},[1072,11729,2061],{"class":2021},[1072,11731,11732],{"class":2064}," process_request",[1072,11734,2068],{"class":1089},[1072,11736,3164],{"class":3163},[1072,11738,1354],{"class":1089},[1072,11740,4501],{"class":2071},[1072,11742,2090],{"class":1089},[1072,11744,11745,11748,11750,11753,11755],{"class":1074,"line":1253},[1072,11746,11747],{"class":1955},"        request",[1072,11749,1959],{"class":1089},[1072,11751,11752],{"class":2615},"cache_stats",[1072,11754,1090],{"class":1089},[1072,11756,1093],{"class":1089},[1072,11758,11759,11761,11764,11766,11768,11770],{"class":1074,"line":1274},[1072,11760,1177],{"class":1099},[1072,11762,11763],{"class":1103},"hits",[1072,11765,1107],{"class":1099},[1072,11767,1110],{"class":1089},[1072,11769,2894],{"class":1223},[1072,11771,1136],{"class":1089},[1072,11773,11774,11776,11779,11781,11783,11785],{"class":1074,"line":1295},[1072,11775,1177],{"class":1099},[1072,11777,11778],{"class":1103},"misses",[1072,11780,1107],{"class":1099},[1072,11782,1110],{"class":1089},[1072,11784,2894],{"class":1223},[1072,11786,1136],{"class":1089},[1072,11788,11789,11791,11794,11796,11798,11800],{"class":1074,"line":1301},[1072,11790,1177],{"class":1099},[1072,11792,11793],{"class":1103},"sets",[1072,11795,1107],{"class":1099},[1072,11797,1110],{"class":1089},[1072,11799,2894],{"class":1223},[1072,11801,1136],{"class":1089},[1072,11803,11804,11806,11809,11811,11813,11816,11818,11821],{"class":1074,"line":1322},[1072,11805,1177],{"class":1099},[1072,11807,11808],{"class":1103},"start_time",[1072,11810,1107],{"class":1099},[1072,11812,1110],{"class":1089},[1072,11814,11815],{"class":1955}," time",[1072,11817,1959],{"class":1089},[1072,11819,11820],{"class":2138},"time",[1072,11822,3447],{"class":1089},[1072,11824,11825],{"class":1074,"line":1339},[1072,11826,1925],{"class":1089},[1072,11828,11829],{"class":1074,"line":1360},[1072,11830,2047],{"class":1955},[1072,11832,11833,11835,11838,11840,11842,11844,11846,11848,11850],{"class":1074,"line":1366},[1072,11834,2061],{"class":2021},[1072,11836,11837],{"class":2064}," process_response",[1072,11839,2068],{"class":1089},[1072,11841,3164],{"class":3163},[1072,11843,1354],{"class":1089},[1072,11845,4501],{"class":2071},[1072,11847,1354],{"class":1089},[1072,11849,4741],{"class":2071},[1072,11851,2090],{"class":1089},[1072,11853,11854,11856,11858,11860,11862,11864,11866,11868,11870],{"class":1074,"line":1372},[1072,11855,2168],{"class":1951},[1072,11857,3611],{"class":2144},[1072,11859,2068],{"class":1089},[1072,11861,4480],{"class":2138},[1072,11863,1354],{"class":1089},[1072,11865,1128],{"class":1099},[1072,11867,11752],{"class":1103},[1072,11869,1107],{"class":1099},[1072,11871,2090],{"class":1089},[1072,11873,11874,11877,11879,11881,11883],{"class":1074,"line":1379},[1072,11875,11876],{"class":1955},"            stats ",[1072,11878,2108],{"class":1089},[1072,11880,4501],{"class":1955},[1072,11882,1959],{"class":1089},[1072,11884,11885],{"class":2615},"cache_stats\n",[1072,11887,11888,11891,11893,11895,11897,11899,11901,11903,11905,11907,11909,11911,11913],{"class":1074,"line":1385},[1072,11889,11890],{"class":1955},"            duration ",[1072,11892,2108],{"class":1089},[1072,11894,11815],{"class":1955},[1072,11896,1959],{"class":1089},[1072,11898,11820],{"class":2138},[1072,11900,2236],{"class":1089},[1072,11902,3730],{"class":1720},[1072,11904,8979],{"class":1955},[1072,11906,3196],{"class":1089},[1072,11908,1107],{"class":1099},[1072,11910,11808],{"class":1103},[1072,11912,1107],{"class":1099},[1072,11914,2700],{"class":1089},[1072,11916,11917],{"class":1074,"line":1394},[1072,11918,2516],{"class":1955},[1072,11920,11921],{"class":1074,"line":1407},[1072,11922,11923],{"class":1078},"            # Calculate hit rate\n",[1072,11925,11926,11929,11931,11933,11935,11937,11939,11941,11943,11945,11947,11949,11951,11953,11955],{"class":1074,"line":1426},[1072,11927,11928],{"class":1955},"            total_operations ",[1072,11930,2108],{"class":1089},[1072,11932,8979],{"class":1955},[1072,11934,3196],{"class":1089},[1072,11936,1107],{"class":1099},[1072,11938,11763],{"class":1103},[1072,11940,1107],{"class":1099},[1072,11942,2888],{"class":1089},[1072,11944,9343],{"class":1720},[1072,11946,8979],{"class":1955},[1072,11948,3196],{"class":1089},[1072,11950,1107],{"class":1099},[1072,11952,11778],{"class":1103},[1072,11954,1107],{"class":1099},[1072,11956,2700],{"class":1089},[1072,11958,11959,11962,11964,11967,11969,11971,11973,11975,11977,11979,11982,11985,11987,11990,11992,11994,11996,11998,12000,12002],{"class":1074,"line":1445},[1072,11960,11961],{"class":1955},"            hit_rate ",[1072,11963,2108],{"class":1089},[1072,11965,11966],{"class":1089}," (",[1072,11968,4928],{"class":1955},[1072,11970,3196],{"class":1089},[1072,11972,1107],{"class":1099},[1072,11974,11763],{"class":1103},[1072,11976,1107],{"class":1099},[1072,11978,2888],{"class":1089},[1072,11980,11981],{"class":1720}," /",[1072,11983,11984],{"class":1955}," total_operations ",[1072,11986,2314],{"class":1720},[1072,11988,11989],{"class":1223}," 100",[1072,11991,2565],{"class":1089},[1072,11993,8937],{"class":1951},[1072,11995,11984],{"class":1955},[1072,11997,6198],{"class":1720},[1072,11999,2894],{"class":1223},[1072,12001,8959],{"class":1951},[1072,12003,12004],{"class":1223}," 0\n",[1072,12006,12007],{"class":1074,"line":1458},[1072,12008,2516],{"class":1955},[1072,12010,12011],{"class":1074,"line":1477},[1072,12012,12013],{"class":1078},"            # Log cache performance\n",[1072,12015,12016,12019,12021,12023],{"class":1074,"line":1482},[1072,12017,12018],{"class":1955},"            logger",[1072,12020,1959],{"class":1089},[1072,12022,10248],{"class":2138},[1072,12024,2346],{"class":1089},[1072,12026,12027,12029,12032,12034,12036,12038,12040,12042],{"class":1074,"line":1497},[1072,12028,5426],{"class":2021},[1072,12030,12031],{"class":1103},"\"Cache stats for ",[1072,12033,2118],{"class":2117},[1072,12035,4480],{"class":2138},[1072,12037,1959],{"class":1089},[1072,12039,4550],{"class":2615},[1072,12041,2123],{"class":2117},[1072,12043,12044],{"class":1103},": \"\n",[1072,12046,12047,12049,12052,12054,12056,12058,12060,12062,12064,12066,12068,12071,12073,12075,12077,12079,12081,12083,12085,12087],{"class":1074,"line":1503},[1072,12048,5426],{"class":2021},[1072,12050,12051],{"class":1103},"\"hits=",[1072,12053,2118],{"class":2117},[1072,12055,4928],{"class":2138},[1072,12057,3196],{"class":1089},[1072,12059,1107],{"class":1099},[1072,12061,11763],{"class":1103},[1072,12063,1107],{"class":1099},[1072,12065,2888],{"class":1089},[1072,12067,2123],{"class":2117},[1072,12069,12070],{"class":1103},", misses=",[1072,12072,2118],{"class":2117},[1072,12074,4928],{"class":2138},[1072,12076,3196],{"class":1089},[1072,12078,1107],{"class":1099},[1072,12080,11778],{"class":1103},[1072,12082,1107],{"class":1099},[1072,12084,2888],{"class":1089},[1072,12086,2123],{"class":2117},[1072,12088,12089],{"class":1103},", \"\n",[1072,12091,12092,12094,12097,12099,12101,12103,12105,12107,12109,12111,12113,12116,12118,12121,12124,12126],{"class":1074,"line":1517},[1072,12093,5426],{"class":2021},[1072,12095,12096],{"class":1103},"\"sets=",[1072,12098,2118],{"class":2117},[1072,12100,4928],{"class":2138},[1072,12102,3196],{"class":1089},[1072,12104,1107],{"class":1099},[1072,12106,11793],{"class":1103},[1072,12108,1107],{"class":1099},[1072,12110,2888],{"class":1089},[1072,12112,2123],{"class":2117},[1072,12114,12115],{"class":1103},", hit_rate=",[1072,12117,2118],{"class":2117},[1072,12119,12120],{"class":2138},"hit_rate",[1072,12122,12123],{"class":2021},":.1f",[1072,12125,2123],{"class":2117},[1072,12127,12128],{"class":1103},"%, \"\n",[1072,12130,12131,12133,12136,12138,12141,12144,12146],{"class":1074,"line":1536},[1072,12132,5426],{"class":2021},[1072,12134,12135],{"class":1103},"\"duration=",[1072,12137,2118],{"class":2117},[1072,12139,12140],{"class":2138},"duration",[1072,12142,12143],{"class":2021},":.3f",[1072,12145,2123],{"class":2117},[1072,12147,12148],{"class":1103},"s\"\n",[1072,12150,12151],{"class":1074,"line":1556},[1072,12152,8309],{"class":1089},[1072,12154,12155],{"class":1074,"line":1569},[1072,12156,2516],{"class":1955},[1072,12158,12159],{"class":1074,"line":1588},[1072,12160,12161],{"class":1078},"            # Add headers for monitoring\n",[1072,12163,12164,12167,12169,12171,12174,12176,12178,12180,12182,12184,12186,12188,12190,12192,12194],{"class":1074,"line":1593},[1072,12165,12166],{"class":1955},"            response",[1072,12168,3196],{"class":1089},[1072,12170,1107],{"class":1099},[1072,12172,12173],{"class":1103},"X-Cache-Hits",[1072,12175,1107],{"class":1099},[1072,12177,2888],{"class":1089},[1072,12179,1090],{"class":1089},[1072,12181,4236],{"class":2055},[1072,12183,2068],{"class":1089},[1072,12185,4928],{"class":2138},[1072,12187,3196],{"class":1089},[1072,12189,1107],{"class":1099},[1072,12191,11763],{"class":1103},[1072,12193,1107],{"class":1099},[1072,12195,9885],{"class":1089},[1072,12197,12198,12200,12202,12204,12207,12209,12211,12213,12215,12217,12219,12221,12223,12225,12227],{"class":1074,"line":1612},[1072,12199,12166],{"class":1955},[1072,12201,3196],{"class":1089},[1072,12203,1107],{"class":1099},[1072,12205,12206],{"class":1103},"X-Cache-Misses",[1072,12208,1107],{"class":1099},[1072,12210,2888],{"class":1089},[1072,12212,1090],{"class":1089},[1072,12214,4236],{"class":2055},[1072,12216,2068],{"class":1089},[1072,12218,4928],{"class":2138},[1072,12220,3196],{"class":1089},[1072,12222,1107],{"class":1099},[1072,12224,11778],{"class":1103},[1072,12226,1107],{"class":1099},[1072,12228,9885],{"class":1089},[1072,12230,12231,12233,12235,12237,12240,12242,12244,12246,12248,12250,12252,12254,12256,12258],{"class":1074,"line":1617},[1072,12232,12166],{"class":1955},[1072,12234,3196],{"class":1089},[1072,12236,1107],{"class":1099},[1072,12238,12239],{"class":1103},"X-Cache-Hit-Rate",[1072,12241,1107],{"class":1099},[1072,12243,2888],{"class":1089},[1072,12245,1090],{"class":1089},[1072,12247,2111],{"class":2021},[1072,12249,2114],{"class":1103},[1072,12251,2118],{"class":2117},[1072,12253,12120],{"class":1955},[1072,12255,12123],{"class":2021},[1072,12257,2123],{"class":2117},[1072,12259,12260],{"class":1103},"%\"\n",[1072,12262,12263],{"class":1074,"line":1631},[1072,12264,3280],{"class":1955},[1072,12266,12267,12269],{"class":1074,"line":1650},[1072,12268,2245],{"class":1951},[1072,12270,4754],{"class":1955},[1072,12272,12273],{"class":1074,"line":1670},[1072,12274,1376],{"emptyLinePlaceholder":1375},[1072,12276,12277],{"class":1074,"line":1683},[1072,12278,12279],{"class":1078},"# Cache statistics collector\n",[1072,12281,12282,12284,12287],{"class":1074,"line":1702},[1072,12283,2022],{"class":2021},[1072,12285,12286],{"class":2025}," CacheStats",[1072,12288,2029],{"class":1089},[1072,12290,12291,12293,12296],{"class":1074,"line":1707},[1072,12292,2035],{"class":2034},[1072,12294,12295],{"class":2038},"Collect and analyze cache statistics",[1072,12297,2042],{"class":2034},[1072,12299,12300],{"class":1074,"line":1732},[1072,12301,2047],{"class":1955},[1072,12303,12304,12306],{"class":1074,"line":1737},[1072,12305,2052],{"class":1089},[1072,12307,2056],{"class":2055},[1072,12309,12310,12312,12315],{"class":1074,"line":1742},[1072,12311,2061],{"class":2021},[1072,12313,12314],{"class":2064}," get_cache_info",[1072,12316,5593],{"class":1089},[1072,12318,12319,12321,12324],{"class":1074,"line":1747},[1072,12320,2095],{"class":2034},[1072,12322,12323],{"class":2038},"Get cache backend information",[1072,12325,2042],{"class":2034},[1072,12327,12328,12331],{"class":1074,"line":1753},[1072,12329,12330],{"class":1951},"        try",[1072,12332,2029],{"class":1089},[1072,12334,12335],{"class":1074,"line":1769},[1072,12336,12337],{"class":1078},"            # Redis-specific stats\n",[1072,12339,12340,12342,12344,12346,12348,12350,12352,12355,12357,12359,12361,12363,12365,12367,12369,12371,12373,12375,12378,12380],{"class":1074,"line":2731},[1072,12341,3855],{"class":1951},[1072,12343,3611],{"class":2144},[1072,12345,2068],{"class":1089},[1072,12347,1988],{"class":2138},[1072,12349,1354],{"class":1089},[1072,12351,1128],{"class":1099},[1072,12353,12354],{"class":1103},"_cache",[1072,12356,1107],{"class":1099},[1072,12358,2565],{"class":1089},[1072,12360,5608],{"class":1720},[1072,12362,3611],{"class":2144},[1072,12364,2068],{"class":1089},[1072,12366,1988],{"class":2138},[1072,12368,1959],{"class":1089},[1072,12370,12354],{"class":2615},[1072,12372,1354],{"class":1089},[1072,12374,1128],{"class":1099},[1072,12376,12377],{"class":1103},"get_client",[1072,12379,1107],{"class":1099},[1072,12381,2090],{"class":1089},[1072,12383,12384,12387,12389,12391,12393,12395,12397,12399],{"class":1074,"line":2746},[1072,12385,12386],{"class":1955},"                client ",[1072,12388,2108],{"class":1089},[1072,12390,2406],{"class":1955},[1072,12392,1959],{"class":1089},[1072,12394,12354],{"class":2615},[1072,12396,1959],{"class":1089},[1072,12398,12377],{"class":2138},[1072,12400,3447],{"class":1089},[1072,12402,12403,12406,12408,12411,12413,12415],{"class":1074,"line":2756},[1072,12404,12405],{"class":1955},"                info ",[1072,12407,2108],{"class":1089},[1072,12409,12410],{"class":1955}," client",[1072,12412,1959],{"class":1089},[1072,12414,10248],{"class":2138},[1072,12416,3447],{"class":1089},[1072,12418,12419],{"class":1074,"line":2786},[1072,12420,2391],{"class":1955},[1072,12422,12423,12425],{"class":1074,"line":2791},[1072,12424,2509],{"class":1951},[1072,12426,1093],{"class":1089},[1072,12428,12429,12431,12434,12436,12438,12440,12443,12445],{"class":1074,"line":2801},[1072,12430,8882],{"class":1099},[1072,12432,12433],{"class":1103},"backend",[1072,12435,1107],{"class":1099},[1072,12437,1110],{"class":1089},[1072,12439,1128],{"class":1099},[1072,12441,12442],{"class":1103},"Redis",[1072,12444,1107],{"class":1099},[1072,12446,1136],{"class":1089},[1072,12448,12449,12451,12454,12456,12458,12461,12463,12465,12467,12469,12472,12474],{"class":1074,"line":2828},[1072,12450,8882],{"class":1099},[1072,12452,12453],{"class":1103},"memory_used",[1072,12455,1107],{"class":1099},[1072,12457,1110],{"class":1089},[1072,12459,12460],{"class":1955}," info",[1072,12462,1959],{"class":1089},[1072,12464,2411],{"class":2138},[1072,12466,2068],{"class":1089},[1072,12468,1107],{"class":1099},[1072,12470,12471],{"class":1103},"used_memory_human",[1072,12473,1107],{"class":1099},[1072,12475,4247],{"class":1089},[1072,12477,12478,12480,12483,12485,12487,12489,12491,12493,12495,12497,12500,12502],{"class":1074,"line":2853},[1072,12479,8882],{"class":1099},[1072,12481,12482],{"class":1103},"memory_peak",[1072,12484,1107],{"class":1099},[1072,12486,1110],{"class":1089},[1072,12488,12460],{"class":1955},[1072,12490,1959],{"class":1089},[1072,12492,2411],{"class":2138},[1072,12494,2068],{"class":1089},[1072,12496,1107],{"class":1099},[1072,12498,12499],{"class":1103},"used_memory_peak_human",[1072,12501,1107],{"class":1099},[1072,12503,4247],{"class":1089},[1072,12505,12506,12508,12511,12513,12515,12517,12519,12521,12523,12525,12527,12529],{"class":1074,"line":2875},[1072,12507,8882],{"class":1099},[1072,12509,12510],{"class":1103},"connected_clients",[1072,12512,1107],{"class":1099},[1072,12514,1110],{"class":1089},[1072,12516,12460],{"class":1955},[1072,12518,1959],{"class":1089},[1072,12520,2411],{"class":2138},[1072,12522,2068],{"class":1089},[1072,12524,1107],{"class":1099},[1072,12526,12510],{"class":1103},[1072,12528,1107],{"class":1099},[1072,12530,4247],{"class":1089},[1072,12532,12533,12535,12538,12540,12542,12544,12546,12548,12550,12552,12555,12557],{"class":1074,"line":2899},[1072,12534,8882],{"class":1099},[1072,12536,12537],{"class":1103},"total_commands",[1072,12539,1107],{"class":1099},[1072,12541,1110],{"class":1089},[1072,12543,12460],{"class":1955},[1072,12545,1959],{"class":1089},[1072,12547,2411],{"class":2138},[1072,12549,2068],{"class":1089},[1072,12551,1107],{"class":1099},[1072,12553,12554],{"class":1103},"total_commands_processed",[1072,12556,1107],{"class":1099},[1072,12558,4247],{"class":1089},[1072,12560,12561,12563,12566,12568,12570,12572,12574,12576,12578,12580,12582,12584],{"class":1074,"line":2924},[1072,12562,8882],{"class":1099},[1072,12564,12565],{"class":1103},"keyspace_hits",[1072,12567,1107],{"class":1099},[1072,12569,1110],{"class":1089},[1072,12571,12460],{"class":1955},[1072,12573,1959],{"class":1089},[1072,12575,2411],{"class":2138},[1072,12577,2068],{"class":1089},[1072,12579,1107],{"class":1099},[1072,12581,12565],{"class":1103},[1072,12583,1107],{"class":1099},[1072,12585,4247],{"class":1089},[1072,12587,12588,12590,12593,12595,12597,12599,12601,12603,12605,12607,12609,12611],{"class":1074,"line":2934},[1072,12589,8882],{"class":1099},[1072,12591,12592],{"class":1103},"keyspace_misses",[1072,12594,1107],{"class":1099},[1072,12596,1110],{"class":1089},[1072,12598,12460],{"class":1955},[1072,12600,1959],{"class":1089},[1072,12602,2411],{"class":2138},[1072,12604,2068],{"class":1089},[1072,12606,1107],{"class":1099},[1072,12608,12592],{"class":1103},[1072,12610,1107],{"class":1099},[1072,12612,4247],{"class":1089},[1072,12614,12615,12617,12619,12621,12623],{"class":1074,"line":2944},[1072,12616,8882],{"class":1099},[1072,12618,12120],{"class":1103},[1072,12620,1107],{"class":1099},[1072,12622,1110],{"class":1089},[1072,12624,9304],{"class":1089},[1072,12626,12627,12630,12632,12634,12636,12638,12640,12642,12644,12646,12648,12650],{"class":1074,"line":2964},[1072,12628,12629],{"class":1955},"                        info",[1072,12631,1959],{"class":1089},[1072,12633,2411],{"class":2138},[1072,12635,2068],{"class":1089},[1072,12637,1107],{"class":1099},[1072,12639,12565],{"class":1103},[1072,12641,1107],{"class":1099},[1072,12643,1354],{"class":1089},[1072,12645,2894],{"class":1223},[1072,12647,2565],{"class":1089},[1072,12649,11981],{"class":1720},[1072,12651,12652],{"class":1955}," \n",[1072,12654,12655,12658,12660,12662,12664,12666,12668,12670,12672,12674,12676,12678,12680,12682,12684,12686,12688,12690,12692,12694,12696,12698,12700,12702,12704,12706,12708],{"class":1074,"line":2987},[1072,12656,12657],{"class":2144},"                        max",[1072,12659,2068],{"class":1089},[1072,12661,10248],{"class":2138},[1072,12663,1959],{"class":1089},[1072,12665,2411],{"class":2138},[1072,12667,2068],{"class":1089},[1072,12669,1107],{"class":1099},[1072,12671,12565],{"class":1103},[1072,12673,1107],{"class":1099},[1072,12675,1354],{"class":1089},[1072,12677,2894],{"class":1223},[1072,12679,2565],{"class":1089},[1072,12681,9343],{"class":1720},[1072,12683,12460],{"class":2138},[1072,12685,1959],{"class":1089},[1072,12687,2411],{"class":2138},[1072,12689,2068],{"class":1089},[1072,12691,1107],{"class":1099},[1072,12693,12592],{"class":1103},[1072,12695,1107],{"class":1099},[1072,12697,1354],{"class":1089},[1072,12699,2894],{"class":1223},[1072,12701,5007],{"class":1089},[1072,12703,1334],{"class":1223},[1072,12705,2565],{"class":1089},[1072,12707,1721],{"class":1720},[1072,12709,12710],{"class":1223}," 100\n",[1072,12712,12713],{"class":1074,"line":3028},[1072,12714,12715],{"class":1089},"                    )\n",[1072,12717,12718],{"class":1074,"line":3033},[1072,12719,10593],{"class":1089},[1072,12721,12722,12725,12727,12729,12731],{"class":1074,"line":3038},[1072,12723,12724],{"class":1951},"        except",[1072,12726,10281],{"class":2055},[1072,12728,10284],{"class":1951},[1072,12730,10287],{"class":1955},[1072,12732,2029],{"class":1089},[1072,12734,12735,12737,12739,12741,12743,12745,12748,12750,12752,12754,12756],{"class":1074,"line":3938},[1072,12736,12018],{"class":1955},[1072,12738,1959],{"class":1089},[1072,12740,10298],{"class":2138},[1072,12742,2068],{"class":1089},[1072,12744,3979],{"class":2021},[1072,12746,12747],{"class":1103},"\"Error getting cache info: ",[1072,12749,2118],{"class":2117},[1072,12751,10323],{"class":2138},[1072,12753,2123],{"class":2117},[1072,12755,2114],{"class":1103},[1072,12757,2419],{"class":1089},[1072,12759,12760],{"class":1074,"line":3943},[1072,12761,3280],{"class":1955},[1072,12763,12764,12766,12769,12771,12773,12775,12777,12779,12782,12784,12786,12788,12790,12792,12794,12796,12799,12801],{"class":1074,"line":3958},[1072,12765,2245],{"class":1951},[1072,12767,12768],{"class":1089}," {",[1072,12770,1107],{"class":1099},[1072,12772,12433],{"class":1103},[1072,12774,1107],{"class":1099},[1072,12776,1110],{"class":1089},[1072,12778,1128],{"class":1099},[1072,12780,12781],{"class":1103},"Unknown",[1072,12783,1107],{"class":1099},[1072,12785,1354],{"class":1089},[1072,12787,1128],{"class":1099},[1072,12789,10298],{"class":1103},[1072,12791,1107],{"class":1099},[1072,12793,1110],{"class":1089},[1072,12795,1128],{"class":1099},[1072,12797,12798],{"class":1103},"Could not retrieve cache info",[1072,12800,1107],{"class":1099},[1072,12802,1369],{"class":1089},[1072,12804,12805],{"class":1074,"line":3968},[1072,12806,2047],{"class":1955},[1072,12808,12809,12811],{"class":1074,"line":4007},[1072,12810,2052],{"class":1089},[1072,12812,2056],{"class":2055},[1072,12814,12815,12817,12820,12822,12824,12826,12828,12830,12832],{"class":1074,"line":4012},[1072,12816,2061],{"class":2021},[1072,12818,12819],{"class":2064}," analyze_cache_keys",[1072,12821,2068],{"class":1089},[1072,12823,3648],{"class":2071},[1072,12825,2108],{"class":1720},[1072,12827,1107],{"class":1099},[1072,12829,2314],{"class":1103},[1072,12831,1107],{"class":1099},[1072,12833,2090],{"class":1089},[1072,12835,12836,12838,12841],{"class":1074,"line":4026},[1072,12837,2095],{"class":2034},[1072,12839,12840],{"class":2038},"Analyze cache key patterns and sizes",[1072,12842,2042],{"class":2034},[1072,12844,12845,12847],{"class":1074,"line":4069},[1072,12846,12330],{"class":1951},[1072,12848,2029],{"class":1089},[1072,12850,12851,12853,12855,12857,12859,12861,12863,12865,12867,12869,12871,12873,12875,12877,12879,12881,12883,12885,12887,12889],{"class":1074,"line":4113},[1072,12852,3855],{"class":1951},[1072,12854,3611],{"class":2144},[1072,12856,2068],{"class":1089},[1072,12858,1988],{"class":2138},[1072,12860,1354],{"class":1089},[1072,12862,1128],{"class":1099},[1072,12864,12354],{"class":1103},[1072,12866,1107],{"class":1099},[1072,12868,2565],{"class":1089},[1072,12870,5608],{"class":1720},[1072,12872,3611],{"class":2144},[1072,12874,2068],{"class":1089},[1072,12876,1988],{"class":2138},[1072,12878,1959],{"class":1089},[1072,12880,12354],{"class":2615},[1072,12882,1354],{"class":1089},[1072,12884,1128],{"class":1099},[1072,12886,12377],{"class":1103},[1072,12888,1107],{"class":1099},[1072,12890,2090],{"class":1089},[1072,12892,12893,12895,12897,12899,12901,12903,12905,12907],{"class":1074,"line":4118},[1072,12894,12386],{"class":1955},[1072,12896,2108],{"class":1089},[1072,12898,2406],{"class":1955},[1072,12900,1959],{"class":1089},[1072,12902,12354],{"class":2615},[1072,12904,1959],{"class":1089},[1072,12906,12377],{"class":2138},[1072,12908,3447],{"class":1089},[1072,12910,12911,12914,12916,12918,12920,12922,12924,12926],{"class":1074,"line":4127},[1072,12912,12913],{"class":1955},"                keys ",[1072,12915,2108],{"class":1089},[1072,12917,12410],{"class":1955},[1072,12919,1959],{"class":1089},[1072,12921,3709],{"class":2138},[1072,12923,2068],{"class":1089},[1072,12925,3648],{"class":2138},[1072,12927,2419],{"class":1089},[1072,12929,12930],{"class":1074,"line":4143},[1072,12931,2391],{"class":1955},[1072,12933,12934,12937,12939],{"class":1074,"line":4168},[1072,12935,12936],{"class":1955},"                analysis ",[1072,12938,2108],{"class":1089},[1072,12940,1093],{"class":1089},[1072,12942,12943,12945,12948,12950,12952,12955,12957,12959],{"class":1074,"line":4184},[1072,12944,8882],{"class":1099},[1072,12946,12947],{"class":1103},"total_keys",[1072,12949,1107],{"class":1099},[1072,12951,1110],{"class":1089},[1072,12953,12954],{"class":2144}," len",[1072,12956,2068],{"class":1089},[1072,12958,3709],{"class":2138},[1072,12960,4247],{"class":1089},[1072,12962,12963,12965,12968,12970,12972],{"class":1074,"line":4204},[1072,12964,8882],{"class":1099},[1072,12966,12967],{"class":1103},"key_patterns",[1072,12969,1107],{"class":1099},[1072,12971,1110],{"class":1089},[1072,12973,12974],{"class":1089}," {},\n",[1072,12976,12977,12979,12982,12984,12986],{"class":1074,"line":4224},[1072,12978,8882],{"class":1099},[1072,12980,12981],{"class":1103},"large_keys",[1072,12983,1107],{"class":1099},[1072,12985,1110],{"class":1089},[1072,12987,12988],{"class":1089}," [],\n",[1072,12990,12991],{"class":1074,"line":4250},[1072,12992,10593],{"class":1089},[1072,12994,12995],{"class":1074,"line":4273},[1072,12996,2391],{"class":1955},[1072,12998,12999,13002,13004,13006,13008,13011,13014,13017],{"class":1074,"line":4279},[1072,13000,13001],{"class":1951},"                for",[1072,13003,3805],{"class":1955},[1072,13005,3808],{"class":1951},[1072,13007,3670],{"class":1955},[1072,13009,13010],{"class":1089},"[:",[1072,13012,13013],{"class":1223},"1000",[1072,13015,13016],{"class":1089},"]:",[1072,13018,13019],{"class":1078},"  # Limit analysis to prevent performance issues\n",[1072,13021,13022],{"class":1074,"line":4286},[1072,13023,13024],{"class":1078},"                    # Analyze key patterns\n",[1072,13026,13027,13030,13032,13034,13036,13039,13041,13043,13045,13047,13049,13051,13053,13056,13058,13060,13062,13064,13066,13069,13071,13073,13075,13077,13079,13081,13084],{"class":1074,"line":4291},[1072,13028,13029],{"class":1955},"                    prefix ",[1072,13031,2108],{"class":1089},[1072,13033,3221],{"class":1955},[1072,13035,1959],{"class":1089},[1072,13037,13038],{"class":2138},"decode",[1072,13040,3022],{"class":1089},[1072,13042,4040],{"class":2138},[1072,13044,2068],{"class":1089},[1072,13046,1107],{"class":1099},[1072,13048,4541],{"class":1103},[1072,13050,1107],{"class":1099},[1072,13052,4051],{"class":1089},[1072,13054,13055],{"class":1223},"0",[1072,13057,2888],{"class":1089},[1072,13059,8937],{"class":1951},[1072,13061,1128],{"class":1099},[1072,13063,4541],{"class":1103},[1072,13065,1107],{"class":1099},[1072,13067,13068],{"class":1720}," in",[1072,13070,3221],{"class":1955},[1072,13072,1959],{"class":1089},[1072,13074,13038],{"class":2138},[1072,13076,2236],{"class":1089},[1072,13078,8959],{"class":1951},[1072,13080,1128],{"class":1099},[1072,13082,13083],{"class":1103},"other",[1072,13085,1766],{"class":1099},[1072,13087,13088,13091,13093,13095,13097,13099,13102,13104,13106,13108,13111,13113,13115,13117,13119,13121,13123,13125,13127,13129,13131,13133,13135],{"class":1074,"line":10757},[1072,13089,13090],{"class":1955},"                    analysis",[1072,13092,3196],{"class":1089},[1072,13094,1107],{"class":1099},[1072,13096,12967],{"class":1103},[1072,13098,1107],{"class":1099},[1072,13100,13101],{"class":1089},"][",[1072,13103,2072],{"class":1955},[1072,13105,2888],{"class":1089},[1072,13107,1090],{"class":1089},[1072,13109,13110],{"class":1955}," analysis",[1072,13112,3196],{"class":1089},[1072,13114,1107],{"class":1099},[1072,13116,12967],{"class":1103},[1072,13118,1107],{"class":1099},[1072,13120,8873],{"class":1089},[1072,13122,2411],{"class":2138},[1072,13124,2068],{"class":1089},[1072,13126,2072],{"class":2138},[1072,13128,1354],{"class":1089},[1072,13130,2894],{"class":1223},[1072,13132,2565],{"class":1089},[1072,13134,9343],{"class":1720},[1072,13136,9346],{"class":1223},[1072,13138,13139],{"class":1074,"line":10787},[1072,13140,13141],{"class":1955},"                    \n",[1072,13143,13144],{"class":1074,"line":10792},[1072,13145,13146],{"class":1078},"                    # Check key size\n",[1072,13148,13149,13152],{"class":1074,"line":10805},[1072,13150,13151],{"class":1951},"                    try",[1072,13153,2029],{"class":1089},[1072,13155,13156,13159,13161,13163,13165,13168,13170,13172],{"class":1074,"line":10843},[1072,13157,13158],{"class":1955},"                        size ",[1072,13160,2108],{"class":1089},[1072,13162,12410],{"class":1955},[1072,13164,1959],{"class":1089},[1072,13166,13167],{"class":2138},"memory_usage",[1072,13169,2068],{"class":1089},[1072,13171,3271],{"class":2138},[1072,13173,2419],{"class":1089},[1072,13175,13176,13179,13182,13185,13187,13189,13192,13194],{"class":1074,"line":10848},[1072,13177,13178],{"class":1951},"                        if",[1072,13180,13181],{"class":1955}," size ",[1072,13183,13184],{"class":1720},"and",[1072,13186,13181],{"class":1955},[1072,13188,6198],{"class":1720},[1072,13190,13191],{"class":1223}," 10000",[1072,13193,1110],{"class":1089},[1072,13195,13196],{"class":1078},"  # Keys larger than 10KB\n",[1072,13198,13199,13202,13204,13206,13208,13210,13212,13215],{"class":1074,"line":10871},[1072,13200,13201],{"class":1955},"                            analysis",[1072,13203,3196],{"class":1089},[1072,13205,1107],{"class":1099},[1072,13207,12981],{"class":1103},[1072,13209,1107],{"class":1099},[1072,13211,8873],{"class":1089},[1072,13213,13214],{"class":2138},"append",[1072,13216,13217],{"class":1089},"({\n",[1072,13219,13220,13223,13225,13227,13229,13231,13233,13235],{"class":1074,"line":10891},[1072,13221,13222],{"class":1099},"                                '",[1072,13224,3271],{"class":1103},[1072,13226,1107],{"class":1099},[1072,13228,1110],{"class":1089},[1072,13230,3221],{"class":2138},[1072,13232,1959],{"class":1089},[1072,13234,13038],{"class":2138},[1072,13236,2825],{"class":1089},[1072,13238,13239,13241,13244,13246,13248],{"class":1074,"line":10896},[1072,13240,13222],{"class":1099},[1072,13242,13243],{"class":1103},"size",[1072,13245,1107],{"class":1099},[1072,13247,1110],{"class":1089},[1072,13249,13250],{"class":2138}," size\n",[1072,13252,13253],{"class":1074,"line":10902},[1072,13254,13255],{"class":1089},"                            })\n",[1072,13257,13258,13261],{"class":1074,"line":10912},[1072,13259,13260],{"class":1951},"                    except",[1072,13262,2029],{"class":1089},[1072,13264,13265],{"class":1074,"line":10922},[1072,13266,13267],{"class":1951},"                        pass\n",[1072,13269,13270],{"class":1074,"line":10927},[1072,13271,2391],{"class":1955},[1072,13273,13274,13276],{"class":1074,"line":10934},[1072,13275,2509],{"class":1951},[1072,13277,13278],{"class":1955}," analysis\n",[1072,13280,13281,13283,13285,13287,13289],{"class":1074,"line":10944},[1072,13282,12724],{"class":1951},[1072,13284,10281],{"class":2055},[1072,13286,10284],{"class":1951},[1072,13288,10287],{"class":1955},[1072,13290,2029],{"class":1089},[1072,13292,13293,13295,13297,13299,13301,13303,13306,13308,13310,13312,13314],{"class":1074,"line":10954},[1072,13294,12018],{"class":1955},[1072,13296,1959],{"class":1089},[1072,13298,10298],{"class":2138},[1072,13300,2068],{"class":1089},[1072,13302,3979],{"class":2021},[1072,13304,13305],{"class":1103},"\"Error analyzing cache keys: ",[1072,13307,2118],{"class":2117},[1072,13309,10323],{"class":2138},[1072,13311,2123],{"class":2117},[1072,13313,2114],{"class":1103},[1072,13315,2419],{"class":1089},[1072,13317,13318],{"class":1074,"line":10964},[1072,13319,3280],{"class":1955},[1072,13321,13322,13324,13326,13328,13330,13332,13334,13336,13339,13341],{"class":1074,"line":10988},[1072,13323,2245],{"class":1951},[1072,13325,12768],{"class":1089},[1072,13327,1107],{"class":1099},[1072,13329,10298],{"class":1103},[1072,13331,1107],{"class":1099},[1072,13333,1110],{"class":1089},[1072,13335,1128],{"class":1099},[1072,13337,13338],{"class":1103},"Could not analyze cache keys",[1072,13340,1107],{"class":1099},[1072,13342,1369],{"class":1089},[1030,13344,13346],{"id":13345},"best-practices-and-common-pitfalls","Best Practices and Common Pitfalls",[1038,13348,13350],{"id":13349},"cache-key-design","Cache Key Design",[1043,13352,13354],{"className":1066,"code":13353,"language":1068,"meta":1052,"style":1052},"class CacheKeyBuilder:\n    \"\"\"Consistent cache key building patterns\"\"\"\n    \n    @staticmethod\n    def build_key(prefix, *args, version=None, **kwargs):\n        \"\"\"Build consistent cache keys\"\"\"\n        # Start with prefix\n        key_parts = [prefix]\n        \n        # Add positional arguments\n        key_parts.extend(str(arg) for arg in args)\n        \n        # Add keyword arguments (sorted for consistency)\n        if kwargs:\n            for k, v in sorted(kwargs.items()):\n                key_parts.append(f\"{k}:{v}\")\n        \n        # Join with colons\n        key = ':'.join(key_parts)\n        \n        # Add version if specified\n        if version:\n            key = f\"v{version}:{key}\"\n        \n        # Ensure key length is reasonable\n        if len(key) > 200:\n            import hashlib\n            key_hash = hashlib.md5(key.encode()).hexdigest()\n            key = f\"{prefix}:hash:{key_hash}\"\n        \n        return key\n    \n    @staticmethod\n    def user_specific_key(user, prefix, *args, **kwargs):\n        \"\"\"Build user-specific cache keys\"\"\"\n        return CacheKeyBuilder.build_key(\n            f\"user:{user.id}:{prefix}\",\n            *args,\n            **kwargs\n        )\n    \n    @staticmethod\n    def model_key(model_instance, prefix, *args, **kwargs):\n        \"\"\"Build model-specific cache keys\"\"\"\n        model_name = model_instance._meta.label_lower\n        return CacheKeyBuilder.build_key(\n            f\"{model_name}:{model_instance.pk}:{prefix}\",\n            *args,\n            **kwargs\n        )\n\n# Usage examples\ncache_key = CacheKeyBuilder.build_key(\n    'product_list',\n    category_id=5,\n    page=2,\n    sort='price',\n    version=2\n)\n# Result: \"v2:product_list:category_id:5:page:2:sort:price\"\n\nuser_cache_key = CacheKeyBuilder.user_specific_key(\n    request.user,\n    'dashboard_stats'\n)\n# Result: \"user:123:dashboard_stats\"\n",[1050,13355,13356,13365,13374,13378,13384,13418,13427,13432,13445,13449,13454,13485,13489,13494,13502,13530,13565,13569,13574,13598,13602,13607,13615,13643,13647,13652,13672,13679,13706,13734,13738,13745,13749,13755,13785,13794,13807,13836,13845,13852,13856,13860,13866,13896,13905,13922,13934,13971,13979,13985,13989,13993,13997,14012,14023,14034,14045,14060,14070,14074,14079,14083,14099,14110,14119,14123],{"__ignoreMap":1052},[1072,13357,13358,13360,13363],{"class":1074,"line":1075},[1072,13359,2022],{"class":2021},[1072,13361,13362],{"class":2025}," CacheKeyBuilder",[1072,13364,2029],{"class":1089},[1072,13366,13367,13369,13372],{"class":1074,"line":1082},[1072,13368,2035],{"class":2034},[1072,13370,13371],{"class":2038},"Consistent cache key building patterns",[1072,13373,2042],{"class":2034},[1072,13375,13376],{"class":1074,"line":1096},[1072,13377,2047],{"class":1955},[1072,13379,13380,13382],{"class":1074,"line":1115},[1072,13381,2052],{"class":1089},[1072,13383,2056],{"class":2055},[1072,13385,13386,13388,13391,13393,13395,13397,13399,13401,13403,13406,13408,13410,13412,13414,13416],{"class":1074,"line":1139},[1072,13387,2061],{"class":2021},[1072,13389,13390],{"class":2064}," build_key",[1072,13392,2068],{"class":1089},[1072,13394,2072],{"class":2071},[1072,13396,1354],{"class":1089},[1072,13398,1721],{"class":1720},[1072,13400,2079],{"class":2071},[1072,13402,1354],{"class":1089},[1072,13404,13405],{"class":2071}," version",[1072,13407,2108],{"class":1720},[1072,13409,5288],{"class":1241},[1072,13411,1354],{"class":1089},[1072,13413,2084],{"class":1720},[1072,13415,2087],{"class":2071},[1072,13417,2090],{"class":1089},[1072,13419,13420,13422,13425],{"class":1074,"line":1160},[1072,13421,2095],{"class":2034},[1072,13423,13424],{"class":2038},"Build consistent cache keys",[1072,13426,2042],{"class":2034},[1072,13428,13429],{"class":1074,"line":1174},[1072,13430,13431],{"class":1078},"        # Start with prefix\n",[1072,13433,13434,13437,13439,13441,13443],{"class":1074,"line":1196},[1072,13435,13436],{"class":1955},"        key_parts ",[1072,13438,2108],{"class":1089},[1072,13440,3976],{"class":1089},[1072,13442,2072],{"class":1955},[1072,13444,2700],{"class":1089},[1072,13446,13447],{"class":1074,"line":1210},[1072,13448,3280],{"class":1955},[1072,13450,13451],{"class":1074,"line":1229},[1072,13452,13453],{"class":1078},"        # Add positional arguments\n",[1072,13455,13456,13459,13461,13463,13465,13467,13469,13472,13474,13476,13479,13481,13483],{"class":1074,"line":1247},[1072,13457,13458],{"class":1955},"        key_parts",[1072,13460,1959],{"class":1089},[1072,13462,5418],{"class":2138},[1072,13464,2068],{"class":1089},[1072,13466,2150],{"class":2055},[1072,13468,2068],{"class":1089},[1072,13470,13471],{"class":2138},"arg",[1072,13473,2565],{"class":1089},[1072,13475,3994],{"class":1951},[1072,13477,13478],{"class":2138}," arg ",[1072,13480,3808],{"class":1951},[1072,13482,2155],{"class":2138},[1072,13484,2419],{"class":1089},[1072,13486,13487],{"class":1074,"line":1253},[1072,13488,3280],{"class":1955},[1072,13490,13491],{"class":1074,"line":1274},[1072,13492,13493],{"class":1078},"        # Add keyword arguments (sorted for consistency)\n",[1072,13495,13496,13498,13500],{"class":1074,"line":1295},[1072,13497,2168],{"class":1951},[1072,13499,2171],{"class":1955},[1072,13501,2029],{"class":1089},[1072,13503,13504,13506,13509,13511,13514,13516,13519,13521,13523,13525,13527],{"class":1074,"line":1301},[1072,13505,3802],{"class":1951},[1072,13507,13508],{"class":1955}," k",[1072,13510,1354],{"class":1089},[1072,13512,13513],{"class":1955}," v ",[1072,13515,3808],{"class":1951},[1072,13517,13518],{"class":2144}," sorted",[1072,13520,2068],{"class":1089},[1072,13522,2087],{"class":2138},[1072,13524,1959],{"class":1089},[1072,13526,4616],{"class":2138},[1072,13528,13529],{"class":1089},"()):\n",[1072,13531,13532,13535,13537,13539,13541,13543,13545,13547,13550,13552,13554,13556,13559,13561,13563],{"class":1074,"line":1322},[1072,13533,13534],{"class":1955},"                key_parts",[1072,13536,1959],{"class":1089},[1072,13538,13214],{"class":2138},[1072,13540,2068],{"class":1089},[1072,13542,3979],{"class":2021},[1072,13544,2114],{"class":1103},[1072,13546,2118],{"class":2117},[1072,13548,13549],{"class":2138},"k",[1072,13551,2123],{"class":2117},[1072,13553,1110],{"class":1103},[1072,13555,2118],{"class":2117},[1072,13557,13558],{"class":2138},"v",[1072,13560,2123],{"class":2117},[1072,13562,2114],{"class":1103},[1072,13564,2419],{"class":1089},[1072,13566,13567],{"class":1074,"line":1339},[1072,13568,3280],{"class":1955},[1072,13570,13571],{"class":1074,"line":1360},[1072,13572,13573],{"class":1078},"        # Join with colons\n",[1072,13575,13576,13579,13581,13583,13585,13587,13589,13591,13593,13596],{"class":1074,"line":1366},[1072,13577,13578],{"class":1955},"        key ",[1072,13580,2108],{"class":1089},[1072,13582,1128],{"class":1099},[1072,13584,1110],{"class":1103},[1072,13586,1107],{"class":1099},[1072,13588,1959],{"class":1089},[1072,13590,2139],{"class":2138},[1072,13592,2068],{"class":1089},[1072,13594,13595],{"class":2138},"key_parts",[1072,13597,2419],{"class":1089},[1072,13599,13600],{"class":1074,"line":1372},[1072,13601,3280],{"class":1955},[1072,13603,13604],{"class":1074,"line":1379},[1072,13605,13606],{"class":1078},"        # Add version if specified\n",[1072,13608,13609,13611,13613],{"class":1074,"line":1385},[1072,13610,2168],{"class":1951},[1072,13612,13405],{"class":1955},[1072,13614,2029],{"class":1089},[1072,13616,13617,13619,13621,13623,13626,13628,13631,13633,13635,13637,13639,13641],{"class":1074,"line":1394},[1072,13618,4146],{"class":1955},[1072,13620,2108],{"class":1089},[1072,13622,2111],{"class":2021},[1072,13624,13625],{"class":1103},"\"v",[1072,13627,2118],{"class":2117},[1072,13629,13630],{"class":1955},"version",[1072,13632,2123],{"class":2117},[1072,13634,1110],{"class":1103},[1072,13636,2118],{"class":2117},[1072,13638,3271],{"class":1955},[1072,13640,2123],{"class":2117},[1072,13642,2163],{"class":1103},[1072,13644,13645],{"class":1074,"line":1407},[1072,13646,3280],{"class":1955},[1072,13648,13649],{"class":1074,"line":1426},[1072,13650,13651],{"class":1078},"        # Ensure key length is reasonable\n",[1072,13653,13654,13656,13658,13660,13662,13664,13667,13670],{"class":1074,"line":1445},[1072,13655,2168],{"class":1951},[1072,13657,12954],{"class":2144},[1072,13659,2068],{"class":1089},[1072,13661,3271],{"class":2138},[1072,13663,2565],{"class":1089},[1072,13665,13666],{"class":1720}," >",[1072,13668,13669],{"class":1223}," 200",[1072,13671,2029],{"class":1089},[1072,13673,13674,13677],{"class":1074,"line":1458},[1072,13675,13676],{"class":1951},"            import",[1072,13678,2005],{"class":1955},[1072,13680,13681,13684,13686,13688,13690,13692,13694,13696,13698,13700,13702,13704],{"class":1074,"line":1477},[1072,13682,13683],{"class":1955},"            key_hash ",[1072,13685,2108],{"class":1089},[1072,13687,4587],{"class":1955},[1072,13689,1959],{"class":1089},[1072,13691,2196],{"class":2138},[1072,13693,2068],{"class":1089},[1072,13695,3271],{"class":2138},[1072,13697,1959],{"class":1089},[1072,13699,2227],{"class":2138},[1072,13701,2230],{"class":1089},[1072,13703,2233],{"class":2138},[1072,13705,3447],{"class":1089},[1072,13707,13708,13710,13712,13714,13716,13718,13720,13722,13725,13727,13730,13732],{"class":1074,"line":1482},[1072,13709,4146],{"class":1955},[1072,13711,2108],{"class":1089},[1072,13713,2111],{"class":2021},[1072,13715,2114],{"class":1103},[1072,13717,2118],{"class":2117},[1072,13719,2072],{"class":1955},[1072,13721,2123],{"class":2117},[1072,13723,13724],{"class":1103},":hash:",[1072,13726,2118],{"class":2117},[1072,13728,13729],{"class":1955},"key_hash",[1072,13731,2123],{"class":2117},[1072,13733,2163],{"class":1103},[1072,13735,13736],{"class":1074,"line":1497},[1072,13737,3280],{"class":1955},[1072,13739,13740,13742],{"class":1074,"line":1503},[1072,13741,2245],{"class":1951},[1072,13743,13744],{"class":1955}," key\n",[1072,13746,13747],{"class":1074,"line":1517},[1072,13748,2047],{"class":1955},[1072,13750,13751,13753],{"class":1074,"line":1536},[1072,13752,2052],{"class":1089},[1072,13754,2056],{"class":2055},[1072,13756,13757,13759,13762,13764,13766,13768,13771,13773,13775,13777,13779,13781,13783],{"class":1074,"line":1556},[1072,13758,2061],{"class":2021},[1072,13760,13761],{"class":2064}," user_specific_key",[1072,13763,2068],{"class":1089},[1072,13765,4506],{"class":2071},[1072,13767,1354],{"class":1089},[1072,13769,13770],{"class":2071}," prefix",[1072,13772,1354],{"class":1089},[1072,13774,1721],{"class":1720},[1072,13776,2079],{"class":2071},[1072,13778,1354],{"class":1089},[1072,13780,2084],{"class":1720},[1072,13782,2087],{"class":2071},[1072,13784,2090],{"class":1089},[1072,13786,13787,13789,13792],{"class":1074,"line":1569},[1072,13788,2095],{"class":2034},[1072,13790,13791],{"class":2038},"Build user-specific cache keys",[1072,13793,2042],{"class":2034},[1072,13795,13796,13798,13800,13802,13805],{"class":1074,"line":1588},[1072,13797,2245],{"class":1951},[1072,13799,13362],{"class":1955},[1072,13801,1959],{"class":1089},[1072,13803,13804],{"class":2138},"build_key",[1072,13806,2346],{"class":1089},[1072,13808,13809,13811,13814,13816,13818,13820,13822,13824,13826,13828,13830,13832,13834],{"class":1074,"line":1593},[1072,13810,5342],{"class":2021},[1072,13812,13813],{"class":1103},"\"user:",[1072,13815,2118],{"class":2117},[1072,13817,4506],{"class":2138},[1072,13819,1959],{"class":1089},[1072,13821,2777],{"class":2615},[1072,13823,2123],{"class":2117},[1072,13825,1110],{"class":1103},[1072,13827,2118],{"class":2117},[1072,13829,2072],{"class":2138},[1072,13831,2123],{"class":2117},[1072,13833,2114],{"class":1103},[1072,13835,1136],{"class":1089},[1072,13837,13838,13841,13843],{"class":1074,"line":1612},[1072,13839,13840],{"class":1720},"            *",[1072,13842,2079],{"class":2138},[1072,13844,1136],{"class":1089},[1072,13846,13847,13850],{"class":1074,"line":1617},[1072,13848,13849],{"class":1720},"            **",[1072,13851,2381],{"class":2138},[1072,13853,13854],{"class":1074,"line":1631},[1072,13855,9699],{"class":1089},[1072,13857,13858],{"class":1074,"line":1650},[1072,13859,2047],{"class":1955},[1072,13861,13862,13864],{"class":1074,"line":1670},[1072,13863,2052],{"class":1089},[1072,13865,2056],{"class":2055},[1072,13867,13868,13870,13873,13875,13878,13880,13882,13884,13886,13888,13890,13892,13894],{"class":1074,"line":1683},[1072,13869,2061],{"class":2021},[1072,13871,13872],{"class":2064}," model_key",[1072,13874,2068],{"class":1089},[1072,13876,13877],{"class":2071},"model_instance",[1072,13879,1354],{"class":1089},[1072,13881,13770],{"class":2071},[1072,13883,1354],{"class":1089},[1072,13885,1721],{"class":1720},[1072,13887,2079],{"class":2071},[1072,13889,1354],{"class":1089},[1072,13891,2084],{"class":1720},[1072,13893,2087],{"class":2071},[1072,13895,2090],{"class":1089},[1072,13897,13898,13900,13903],{"class":1074,"line":1702},[1072,13899,2095],{"class":2034},[1072,13901,13902],{"class":2038},"Build model-specific cache keys",[1072,13904,2042],{"class":2034},[1072,13906,13907,13909,13911,13914,13916,13918,13920],{"class":1074,"line":1707},[1072,13908,5304],{"class":1955},[1072,13910,2108],{"class":1089},[1072,13912,13913],{"class":1955}," model_instance",[1072,13915,1959],{"class":1089},[1072,13917,5314],{"class":2615},[1072,13919,1959],{"class":1089},[1072,13921,5319],{"class":2615},[1072,13923,13924,13926,13928,13930,13932],{"class":1074,"line":1732},[1072,13925,2245],{"class":1951},[1072,13927,13362],{"class":1955},[1072,13929,1959],{"class":1089},[1072,13931,13804],{"class":2138},[1072,13933,2346],{"class":1089},[1072,13935,13936,13938,13940,13942,13944,13946,13948,13950,13952,13954,13957,13959,13961,13963,13965,13967,13969],{"class":1074,"line":1737},[1072,13937,5342],{"class":2021},[1072,13939,2114],{"class":1103},[1072,13941,2118],{"class":2117},[1072,13943,5350],{"class":2138},[1072,13945,2123],{"class":2117},[1072,13947,1110],{"class":1103},[1072,13949,2118],{"class":2117},[1072,13951,13877],{"class":2138},[1072,13953,1959],{"class":1089},[1072,13955,13956],{"class":2615},"pk",[1072,13958,2123],{"class":2117},[1072,13960,1110],{"class":1103},[1072,13962,2118],{"class":2117},[1072,13964,2072],{"class":2138},[1072,13966,2123],{"class":2117},[1072,13968,2114],{"class":1103},[1072,13970,1136],{"class":1089},[1072,13972,13973,13975,13977],{"class":1074,"line":1742},[1072,13974,13840],{"class":1720},[1072,13976,2079],{"class":2138},[1072,13978,1136],{"class":1089},[1072,13980,13981,13983],{"class":1074,"line":1747},[1072,13982,13849],{"class":1720},[1072,13984,2381],{"class":2138},[1072,13986,13987],{"class":1074,"line":1753},[1072,13988,9699],{"class":1089},[1072,13990,13991],{"class":1074,"line":1769},[1072,13992,1376],{"emptyLinePlaceholder":1375},[1072,13994,13995],{"class":1074,"line":2731},[1072,13996,2540],{"class":1078},[1072,13998,13999,14002,14004,14006,14008,14010],{"class":1074,"line":2746},[1072,14000,14001],{"class":1955},"cache_key ",[1072,14003,2108],{"class":1089},[1072,14005,13362],{"class":1955},[1072,14007,1959],{"class":1089},[1072,14009,13804],{"class":2138},[1072,14011,2346],{"class":1089},[1072,14013,14014,14016,14019,14021],{"class":1074,"line":2756},[1072,14015,1100],{"class":1099},[1072,14017,14018],{"class":1103},"product_list",[1072,14020,1107],{"class":1099},[1072,14022,1136],{"class":1089},[1072,14024,14025,14028,14030,14032],{"class":1074,"line":2786},[1072,14026,14027],{"class":2215},"    category_id",[1072,14029,2108],{"class":1089},[1072,14031,4906],{"class":1223},[1072,14033,1136],{"class":1089},[1072,14035,14036,14039,14041,14043],{"class":1074,"line":2791},[1072,14037,14038],{"class":2215},"    page",[1072,14040,2108],{"class":1089},[1072,14042,8076],{"class":1223},[1072,14044,1136],{"class":1089},[1072,14046,14047,14050,14052,14054,14056,14058],{"class":1074,"line":2801},[1072,14048,14049],{"class":2215},"    sort",[1072,14051,2108],{"class":1089},[1072,14053,1107],{"class":1099},[1072,14055,4229],{"class":1103},[1072,14057,1107],{"class":1099},[1072,14059,1136],{"class":1089},[1072,14061,14062,14065,14067],{"class":1074,"line":2828},[1072,14063,14064],{"class":2215},"    version",[1072,14066,2108],{"class":1089},[1072,14068,14069],{"class":1223},"2\n",[1072,14071,14072],{"class":1074,"line":2853},[1072,14073,2419],{"class":1089},[1072,14075,14076],{"class":1074,"line":2875},[1072,14077,14078],{"class":1078},"# Result: \"v2:product_list:category_id:5:page:2:sort:price\"\n",[1072,14080,14081],{"class":1074,"line":2899},[1072,14082,1376],{"emptyLinePlaceholder":1375},[1072,14084,14085,14088,14090,14092,14094,14097],{"class":1074,"line":2924},[1072,14086,14087],{"class":1955},"user_cache_key ",[1072,14089,2108],{"class":1089},[1072,14091,13362],{"class":1955},[1072,14093,1959],{"class":1089},[1072,14095,14096],{"class":2138},"user_specific_key",[1072,14098,2346],{"class":1089},[1072,14100,14101,14104,14106,14108],{"class":1074,"line":2934},[1072,14102,14103],{"class":2138},"    request",[1072,14105,1959],{"class":1089},[1072,14107,4506],{"class":2615},[1072,14109,1136],{"class":1089},[1072,14111,14112,14114,14117],{"class":1074,"line":2944},[1072,14113,1100],{"class":1099},[1072,14115,14116],{"class":1103},"dashboard_stats",[1072,14118,1766],{"class":1099},[1072,14120,14121],{"class":1074,"line":2964},[1072,14122,2419],{"class":1089},[1072,14124,14125],{"class":1074,"line":2987},[1072,14126,14127],{"class":1078},"# Result: \"user:123:dashboard_stats\"\n",[1038,14129,14131],{"id":14130},"cache-invalidation-strategies","Cache Invalidation Strategies",[1043,14133,14135],{"className":1066,"code":14134,"language":1068,"meta":1052,"style":1052},"class CacheInvalidationManager:\n    \"\"\"Manage complex cache invalidation scenarios\"\"\"\n    \n    def __init__(self):\n        self.invalidation_rules = {}\n    \n    def register_invalidation_rule(self, model, callback):\n        \"\"\"Register invalidation callback for model changes\"\"\"\n        if model not in self.invalidation_rules:\n            self.invalidation_rules[model] = []\n        self.invalidation_rules[model].append(callback)\n    \n    def invalidate_for_model(self, model_class, instance):\n        \"\"\"Execute all invalidation rules for a model\"\"\"\n        if model_class in self.invalidation_rules:\n            for callback in self.invalidation_rules[model_class]:\n                try:\n                    callback(instance)\n                except Exception as e:\n                    logger.error(f\"Cache invalidation error: {e}\")\n\n# Global invalidation manager\ncache_invalidator = CacheInvalidationManager()\n\n# Register invalidation rules\ndef invalidate_product_caches(product):\n    \"\"\"Invalidate all product-related caches\"\"\"\n    patterns = [\n        f\"product:{product.id}:*\",\n        f\"category:{product.category.id}:*\",\n        \"popular_products:*\",\n        \"homepage:*\",\n    ]\n    \n    for pattern in patterns:\n        cache.delete_pattern(pattern)\n\ndef invalidate_user_caches(user):\n    \"\"\"Invalidate all user-related caches\"\"\"\n    patterns = [\n        f\"user:{user.id}:*\",\n        f\"user_stats:{user.id}:*\",\n    ]\n    \n    for pattern in patterns:\n        cache.delete_pattern(pattern)\n\n# Register the rules\ncache_invalidator.register_invalidation_rule(Product, invalidate_product_caches)\ncache_invalidator.register_invalidation_rule(User, invalidate_user_caches)\n\n# Signal handlers\n@receiver([post_save, post_delete])\ndef handle_model_cache_invalidation(sender, instance, **kwargs):\n    \"\"\"Handle cache invalidation for any model\"\"\"\n    cache_invalidator.invalidate_for_model(sender, instance)\n",[1050,14136,14137,14146,14155,14159,14171,14184,14188,14211,14220,14240,14259,14282,14286,14307,14316,14333,14354,14361,14372,14385,14411,14415,14420,14431,14435,14440,14453,14462,14471,14493,14518,14530,14541,14546,14550,14562,14576,14580,14593,14602,14610,14630,14651,14655,14659,14671,14685,14689,14694,14714,14733,14737,14742,14758,14781,14790],{"__ignoreMap":1052},[1072,14138,14139,14141,14144],{"class":1074,"line":1075},[1072,14140,2022],{"class":2021},[1072,14142,14143],{"class":2025}," CacheInvalidationManager",[1072,14145,2029],{"class":1089},[1072,14147,14148,14150,14153],{"class":1074,"line":1082},[1072,14149,2035],{"class":2034},[1072,14151,14152],{"class":2038},"Manage complex cache invalidation scenarios",[1072,14154,2042],{"class":2034},[1072,14156,14157],{"class":1074,"line":1096},[1072,14158,2047],{"class":1955},[1072,14160,14161,14163,14165,14167,14169],{"class":1074,"line":1115},[1072,14162,2061],{"class":2021},[1072,14164,3158],{"class":2144},[1072,14166,2068],{"class":1089},[1072,14168,3164],{"class":3163},[1072,14170,2090],{"class":1089},[1072,14172,14173,14175,14177,14180,14182],{"class":1074,"line":1139},[1072,14174,3184],{"class":1085},[1072,14176,1959],{"class":1089},[1072,14178,14179],{"class":2615},"invalidation_rules",[1072,14181,1090],{"class":1089},[1072,14183,3797],{"class":1089},[1072,14185,14186],{"class":1074,"line":1160},[1072,14187,2047],{"class":1955},[1072,14189,14190,14192,14195,14197,14199,14201,14204,14206,14209],{"class":1074,"line":1174},[1072,14191,2061],{"class":2021},[1072,14193,14194],{"class":2064}," register_invalidation_rule",[1072,14196,2068],{"class":1089},[1072,14198,3164],{"class":3163},[1072,14200,1354],{"class":1089},[1072,14202,14203],{"class":2071}," model",[1072,14205,1354],{"class":1089},[1072,14207,14208],{"class":2071}," callback",[1072,14210,2090],{"class":1089},[1072,14212,14213,14215,14218],{"class":1074,"line":1196},[1072,14214,2095],{"class":2034},[1072,14216,14217],{"class":2038},"Register invalidation callback for model changes",[1072,14219,2042],{"class":2034},[1072,14221,14222,14224,14227,14230,14232,14234,14236,14238],{"class":1074,"line":1210},[1072,14223,2168],{"class":1951},[1072,14225,14226],{"class":1955}," model ",[1072,14228,14229],{"class":1720},"not",[1072,14231,13068],{"class":1720},[1072,14233,3295],{"class":1085},[1072,14235,1959],{"class":1089},[1072,14237,14179],{"class":2615},[1072,14239,2029],{"class":1089},[1072,14241,14242,14244,14246,14248,14250,14252,14254,14256],{"class":1074,"line":1229},[1072,14243,3635],{"class":1085},[1072,14245,1959],{"class":1089},[1072,14247,14179],{"class":2615},[1072,14249,3196],{"class":1089},[1072,14251,7498],{"class":2615},[1072,14253,2888],{"class":1089},[1072,14255,1090],{"class":1089},[1072,14257,14258],{"class":1089}," []\n",[1072,14260,14261,14263,14265,14267,14269,14271,14273,14275,14277,14280],{"class":1074,"line":1247},[1072,14262,3184],{"class":1085},[1072,14264,1959],{"class":1089},[1072,14266,14179],{"class":2615},[1072,14268,3196],{"class":1089},[1072,14270,7498],{"class":2615},[1072,14272,8873],{"class":1089},[1072,14274,13214],{"class":2138},[1072,14276,2068],{"class":1089},[1072,14278,14279],{"class":2138},"callback",[1072,14281,2419],{"class":1089},[1072,14283,14284],{"class":1074,"line":1253},[1072,14285,2047],{"class":1955},[1072,14287,14288,14290,14293,14295,14297,14299,14301,14303,14305],{"class":1074,"line":1274},[1072,14289,2061],{"class":2021},[1072,14291,14292],{"class":2064}," invalidate_for_model",[1072,14294,2068],{"class":1089},[1072,14296,3164],{"class":3163},[1072,14298,1354],{"class":1089},[1072,14300,5309],{"class":2071},[1072,14302,1354],{"class":1089},[1072,14304,5553],{"class":2071},[1072,14306,2090],{"class":1089},[1072,14308,14309,14311,14314],{"class":1074,"line":1295},[1072,14310,2095],{"class":2034},[1072,14312,14313],{"class":2038},"Execute all invalidation rules for a model",[1072,14315,2042],{"class":2034},[1072,14317,14318,14320,14323,14325,14327,14329,14331],{"class":1074,"line":1301},[1072,14319,2168],{"class":1951},[1072,14321,14322],{"class":1955}," model_class ",[1072,14324,3808],{"class":1720},[1072,14326,3295],{"class":1085},[1072,14328,1959],{"class":1089},[1072,14330,14179],{"class":2615},[1072,14332,2029],{"class":1089},[1072,14334,14335,14337,14340,14342,14344,14346,14348,14350,14352],{"class":1074,"line":1322},[1072,14336,3802],{"class":1951},[1072,14338,14339],{"class":1955}," callback ",[1072,14341,3808],{"class":1951},[1072,14343,3295],{"class":1085},[1072,14345,1959],{"class":1089},[1072,14347,14179],{"class":2615},[1072,14349,3196],{"class":1089},[1072,14351,5278],{"class":2615},[1072,14353,9294],{"class":1089},[1072,14355,14356,14359],{"class":1074,"line":1339},[1072,14357,14358],{"class":1951},"                try",[1072,14360,2029],{"class":1089},[1072,14362,14363,14366,14368,14370],{"class":1074,"line":1360},[1072,14364,14365],{"class":2138},"                    callback",[1072,14367,2068],{"class":1089},[1072,14369,5533],{"class":2138},[1072,14371,2419],{"class":1089},[1072,14373,14374,14377,14379,14381,14383],{"class":1074,"line":1366},[1072,14375,14376],{"class":1951},"                except",[1072,14378,10281],{"class":2055},[1072,14380,10284],{"class":1951},[1072,14382,10287],{"class":1955},[1072,14384,2029],{"class":1089},[1072,14386,14387,14390,14392,14394,14396,14398,14401,14403,14405,14407,14409],{"class":1074,"line":1372},[1072,14388,14389],{"class":1955},"                    logger",[1072,14391,1959],{"class":1089},[1072,14393,10298],{"class":2138},[1072,14395,2068],{"class":1089},[1072,14397,3979],{"class":2021},[1072,14399,14400],{"class":1103},"\"Cache invalidation error: ",[1072,14402,2118],{"class":2117},[1072,14404,10323],{"class":2138},[1072,14406,2123],{"class":2117},[1072,14408,2114],{"class":1103},[1072,14410,2419],{"class":1089},[1072,14412,14413],{"class":1074,"line":1379},[1072,14414,1376],{"emptyLinePlaceholder":1375},[1072,14416,14417],{"class":1074,"line":1385},[1072,14418,14419],{"class":1078},"# Global invalidation manager\n",[1072,14421,14422,14425,14427,14429],{"class":1074,"line":1394},[1072,14423,14424],{"class":1955},"cache_invalidator ",[1072,14426,2108],{"class":1089},[1072,14428,14143],{"class":2138},[1072,14430,3447],{"class":1089},[1072,14432,14433],{"class":1074,"line":1407},[1072,14434,1376],{"emptyLinePlaceholder":1375},[1072,14436,14437],{"class":1074,"line":1426},[1072,14438,14439],{"class":1078},"# Register invalidation rules\n",[1072,14441,14442,14444,14447,14449,14451],{"class":1074,"line":1445},[1072,14443,2573],{"class":2021},[1072,14445,14446],{"class":2064}," invalidate_product_caches",[1072,14448,2068],{"class":1089},[1072,14450,4157],{"class":2071},[1072,14452,2090],{"class":1089},[1072,14454,14455,14457,14460],{"class":1074,"line":1458},[1072,14456,2035],{"class":2034},[1072,14458,14459],{"class":2038},"Invalidate all product-related caches",[1072,14461,2042],{"class":2034},[1072,14463,14464,14467,14469],{"class":1074,"line":1477},[1072,14465,14466],{"class":1955},"    patterns ",[1072,14468,2108],{"class":1089},[1072,14470,1846],{"class":1089},[1072,14472,14473,14476,14478,14480,14482,14484,14486,14488,14491],{"class":1074,"line":1482},[1072,14474,14475],{"class":2021},"        f",[1072,14477,3982],{"class":1103},[1072,14479,2118],{"class":2117},[1072,14481,4157],{"class":1955},[1072,14483,1959],{"class":1089},[1072,14485,2777],{"class":2615},[1072,14487,2123],{"class":2117},[1072,14489,14490],{"class":1103},":*\"",[1072,14492,1136],{"class":1089},[1072,14494,14495,14497,14500,14502,14504,14506,14508,14510,14512,14514,14516],{"class":1074,"line":1497},[1072,14496,14475],{"class":2021},[1072,14498,14499],{"class":1103},"\"category:",[1072,14501,2118],{"class":2117},[1072,14503,4157],{"class":1955},[1072,14505,1959],{"class":1089},[1072,14507,4106],{"class":2615},[1072,14509,1959],{"class":1089},[1072,14511,2777],{"class":2615},[1072,14513,2123],{"class":2117},[1072,14515,14490],{"class":1103},[1072,14517,1136],{"class":1089},[1072,14519,14520,14523,14526,14528],{"class":1074,"line":1503},[1072,14521,14522],{"class":1099},"        \"",[1072,14524,14525],{"class":1103},"popular_products:*",[1072,14527,2114],{"class":1099},[1072,14529,1136],{"class":1089},[1072,14531,14532,14534,14537,14539],{"class":1074,"line":1517},[1072,14533,14522],{"class":1099},[1072,14535,14536],{"class":1103},"homepage:*",[1072,14538,2114],{"class":1099},[1072,14540,1136],{"class":1089},[1072,14542,14543],{"class":1074,"line":1536},[1072,14544,14545],{"class":1089},"    ]\n",[1072,14547,14548],{"class":1074,"line":1556},[1072,14549,2047],{"class":1955},[1072,14551,14552,14554,14556,14558,14560],{"class":1074,"line":1569},[1072,14553,6053],{"class":1951},[1072,14555,5489],{"class":1955},[1072,14557,3808],{"class":1951},[1072,14559,5494],{"class":1955},[1072,14561,2029],{"class":1089},[1072,14563,14564,14566,14568,14570,14572,14574],{"class":1074,"line":1588},[1072,14565,5843],{"class":1955},[1072,14567,1959],{"class":1089},[1072,14569,3626],{"class":2138},[1072,14571,2068],{"class":1089},[1072,14573,3648],{"class":2138},[1072,14575,2419],{"class":1089},[1072,14577,14578],{"class":1074,"line":1593},[1072,14579,1376],{"emptyLinePlaceholder":1375},[1072,14581,14582,14584,14587,14589,14591],{"class":1074,"line":1612},[1072,14583,2573],{"class":2021},[1072,14585,14586],{"class":2064}," invalidate_user_caches",[1072,14588,2068],{"class":1089},[1072,14590,4506],{"class":2071},[1072,14592,2090],{"class":1089},[1072,14594,14595,14597,14600],{"class":1074,"line":1617},[1072,14596,2035],{"class":2034},[1072,14598,14599],{"class":2038},"Invalidate all user-related caches",[1072,14601,2042],{"class":2034},[1072,14603,14604,14606,14608],{"class":1074,"line":1631},[1072,14605,14466],{"class":1955},[1072,14607,2108],{"class":1089},[1072,14609,1846],{"class":1089},[1072,14611,14612,14614,14616,14618,14620,14622,14624,14626,14628],{"class":1074,"line":1650},[1072,14613,14475],{"class":2021},[1072,14615,13813],{"class":1103},[1072,14617,2118],{"class":2117},[1072,14619,4506],{"class":1955},[1072,14621,1959],{"class":1089},[1072,14623,2777],{"class":2615},[1072,14625,2123],{"class":2117},[1072,14627,14490],{"class":1103},[1072,14629,1136],{"class":1089},[1072,14631,14632,14634,14637,14639,14641,14643,14645,14647,14649],{"class":1074,"line":1670},[1072,14633,14475],{"class":2021},[1072,14635,14636],{"class":1103},"\"user_stats:",[1072,14638,2118],{"class":2117},[1072,14640,4506],{"class":1955},[1072,14642,1959],{"class":1089},[1072,14644,2777],{"class":2615},[1072,14646,2123],{"class":2117},[1072,14648,14490],{"class":1103},[1072,14650,1136],{"class":1089},[1072,14652,14653],{"class":1074,"line":1683},[1072,14654,14545],{"class":1089},[1072,14656,14657],{"class":1074,"line":1702},[1072,14658,2047],{"class":1955},[1072,14660,14661,14663,14665,14667,14669],{"class":1074,"line":1707},[1072,14662,6053],{"class":1951},[1072,14664,5489],{"class":1955},[1072,14666,3808],{"class":1951},[1072,14668,5494],{"class":1955},[1072,14670,2029],{"class":1089},[1072,14672,14673,14675,14677,14679,14681,14683],{"class":1074,"line":1732},[1072,14674,5843],{"class":1955},[1072,14676,1959],{"class":1089},[1072,14678,3626],{"class":2138},[1072,14680,2068],{"class":1089},[1072,14682,3648],{"class":2138},[1072,14684,2419],{"class":1089},[1072,14686,14687],{"class":1074,"line":1737},[1072,14688,1376],{"emptyLinePlaceholder":1375},[1072,14690,14691],{"class":1074,"line":1742},[1072,14692,14693],{"class":1078},"# Register the rules\n",[1072,14695,14696,14699,14701,14704,14706,14708,14710,14712],{"class":1074,"line":1747},[1072,14697,14698],{"class":1955},"cache_invalidator",[1072,14700,1959],{"class":1089},[1072,14702,14703],{"class":2138},"register_invalidation_rule",[1072,14705,2068],{"class":1089},[1072,14707,5757],{"class":2138},[1072,14709,1354],{"class":1089},[1072,14711,14446],{"class":2138},[1072,14713,2419],{"class":1089},[1072,14715,14716,14718,14720,14722,14724,14727,14729,14731],{"class":1074,"line":1753},[1072,14717,14698],{"class":1955},[1072,14719,1959],{"class":1089},[1072,14721,14703],{"class":2138},[1072,14723,2068],{"class":1089},[1072,14725,14726],{"class":2138},"User",[1072,14728,1354],{"class":1089},[1072,14730,14586],{"class":2138},[1072,14732,2419],{"class":1089},[1072,14734,14735],{"class":1074,"line":1769},[1072,14736,1376],{"emptyLinePlaceholder":1375},[1072,14738,14739],{"class":1074,"line":2731},[1072,14740,14741],{"class":1078},"# Signal handlers\n",[1072,14743,14744,14746,14748,14750,14752,14754,14756],{"class":1074,"line":2746},[1072,14745,2545],{"class":1089},[1072,14747,5735],{"class":2064},[1072,14749,5738],{"class":1089},[1072,14751,5741],{"class":2138},[1072,14753,1354],{"class":1089},[1072,14755,5746],{"class":2138},[1072,14757,9885],{"class":1089},[1072,14759,14760,14762,14765,14767,14769,14771,14773,14775,14777,14779],{"class":1074,"line":2756},[1072,14761,2573],{"class":2021},[1072,14763,14764],{"class":2064}," handle_model_cache_invalidation",[1072,14766,2068],{"class":1089},[1072,14768,5771],{"class":2071},[1072,14770,1354],{"class":1089},[1072,14772,5553],{"class":2071},[1072,14774,1354],{"class":1089},[1072,14776,2084],{"class":1720},[1072,14778,2087],{"class":2071},[1072,14780,2090],{"class":1089},[1072,14782,14783,14785,14788],{"class":1074,"line":2786},[1072,14784,2035],{"class":2034},[1072,14786,14787],{"class":2038},"Handle cache invalidation for any model",[1072,14789,2042],{"class":2034},[1072,14791,14792,14795,14797,14800,14802,14804,14806,14808],{"class":1074,"line":2791},[1072,14793,14794],{"class":1955},"    cache_invalidator",[1072,14796,1959],{"class":1089},[1072,14798,14799],{"class":2138},"invalidate_for_model",[1072,14801,2068],{"class":1089},[1072,14803,5771],{"class":2138},[1072,14805,1354],{"class":1089},[1072,14807,5553],{"class":2138},[1072,14809,2419],{"class":1089},[1038,14811,14813],{"id":14812},"common-caching-pitfalls","Common Caching Pitfalls",[1043,14815,14817],{"className":1066,"code":14816,"language":1068,"meta":1052,"style":1052},"# ❌ DON'T: Cache user-specific data globally\ndef bad_user_dashboard(request):\n    cached_data = cache.get('dashboard_data')  # Same for all users!\n    if not cached_data:\n        cached_data = get_user_dashboard_data(request.user)\n        cache.set('dashboard_data', cached_data, 300)\n    return render(request, 'dashboard.html', {'data': cached_data})\n\n# ✅ DO: Include user ID in cache key\ndef good_user_dashboard(request):\n    cache_key = f'dashboard_data_user_{request.user.id}'\n    cached_data = cache.get(cache_key)\n    if not cached_data:\n        cached_data = get_user_dashboard_data(request.user)\n        cache.set(cache_key, cached_data, 300)\n    return render(request, 'dashboard.html', {'data': cached_data})\n\n# ❌ DON'T: Cache without considering data freshness\ndef bad_product_list(request):\n    products = cache.get('all_products')  # Never invalidated!\n    if not products:\n        products = list(Product.objects.all())\n        cache.set('all_products', products, 86400)  # 24 hours\n    return render(request, 'products.html', {'products': products})\n\n# ✅ DO: Include timestamp or version in cache key\ndef good_product_list(request):\n    # Include last update time in cache key\n    last_update = Product.objects.aggregate(\n        last_modified=Max('updated_at')\n    )['last_modified']\n    \n    cache_key = f'products_list_{last_update.timestamp()}'\n    products = cache.get(cache_key)\n    \n    if not products:\n        products = list(Product.objects.select_related('category').all())\n        cache.set(cache_key, products, 3600)\n    \n    return render(request, 'products.html', {'products': products})\n\n# ❌ DON'T: Cache large objects without compression\ndef bad_large_data_cache():\n    large_data = generate_large_dataset()  # 10MB of data\n    cache.set('large_data', large_data, 3600)  # Uses lots of memory\n\n# ✅ DO: Compress large cached objects\nimport pickle\nimport gzip\n\ndef good_large_data_cache():\n    cache_key = 'large_data_compressed'\n    cached_data = cache.get(cache_key)\n    \n    if cached_data is None:\n        large_data = generate_large_dataset()\n        \n        # Compress before caching\n        compressed_data = gzip.compress(pickle.dumps(large_data))\n        cache.set(cache_key, compressed_data, 3600)\n        return large_data\n    else:\n        # Decompress when retrieving\n        return pickle.loads(gzip.decompress(cached_data))\n",[1050,14818,14819,14824,14837,14864,14875,14895,14921,14957,14961,14966,14979,15007,15025,15035,15053,15075,15109,15113,15118,15131,15158,15168,15190,15219,15254,15258,15263,15276,15281,15300,15320,15334,15338,15365,15383,15387,15397,15431,15453,15457,15491,15495,15500,15509,15524,15555,15559,15564,15571,15578,15582,15591,15604,15622,15626,15639,15650,15654,15659,15689,15712,15719,15726,15731],{"__ignoreMap":1052},[1072,14820,14821],{"class":1074,"line":1075},[1072,14822,14823],{"class":1078},"# ❌ DON'T: Cache user-specific data globally\n",[1072,14825,14826,14828,14831,14833,14835],{"class":1074,"line":1082},[1072,14827,2573],{"class":2021},[1072,14829,14830],{"class":2064}," bad_user_dashboard",[1072,14832,2068],{"class":1089},[1072,14834,4480],{"class":2071},[1072,14836,2090],{"class":1089},[1072,14838,14839,14842,14844,14846,14848,14850,14852,14854,14857,14859,14861],{"class":1074,"line":1096},[1072,14840,14841],{"class":1955},"    cached_data ",[1072,14843,2108],{"class":1089},[1072,14845,2406],{"class":1955},[1072,14847,1959],{"class":1089},[1072,14849,2411],{"class":2138},[1072,14851,2068],{"class":1089},[1072,14853,1107],{"class":1099},[1072,14855,14856],{"class":1103},"dashboard_data",[1072,14858,1107],{"class":1099},[1072,14860,2565],{"class":1089},[1072,14862,14863],{"class":1078},"  # Same for all users!\n",[1072,14865,14866,14868,14870,14873],{"class":1074,"line":1115},[1072,14867,5830],{"class":1951},[1072,14869,2433],{"class":1720},[1072,14871,14872],{"class":1955}," cached_data",[1072,14874,2029],{"class":1089},[1072,14876,14877,14880,14882,14885,14887,14889,14891,14893],{"class":1074,"line":1139},[1072,14878,14879],{"class":1955},"        cached_data ",[1072,14881,2108],{"class":1089},[1072,14883,14884],{"class":2138}," get_user_dashboard_data",[1072,14886,2068],{"class":1089},[1072,14888,4480],{"class":2138},[1072,14890,1959],{"class":1089},[1072,14892,4506],{"class":2615},[1072,14894,2419],{"class":1089},[1072,14896,14897,14899,14901,14903,14905,14907,14909,14911,14913,14915,14917,14919],{"class":1074,"line":1160},[1072,14898,5843],{"class":1955},[1072,14900,1959],{"class":1089},[1072,14902,2488],{"class":2138},[1072,14904,2068],{"class":1089},[1072,14906,1107],{"class":1099},[1072,14908,14856],{"class":1103},[1072,14910,1107],{"class":1099},[1072,14912,1354],{"class":1089},[1072,14914,14872],{"class":2138},[1072,14916,1354],{"class":1089},[1072,14918,1351],{"class":1223},[1072,14920,2419],{"class":1089},[1072,14922,14923,14925,14927,14929,14931,14933,14935,14937,14939,14941,14943,14945,14948,14950,14952,14954],{"class":1074,"line":1174},[1072,14924,2607],{"class":1951},[1072,14926,4964],{"class":2138},[1072,14928,2068],{"class":1089},[1072,14930,4480],{"class":2138},[1072,14932,1354],{"class":1089},[1072,14934,1128],{"class":1099},[1072,14936,4975],{"class":1103},[1072,14938,1107],{"class":1099},[1072,14940,1354],{"class":1089},[1072,14942,12768],{"class":1089},[1072,14944,1107],{"class":1099},[1072,14946,14947],{"class":1103},"data",[1072,14949,1107],{"class":1099},[1072,14951,1110],{"class":1089},[1072,14953,14872],{"class":2138},[1072,14955,14956],{"class":1089},"})\n",[1072,14958,14959],{"class":1074,"line":1196},[1072,14960,1376],{"emptyLinePlaceholder":1375},[1072,14962,14963],{"class":1074,"line":1210},[1072,14964,14965],{"class":1078},"# ✅ DO: Include user ID in cache key\n",[1072,14967,14968,14970,14973,14975,14977],{"class":1074,"line":1229},[1072,14969,2573],{"class":2021},[1072,14971,14972],{"class":2064}," good_user_dashboard",[1072,14974,2068],{"class":1089},[1072,14976,4480],{"class":2071},[1072,14978,2090],{"class":1089},[1072,14980,14981,14984,14986,14988,14991,14993,14995,14997,14999,15001,15003,15005],{"class":1074,"line":1247},[1072,14982,14983],{"class":1955},"    cache_key ",[1072,14985,2108],{"class":1089},[1072,14987,2111],{"class":2021},[1072,14989,14990],{"class":1103},"'dashboard_data_user_",[1072,14992,2118],{"class":2117},[1072,14994,4480],{"class":1955},[1072,14996,1959],{"class":1089},[1072,14998,4506],{"class":2615},[1072,15000,1959],{"class":1089},[1072,15002,2777],{"class":2615},[1072,15004,2123],{"class":2117},[1072,15006,1766],{"class":1103},[1072,15008,15009,15011,15013,15015,15017,15019,15021,15023],{"class":1074,"line":1253},[1072,15010,14841],{"class":1955},[1072,15012,2108],{"class":1089},[1072,15014,2406],{"class":1955},[1072,15016,1959],{"class":1089},[1072,15018,2411],{"class":2138},[1072,15020,2068],{"class":1089},[1072,15022,2416],{"class":2138},[1072,15024,2419],{"class":1089},[1072,15026,15027,15029,15031,15033],{"class":1074,"line":1274},[1072,15028,5830],{"class":1951},[1072,15030,2433],{"class":1720},[1072,15032,14872],{"class":1955},[1072,15034,2029],{"class":1089},[1072,15036,15037,15039,15041,15043,15045,15047,15049,15051],{"class":1074,"line":1295},[1072,15038,14879],{"class":1955},[1072,15040,2108],{"class":1089},[1072,15042,14884],{"class":2138},[1072,15044,2068],{"class":1089},[1072,15046,4480],{"class":2138},[1072,15048,1959],{"class":1089},[1072,15050,4506],{"class":2615},[1072,15052,2419],{"class":1089},[1072,15054,15055,15057,15059,15061,15063,15065,15067,15069,15071,15073],{"class":1074,"line":1301},[1072,15056,5843],{"class":1955},[1072,15058,1959],{"class":1089},[1072,15060,2488],{"class":2138},[1072,15062,2068],{"class":1089},[1072,15064,2416],{"class":2138},[1072,15066,1354],{"class":1089},[1072,15068,14872],{"class":2138},[1072,15070,1354],{"class":1089},[1072,15072,1351],{"class":1223},[1072,15074,2419],{"class":1089},[1072,15076,15077,15079,15081,15083,15085,15087,15089,15091,15093,15095,15097,15099,15101,15103,15105,15107],{"class":1074,"line":1322},[1072,15078,2607],{"class":1951},[1072,15080,4964],{"class":2138},[1072,15082,2068],{"class":1089},[1072,15084,4480],{"class":2138},[1072,15086,1354],{"class":1089},[1072,15088,1128],{"class":1099},[1072,15090,4975],{"class":1103},[1072,15092,1107],{"class":1099},[1072,15094,1354],{"class":1089},[1072,15096,12768],{"class":1089},[1072,15098,1107],{"class":1099},[1072,15100,14947],{"class":1103},[1072,15102,1107],{"class":1099},[1072,15104,1110],{"class":1089},[1072,15106,14872],{"class":2138},[1072,15108,14956],{"class":1089},[1072,15110,15111],{"class":1074,"line":1339},[1072,15112,1376],{"emptyLinePlaceholder":1375},[1072,15114,15115],{"class":1074,"line":1360},[1072,15116,15117],{"class":1078},"# ❌ DON'T: Cache without considering data freshness\n",[1072,15119,15120,15122,15125,15127,15129],{"class":1074,"line":1366},[1072,15121,2573],{"class":2021},[1072,15123,15124],{"class":2064}," bad_product_list",[1072,15126,2068],{"class":1089},[1072,15128,4480],{"class":2071},[1072,15130,2090],{"class":1089},[1072,15132,15133,15136,15138,15140,15142,15144,15146,15148,15151,15153,15155],{"class":1074,"line":1372},[1072,15134,15135],{"class":1955},"    products ",[1072,15137,2108],{"class":1089},[1072,15139,2406],{"class":1955},[1072,15141,1959],{"class":1089},[1072,15143,2411],{"class":2138},[1072,15145,2068],{"class":1089},[1072,15147,1107],{"class":1099},[1072,15149,15150],{"class":1103},"all_products",[1072,15152,1107],{"class":1099},[1072,15154,2565],{"class":1089},[1072,15156,15157],{"class":1078},"  # Never invalidated!\n",[1072,15159,15160,15162,15164,15166],{"class":1074,"line":1379},[1072,15161,5830],{"class":1951},[1072,15163,2433],{"class":1720},[1072,15165,4138],{"class":1955},[1072,15167,2029],{"class":1089},[1072,15169,15170,15172,15174,15176,15178,15180,15182,15184,15186,15188],{"class":1074,"line":1385},[1072,15171,4072],{"class":1955},[1072,15173,2108],{"class":1089},[1072,15175,7739],{"class":2055},[1072,15177,2068],{"class":1089},[1072,15179,5757],{"class":2138},[1072,15181,1959],{"class":1089},[1072,15183,2616],{"class":2615},[1072,15185,1959],{"class":1089},[1072,15187,6069],{"class":2138},[1072,15189,3744],{"class":1089},[1072,15191,15192,15194,15196,15198,15200,15202,15204,15206,15208,15210,15212,15214,15216],{"class":1074,"line":1394},[1072,15193,5843],{"class":1955},[1072,15195,1959],{"class":1089},[1072,15197,2488],{"class":2138},[1072,15199,2068],{"class":1089},[1072,15201,1107],{"class":1099},[1072,15203,15150],{"class":1103},[1072,15205,1107],{"class":1099},[1072,15207,1354],{"class":1089},[1072,15209,4138],{"class":2138},[1072,15211,1354],{"class":1089},[1072,15213,1604],{"class":1223},[1072,15215,2565],{"class":1089},[1072,15217,15218],{"class":1078},"  # 24 hours\n",[1072,15220,15221,15223,15225,15227,15229,15231,15233,15236,15238,15240,15242,15244,15246,15248,15250,15252],{"class":1074,"line":1407},[1072,15222,2607],{"class":1951},[1072,15224,4964],{"class":2138},[1072,15226,2068],{"class":1089},[1072,15228,4480],{"class":2138},[1072,15230,1354],{"class":1089},[1072,15232,1128],{"class":1099},[1072,15234,15235],{"class":1103},"products.html",[1072,15237,1107],{"class":1099},[1072,15239,1354],{"class":1089},[1072,15241,12768],{"class":1089},[1072,15243,1107],{"class":1099},[1072,15245,9902],{"class":1103},[1072,15247,1107],{"class":1099},[1072,15249,1110],{"class":1089},[1072,15251,4138],{"class":2138},[1072,15253,14956],{"class":1089},[1072,15255,15256],{"class":1074,"line":1426},[1072,15257,1376],{"emptyLinePlaceholder":1375},[1072,15259,15260],{"class":1074,"line":1445},[1072,15261,15262],{"class":1078},"# ✅ DO: Include timestamp or version in cache key\n",[1072,15264,15265,15267,15270,15272,15274],{"class":1074,"line":1458},[1072,15266,2573],{"class":2021},[1072,15268,15269],{"class":2064}," good_product_list",[1072,15271,2068],{"class":1089},[1072,15273,4480],{"class":2071},[1072,15275,2090],{"class":1089},[1072,15277,15278],{"class":1074,"line":1477},[1072,15279,15280],{"class":1078},"    # Include last update time in cache key\n",[1072,15282,15283,15286,15288,15290,15292,15294,15296,15298],{"class":1074,"line":1482},[1072,15284,15285],{"class":1955},"    last_update ",[1072,15287,2108],{"class":1089},[1072,15289,2610],{"class":1955},[1072,15291,1959],{"class":1089},[1072,15293,2616],{"class":2615},[1072,15295,1959],{"class":1089},[1072,15297,2848],{"class":2138},[1072,15299,2346],{"class":1089},[1072,15301,15302,15305,15307,15309,15311,15313,15316,15318],{"class":1074,"line":1497},[1072,15303,15304],{"class":2215},"        last_modified",[1072,15306,2108],{"class":1089},[1072,15308,9237],{"class":2138},[1072,15310,2068],{"class":1089},[1072,15312,1107],{"class":1099},[1072,15314,15315],{"class":1103},"updated_at",[1072,15317,1107],{"class":1099},[1072,15319,2419],{"class":1089},[1072,15321,15322,15325,15327,15330,15332],{"class":1074,"line":1503},[1072,15323,15324],{"class":1089},"    )[",[1072,15326,1107],{"class":1099},[1072,15328,15329],{"class":1103},"last_modified",[1072,15331,1107],{"class":1099},[1072,15333,2700],{"class":1089},[1072,15335,15336],{"class":1074,"line":1517},[1072,15337,2047],{"class":1955},[1072,15339,15340,15342,15344,15346,15349,15351,15354,15356,15359,15361,15363],{"class":1074,"line":1536},[1072,15341,14983],{"class":1955},[1072,15343,2108],{"class":1089},[1072,15345,2111],{"class":2021},[1072,15347,15348],{"class":1103},"'products_list_",[1072,15350,2118],{"class":2117},[1072,15352,15353],{"class":1955},"last_update",[1072,15355,1959],{"class":1089},[1072,15357,15358],{"class":2138},"timestamp",[1072,15360,2236],{"class":1089},[1072,15362,2123],{"class":2117},[1072,15364,1766],{"class":1103},[1072,15366,15367,15369,15371,15373,15375,15377,15379,15381],{"class":1074,"line":1556},[1072,15368,15135],{"class":1955},[1072,15370,2108],{"class":1089},[1072,15372,2406],{"class":1955},[1072,15374,1959],{"class":1089},[1072,15376,2411],{"class":2138},[1072,15378,2068],{"class":1089},[1072,15380,2416],{"class":2138},[1072,15382,2419],{"class":1089},[1072,15384,15385],{"class":1074,"line":1569},[1072,15386,2047],{"class":1955},[1072,15388,15389,15391,15393,15395],{"class":1074,"line":1588},[1072,15390,5830],{"class":1951},[1072,15392,2433],{"class":1720},[1072,15394,4138],{"class":1955},[1072,15396,2029],{"class":1089},[1072,15398,15399,15401,15403,15405,15407,15409,15411,15413,15415,15417,15419,15421,15423,15425,15427,15429],{"class":1074,"line":1593},[1072,15400,4072],{"class":1955},[1072,15402,2108],{"class":1089},[1072,15404,7739],{"class":2055},[1072,15406,2068],{"class":1089},[1072,15408,5757],{"class":2138},[1072,15410,1959],{"class":1089},[1072,15412,2616],{"class":2615},[1072,15414,1959],{"class":1089},[1072,15416,4099],{"class":2138},[1072,15418,2068],{"class":1089},[1072,15420,1107],{"class":1099},[1072,15422,4106],{"class":1103},[1072,15424,1107],{"class":1099},[1072,15426,2224],{"class":1089},[1072,15428,6069],{"class":2138},[1072,15430,3744],{"class":1089},[1072,15432,15433,15435,15437,15439,15441,15443,15445,15447,15449,15451],{"class":1074,"line":1612},[1072,15434,5843],{"class":1955},[1072,15436,1959],{"class":1089},[1072,15438,2488],{"class":2138},[1072,15440,2068],{"class":1089},[1072,15442,2416],{"class":2138},[1072,15444,1354],{"class":1089},[1072,15446,4138],{"class":2138},[1072,15448,1354],{"class":1089},[1072,15450,10093],{"class":1223},[1072,15452,2419],{"class":1089},[1072,15454,15455],{"class":1074,"line":1617},[1072,15456,2047],{"class":1955},[1072,15458,15459,15461,15463,15465,15467,15469,15471,15473,15475,15477,15479,15481,15483,15485,15487,15489],{"class":1074,"line":1631},[1072,15460,2607],{"class":1951},[1072,15462,4964],{"class":2138},[1072,15464,2068],{"class":1089},[1072,15466,4480],{"class":2138},[1072,15468,1354],{"class":1089},[1072,15470,1128],{"class":1099},[1072,15472,15235],{"class":1103},[1072,15474,1107],{"class":1099},[1072,15476,1354],{"class":1089},[1072,15478,12768],{"class":1089},[1072,15480,1107],{"class":1099},[1072,15482,9902],{"class":1103},[1072,15484,1107],{"class":1099},[1072,15486,1110],{"class":1089},[1072,15488,4138],{"class":2138},[1072,15490,14956],{"class":1089},[1072,15492,15493],{"class":1074,"line":1650},[1072,15494,1376],{"emptyLinePlaceholder":1375},[1072,15496,15497],{"class":1074,"line":1670},[1072,15498,15499],{"class":1078},"# ❌ DON'T: Cache large objects without compression\n",[1072,15501,15502,15504,15507],{"class":1074,"line":1683},[1072,15503,2573],{"class":2021},[1072,15505,15506],{"class":2064}," bad_large_data_cache",[1072,15508,5593],{"class":1089},[1072,15510,15511,15514,15516,15519,15521],{"class":1074,"line":1702},[1072,15512,15513],{"class":1955},"    large_data ",[1072,15515,2108],{"class":1089},[1072,15517,15518],{"class":2138}," generate_large_dataset",[1072,15520,2236],{"class":1089},[1072,15522,15523],{"class":1078},"  # 10MB of data\n",[1072,15525,15526,15528,15530,15532,15534,15536,15539,15541,15543,15546,15548,15550,15552],{"class":1074,"line":1707},[1072,15527,6010],{"class":1955},[1072,15529,1959],{"class":1089},[1072,15531,2488],{"class":2138},[1072,15533,2068],{"class":1089},[1072,15535,1107],{"class":1099},[1072,15537,15538],{"class":1103},"large_data",[1072,15540,1107],{"class":1099},[1072,15542,1354],{"class":1089},[1072,15544,15545],{"class":2138}," large_data",[1072,15547,1354],{"class":1089},[1072,15549,10093],{"class":1223},[1072,15551,2565],{"class":1089},[1072,15553,15554],{"class":1078},"  # Uses lots of memory\n",[1072,15556,15557],{"class":1074,"line":1732},[1072,15558,1376],{"emptyLinePlaceholder":1375},[1072,15560,15561],{"class":1074,"line":1737},[1072,15562,15563],{"class":1078},"# ✅ DO: Compress large cached objects\n",[1072,15565,15566,15568],{"class":1074,"line":1742},[1072,15567,1970],{"class":1951},[1072,15569,15570],{"class":1955}," pickle\n",[1072,15572,15573,15575],{"class":1074,"line":1747},[1072,15574,1970],{"class":1951},[1072,15576,15577],{"class":1955}," gzip\n",[1072,15579,15580],{"class":1074,"line":1753},[1072,15581,1376],{"emptyLinePlaceholder":1375},[1072,15583,15584,15586,15589],{"class":1074,"line":1769},[1072,15585,2573],{"class":2021},[1072,15587,15588],{"class":2064}," good_large_data_cache",[1072,15590,5593],{"class":1089},[1072,15592,15593,15595,15597,15599,15602],{"class":1074,"line":2731},[1072,15594,14983],{"class":1955},[1072,15596,2108],{"class":1089},[1072,15598,1128],{"class":1099},[1072,15600,15601],{"class":1103},"large_data_compressed",[1072,15603,1766],{"class":1099},[1072,15605,15606,15608,15610,15612,15614,15616,15618,15620],{"class":1074,"line":2746},[1072,15607,14841],{"class":1955},[1072,15609,2108],{"class":1089},[1072,15611,2406],{"class":1955},[1072,15613,1959],{"class":1089},[1072,15615,2411],{"class":2138},[1072,15617,2068],{"class":1089},[1072,15619,2416],{"class":2138},[1072,15621,2419],{"class":1089},[1072,15623,15624],{"class":1074,"line":2756},[1072,15625,2047],{"class":1955},[1072,15627,15628,15630,15633,15635,15637],{"class":1074,"line":2786},[1072,15629,5830],{"class":1951},[1072,15631,15632],{"class":1955}," cached_data ",[1072,15634,2430],{"class":1720},[1072,15636,2436],{"class":1241},[1072,15638,2029],{"class":1089},[1072,15640,15641,15644,15646,15648],{"class":1074,"line":2791},[1072,15642,15643],{"class":1955},"        large_data ",[1072,15645,2108],{"class":1089},[1072,15647,15518],{"class":2138},[1072,15649,3447],{"class":1089},[1072,15651,15652],{"class":1074,"line":2801},[1072,15653,3280],{"class":1955},[1072,15655,15656],{"class":1074,"line":2828},[1072,15657,15658],{"class":1078},"        # Compress before caching\n",[1072,15660,15661,15664,15666,15669,15671,15674,15676,15679,15681,15683,15685,15687],{"class":1074,"line":2853},[1072,15662,15663],{"class":1955},"        compressed_data ",[1072,15665,2108],{"class":1089},[1072,15667,15668],{"class":1955}," gzip",[1072,15670,1959],{"class":1089},[1072,15672,15673],{"class":2138},"compress",[1072,15675,2068],{"class":1089},[1072,15677,15678],{"class":2138},"pickle",[1072,15680,1959],{"class":1089},[1072,15682,2206],{"class":2138},[1072,15684,2068],{"class":1089},[1072,15686,15538],{"class":2138},[1072,15688,8283],{"class":1089},[1072,15690,15691,15693,15695,15697,15699,15701,15703,15706,15708,15710],{"class":1074,"line":2875},[1072,15692,5843],{"class":1955},[1072,15694,1959],{"class":1089},[1072,15696,2488],{"class":2138},[1072,15698,2068],{"class":1089},[1072,15700,2416],{"class":2138},[1072,15702,1354],{"class":1089},[1072,15704,15705],{"class":2138}," compressed_data",[1072,15707,1354],{"class":1089},[1072,15709,10093],{"class":1223},[1072,15711,2419],{"class":1089},[1072,15713,15714,15716],{"class":1074,"line":2899},[1072,15715,2245],{"class":1951},[1072,15717,15718],{"class":1955}," large_data\n",[1072,15720,15721,15724],{"class":1074,"line":2924},[1072,15722,15723],{"class":1951},"    else",[1072,15725,2029],{"class":1089},[1072,15727,15728],{"class":1074,"line":2934},[1072,15729,15730],{"class":1078},"        # Decompress when retrieving\n",[1072,15732,15733,15735,15738,15740,15743,15745,15748,15750,15753,15755,15758],{"class":1074,"line":2944},[1072,15734,2245],{"class":1951},[1072,15736,15737],{"class":1955}," pickle",[1072,15739,1959],{"class":1089},[1072,15741,15742],{"class":2138},"loads",[1072,15744,2068],{"class":1089},[1072,15746,15747],{"class":2138},"gzip",[1072,15749,1959],{"class":1089},[1072,15751,15752],{"class":2138},"decompress",[1072,15754,2068],{"class":1089},[1072,15756,15757],{"class":2138},"cached_data",[1072,15759,8283],{"class":1089},[1030,15761,15763],{"id":15762},"performance-impact-measurement","Performance Impact Measurement",[1026,15765,15766],{},"Implementing comprehensive caching strategies typically provides:",[15768,15769,15770,15778,15784,15790],"ul",{},[15771,15772,15773,15777],"li",{},[15774,15775,15776],"strong",{},"Database Load Reduction",": 60-90% fewer database queries",[15771,15779,15780,15783],{},[15774,15781,15782],{},"Response Time Improvement",": 50-80% faster page loads",[15771,15785,15786,15789],{},[15774,15787,15788],{},"Server Capacity Increase",": 3-5x more concurrent users",[15771,15791,15792,15795],{},[15774,15793,15794],{},"Memory Efficiency",": Better resource utilization with proper cache sizing",[1026,15797,15798],{},"The key to successful caching is understanding your application's data access patterns, implementing appropriate cache levels, and maintaining cache consistency through smart invalidation strategies. Start with query result caching and view caching for immediate impact, then add template fragment caching and advanced strategies as needed.",[1026,15800,15801],{},"Remember: measure first, cache strategically, and always have a plan for cache invalidation. Proper caching transforms Django applications from database-bound systems into high-performance, scalable platforms capable of handling significant user loads.",[15803,15804,15805],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sJFLg, html code.shiki .sJFLg{--shiki-light:#E53935;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s5q8q, html code.shiki .s5q8q{--shiki-light:#9C3EDA;--shiki-default:#B07D48;--shiki-dark:#BD976A}",{"title":1052,"searchDepth":1075,"depth":1082,"links":15807},[15808,15811,15815,15819,15823,15827,15831,15834,15837,15842],{"id":1032,"depth":1082,"text":1033,"children":15809},[15810],{"id":1040,"depth":1096,"text":1041},{"id":1055,"depth":1082,"text":1056,"children":15812},[15813,15814],{"id":1059,"depth":1096,"text":1060},{"id":1783,"depth":1096,"text":1784},{"id":1936,"depth":1082,"text":1937,"children":15816},[15817,15818],{"id":1940,"depth":1096,"text":1941},{"id":3046,"depth":1096,"text":3047},{"id":4315,"depth":1082,"text":4316,"children":15820},[15821,15822],{"id":4319,"depth":1096,"text":4320},{"id":5170,"depth":1096,"text":5171},{"id":6108,"depth":1082,"text":695,"children":15824},[15825,15826],{"id":6111,"depth":1096,"text":6112},{"id":6769,"depth":1096,"text":6770},{"id":7337,"depth":1082,"text":7338,"children":15828},[15829,15830],{"id":7341,"depth":1096,"text":7342},{"id":8418,"depth":1096,"text":8419},{"id":9476,"depth":1082,"text":9477,"children":15832},[15833],{"id":9480,"depth":1096,"text":9481},{"id":11607,"depth":1082,"text":11608,"children":15835},[15836],{"id":11611,"depth":1096,"text":11612},{"id":13345,"depth":1082,"text":13346,"children":15838},[15839,15840,15841],{"id":13349,"depth":1096,"text":13350},{"id":14130,"depth":1096,"text":14131},{"id":14812,"depth":1096,"text":14813},{"id":15762,"depth":1082,"text":15763},"md",null,{},{"title":793,"description":1028},"4uPc_fdFX_CmFzzoqWADdbVKTlD73jIBv-yNLpfsXmg",[15849,15851],{"title":789,"path":790,"stem":791,"description":15850,"children":-1},"Django's select_related and prefetch_related are the most powerful tools for eliminating N+1 query problems and optimizing database access. This chapter provides comprehensive coverage of these optimization techniques, from basic usage to advanced patterns that can reduce query counts from hundreds to just a few.",{"title":797,"path":798,"stem":799,"description":15852,"children":-1},"Profiling is essential for identifying performance bottlenecks in Django applications. Without proper profiling, optimization efforts often target the wrong areas, wasting time and resources. This comprehensive guide covers profiling tools, techniques, and methodologies that help you understand where your application spends time and how to make it faster.",1772474956496]