[{"data":1,"prerenderedAt":16090},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/performance-caching":1016,"/microservices-with-django/performance-caching-surround":16085},[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":917,"body":1018,"description":1028,"extension":16080,"links":16081,"meta":16082,"navigation":1193,"path":918,"seo":16083,"stem":919,"__hash__":16084},"docs/27.microservices-with-django/11.performance-caching.md",{"type":1019,"value":1020,"toc":16047},"minimark",[1021,1025,1029,1034,1037,1072,1076,1081,1120,1124,1150,1154,1158,1861,1865,2158,2162,2166,3085,3088,3591,3595,4527,4531,4535,5601,5605,7029,7033,7037,7928,7932,9904,9908,9912,11488,11492,12654,12658,14054,14058,14062,14960,14964,16041,16044],[1022,1023,917],"h1",{"id":1024},"improving-microservices-performance-with-caching",[1026,1027,1028],"p",{},"Performance optimization in microservices requires a multi-layered approach to caching, from application-level caching to distributed caching strategies. This chapter covers comprehensive caching techniques, performance monitoring, and optimization strategies for Django microservices.",[1030,1031,1033],"h2",{"id":1032},"understanding-performance-challenges-in-microservices","Understanding Performance Challenges in Microservices",[1026,1035,1036],{},"Microservices face unique performance challenges:",[1038,1039,1040,1048,1054,1060,1066],"ul",{},[1041,1042,1043,1047],"li",{},[1044,1045,1046],"strong",{},"Network Latency",": Inter-service communication overhead",[1041,1049,1050,1053],{},[1044,1051,1052],{},"Database Load",": Multiple services accessing shared or separate databases",[1041,1055,1056,1059],{},[1044,1057,1058],{},"Repeated Computations",": Similar operations across different services",[1041,1061,1062,1065],{},[1044,1063,1064],{},"Data Consistency",": Maintaining cache coherence across services",[1041,1067,1068,1071],{},[1044,1069,1070],{},"Resource Utilization",": Efficient use of memory and CPU across services",[1030,1073,1075],{"id":1074},"caching-strategies-overview","Caching Strategies Overview",[1077,1078,1080],"h3",{"id":1079},"caching-levels","Caching Levels",[1082,1083,1084,1090,1096,1102,1108,1114],"ol",{},[1041,1085,1086,1089],{},[1044,1087,1088],{},"Browser Caching",": Client-side caching for static assets",[1041,1091,1092,1095],{},[1044,1093,1094],{},"CDN Caching",": Geographic distribution of content",[1041,1097,1098,1101],{},[1044,1099,1100],{},"Reverse Proxy Caching",": Nginx/Apache caching",[1041,1103,1104,1107],{},[1044,1105,1106],{},"Application Caching",": Django's caching framework",[1041,1109,1110,1113],{},[1044,1111,1112],{},"Database Caching",": Query result caching",[1041,1115,1116,1119],{},[1044,1117,1118],{},"Distributed Caching",": Redis/Memcached for shared cache",[1077,1121,1123],{"id":1122},"cache-patterns","Cache Patterns",[1038,1125,1126,1132,1138,1144],{},[1041,1127,1128,1131],{},[1044,1129,1130],{},"Cache-Aside (Lazy Loading)",": Load data into cache on demand",[1041,1133,1134,1137],{},[1044,1135,1136],{},"Write-Through",": Write to cache and database simultaneously",[1041,1139,1140,1143],{},[1044,1141,1142],{},"Write-Behind (Write-Back)",": Write to cache first, database later",[1041,1145,1146,1149],{},[1044,1147,1148],{},"Refresh-Ahead",": Proactively refresh cache before expiration",[1030,1151,1153],{"id":1152},"django-caching-configuration","Django Caching Configuration",[1077,1155,1157],{"id":1156},"redis-setup-for-microservices","Redis Setup for Microservices",[1159,1160,1165],"pre",{"className":1161,"code":1162,"language":1163,"meta":1164,"style":1164},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# shared/cache_config.py\nimport os\n\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.getenv('REDIS_URL', 'redis://localhost:6379/0'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 50,\n                'retry_on_timeout': True,\n            },\n            'SERIALIZER': 'django_redis.serializers.json.JSONSerializer',\n            'COMPRESSOR': 'django_redis.compressors.zlib.ZlibCompressor',\n        },\n        'KEY_PREFIX': 'microservices',\n        'VERSION': 1,\n        'TIMEOUT': 300,  # 5 minutes default\n    },\n    'sessions': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.getenv('REDIS_URL', 'redis://localhost:6379/1'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'KEY_PREFIX': 'sessions',\n        'TIMEOUT': 86400,  # 24 hours\n    },\n    'api_cache': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.getenv('REDIS_URL', 'redis://localhost:6379/2'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'KEY_PREFIX': 'api',\n        'TIMEOUT': 600,  # 10 minutes\n    }\n}\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'sessions'\nSESSION_COOKIE_AGE = 86400  # 24 hours\n","python","",[1166,1167,1168,1177,1188,1195,1209,1228,1252,1297,1311,1333,1347,1366,1384,1390,1411,1432,1438,1459,1476,1496,1502,1516,1535,1571,1584,1603,1608,1627,1646,1651,1665,1684,1720,1733,1752,1757,1777,1796,1802,1808,1813,1819,1835,1849],"code",{"__ignoreMap":1164},[1169,1170,1173],"span",{"class":1171,"line":1172},"line",1,[1169,1174,1176],{"class":1175},"s9Tkl","# shared/cache_config.py\n",[1169,1178,1180,1184],{"class":1171,"line":1179},2,[1169,1181,1183],{"class":1182},"siDh9","import",[1169,1185,1187],{"class":1186},"sftqT"," os\n",[1169,1189,1191],{"class":1171,"line":1190},3,[1169,1192,1194],{"emptyLinePlaceholder":1193},true,"\n",[1169,1196,1198,1202,1206],{"class":1171,"line":1197},4,[1169,1199,1201],{"class":1200},"se3Ec","CACHES",[1169,1203,1205],{"class":1204},"soVBu"," =",[1169,1207,1208],{"class":1204}," {\n",[1169,1210,1212,1216,1220,1223,1226],{"class":1171,"line":1211},5,[1169,1213,1215],{"class":1214},"sbYkP","    '",[1169,1217,1219],{"class":1218},"sTbE_","default",[1169,1221,1222],{"class":1214},"'",[1169,1224,1225],{"class":1204},":",[1169,1227,1208],{"class":1204},[1169,1229,1231,1234,1237,1239,1241,1244,1247,1249],{"class":1171,"line":1230},6,[1169,1232,1233],{"class":1214},"        '",[1169,1235,1236],{"class":1218},"BACKEND",[1169,1238,1222],{"class":1214},[1169,1240,1225],{"class":1204},[1169,1242,1243],{"class":1214}," '",[1169,1245,1246],{"class":1218},"django_redis.cache.RedisCache",[1169,1248,1222],{"class":1214},[1169,1250,1251],{"class":1204},",\n",[1169,1253,1255,1257,1260,1262,1264,1267,1270,1274,1277,1279,1282,1284,1287,1289,1292,1294],{"class":1171,"line":1254},7,[1169,1256,1233],{"class":1214},[1169,1258,1259],{"class":1218},"LOCATION",[1169,1261,1222],{"class":1214},[1169,1263,1225],{"class":1204},[1169,1265,1266],{"class":1186}," os",[1169,1268,1269],{"class":1204},".",[1169,1271,1273],{"class":1272},"siWMO","getenv",[1169,1275,1276],{"class":1204},"(",[1169,1278,1222],{"class":1214},[1169,1280,1281],{"class":1218},"REDIS_URL",[1169,1283,1222],{"class":1214},[1169,1285,1286],{"class":1204},",",[1169,1288,1243],{"class":1214},[1169,1290,1291],{"class":1218},"redis://localhost:6379/0",[1169,1293,1222],{"class":1214},[1169,1295,1296],{"class":1204},"),\n",[1169,1298,1300,1302,1305,1307,1309],{"class":1171,"line":1299},8,[1169,1301,1233],{"class":1214},[1169,1303,1304],{"class":1218},"OPTIONS",[1169,1306,1222],{"class":1214},[1169,1308,1225],{"class":1204},[1169,1310,1208],{"class":1204},[1169,1312,1314,1317,1320,1322,1324,1326,1329,1331],{"class":1171,"line":1313},9,[1169,1315,1316],{"class":1214},"            '",[1169,1318,1319],{"class":1218},"CLIENT_CLASS",[1169,1321,1222],{"class":1214},[1169,1323,1225],{"class":1204},[1169,1325,1243],{"class":1214},[1169,1327,1328],{"class":1218},"django_redis.client.DefaultClient",[1169,1330,1222],{"class":1214},[1169,1332,1251],{"class":1204},[1169,1334,1336,1338,1341,1343,1345],{"class":1171,"line":1335},10,[1169,1337,1316],{"class":1214},[1169,1339,1340],{"class":1218},"CONNECTION_POOL_KWARGS",[1169,1342,1222],{"class":1214},[1169,1344,1225],{"class":1204},[1169,1346,1208],{"class":1204},[1169,1348,1350,1353,1356,1358,1360,1364],{"class":1171,"line":1349},11,[1169,1351,1352],{"class":1214},"                '",[1169,1354,1355],{"class":1218},"max_connections",[1169,1357,1222],{"class":1214},[1169,1359,1225],{"class":1204},[1169,1361,1363],{"class":1362},"s7CZa"," 50",[1169,1365,1251],{"class":1204},[1169,1367,1369,1371,1374,1376,1378,1382],{"class":1171,"line":1368},12,[1169,1370,1352],{"class":1214},[1169,1372,1373],{"class":1218},"retry_on_timeout",[1169,1375,1222],{"class":1214},[1169,1377,1225],{"class":1204},[1169,1379,1381],{"class":1380},"s8XtY"," True",[1169,1383,1251],{"class":1204},[1169,1385,1387],{"class":1171,"line":1386},13,[1169,1388,1389],{"class":1204},"            },\n",[1169,1391,1393,1395,1398,1400,1402,1404,1407,1409],{"class":1171,"line":1392},14,[1169,1394,1316],{"class":1214},[1169,1396,1397],{"class":1218},"SERIALIZER",[1169,1399,1222],{"class":1214},[1169,1401,1225],{"class":1204},[1169,1403,1243],{"class":1214},[1169,1405,1406],{"class":1218},"django_redis.serializers.json.JSONSerializer",[1169,1408,1222],{"class":1214},[1169,1410,1251],{"class":1204},[1169,1412,1414,1416,1419,1421,1423,1425,1428,1430],{"class":1171,"line":1413},15,[1169,1415,1316],{"class":1214},[1169,1417,1418],{"class":1218},"COMPRESSOR",[1169,1420,1222],{"class":1214},[1169,1422,1225],{"class":1204},[1169,1424,1243],{"class":1214},[1169,1426,1427],{"class":1218},"django_redis.compressors.zlib.ZlibCompressor",[1169,1429,1222],{"class":1214},[1169,1431,1251],{"class":1204},[1169,1433,1435],{"class":1171,"line":1434},16,[1169,1436,1437],{"class":1204},"        },\n",[1169,1439,1441,1443,1446,1448,1450,1452,1455,1457],{"class":1171,"line":1440},17,[1169,1442,1233],{"class":1214},[1169,1444,1445],{"class":1218},"KEY_PREFIX",[1169,1447,1222],{"class":1214},[1169,1449,1225],{"class":1204},[1169,1451,1243],{"class":1214},[1169,1453,1454],{"class":1218},"microservices",[1169,1456,1222],{"class":1214},[1169,1458,1251],{"class":1204},[1169,1460,1462,1464,1467,1469,1471,1474],{"class":1171,"line":1461},18,[1169,1463,1233],{"class":1214},[1169,1465,1466],{"class":1218},"VERSION",[1169,1468,1222],{"class":1214},[1169,1470,1225],{"class":1204},[1169,1472,1473],{"class":1362}," 1",[1169,1475,1251],{"class":1204},[1169,1477,1479,1481,1484,1486,1488,1491,1493],{"class":1171,"line":1478},19,[1169,1480,1233],{"class":1214},[1169,1482,1483],{"class":1218},"TIMEOUT",[1169,1485,1222],{"class":1214},[1169,1487,1225],{"class":1204},[1169,1489,1490],{"class":1362}," 300",[1169,1492,1286],{"class":1204},[1169,1494,1495],{"class":1175},"  # 5 minutes default\n",[1169,1497,1499],{"class":1171,"line":1498},20,[1169,1500,1501],{"class":1204},"    },\n",[1169,1503,1505,1507,1510,1512,1514],{"class":1171,"line":1504},21,[1169,1506,1215],{"class":1214},[1169,1508,1509],{"class":1218},"sessions",[1169,1511,1222],{"class":1214},[1169,1513,1225],{"class":1204},[1169,1515,1208],{"class":1204},[1169,1517,1519,1521,1523,1525,1527,1529,1531,1533],{"class":1171,"line":1518},22,[1169,1520,1233],{"class":1214},[1169,1522,1236],{"class":1218},[1169,1524,1222],{"class":1214},[1169,1526,1225],{"class":1204},[1169,1528,1243],{"class":1214},[1169,1530,1246],{"class":1218},[1169,1532,1222],{"class":1214},[1169,1534,1251],{"class":1204},[1169,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562,1564,1567,1569],{"class":1171,"line":1537},23,[1169,1539,1233],{"class":1214},[1169,1541,1259],{"class":1218},[1169,1543,1222],{"class":1214},[1169,1545,1225],{"class":1204},[1169,1547,1266],{"class":1186},[1169,1549,1269],{"class":1204},[1169,1551,1273],{"class":1272},[1169,1553,1276],{"class":1204},[1169,1555,1222],{"class":1214},[1169,1557,1281],{"class":1218},[1169,1559,1222],{"class":1214},[1169,1561,1286],{"class":1204},[1169,1563,1243],{"class":1214},[1169,1565,1566],{"class":1218},"redis://localhost:6379/1",[1169,1568,1222],{"class":1214},[1169,1570,1296],{"class":1204},[1169,1572,1574,1576,1578,1580,1582],{"class":1171,"line":1573},24,[1169,1575,1233],{"class":1214},[1169,1577,1304],{"class":1218},[1169,1579,1222],{"class":1214},[1169,1581,1225],{"class":1204},[1169,1583,1208],{"class":1204},[1169,1585,1587,1589,1591,1593,1595,1597,1599,1601],{"class":1171,"line":1586},25,[1169,1588,1316],{"class":1214},[1169,1590,1319],{"class":1218},[1169,1592,1222],{"class":1214},[1169,1594,1225],{"class":1204},[1169,1596,1243],{"class":1214},[1169,1598,1328],{"class":1218},[1169,1600,1222],{"class":1214},[1169,1602,1251],{"class":1204},[1169,1604,1606],{"class":1171,"line":1605},26,[1169,1607,1437],{"class":1204},[1169,1609,1611,1613,1615,1617,1619,1621,1623,1625],{"class":1171,"line":1610},27,[1169,1612,1233],{"class":1214},[1169,1614,1445],{"class":1218},[1169,1616,1222],{"class":1214},[1169,1618,1225],{"class":1204},[1169,1620,1243],{"class":1214},[1169,1622,1509],{"class":1218},[1169,1624,1222],{"class":1214},[1169,1626,1251],{"class":1204},[1169,1628,1630,1632,1634,1636,1638,1641,1643],{"class":1171,"line":1629},28,[1169,1631,1233],{"class":1214},[1169,1633,1483],{"class":1218},[1169,1635,1222],{"class":1214},[1169,1637,1225],{"class":1204},[1169,1639,1640],{"class":1362}," 86400",[1169,1642,1286],{"class":1204},[1169,1644,1645],{"class":1175},"  # 24 hours\n",[1169,1647,1649],{"class":1171,"line":1648},29,[1169,1650,1501],{"class":1204},[1169,1652,1654,1656,1659,1661,1663],{"class":1171,"line":1653},30,[1169,1655,1215],{"class":1214},[1169,1657,1658],{"class":1218},"api_cache",[1169,1660,1222],{"class":1214},[1169,1662,1225],{"class":1204},[1169,1664,1208],{"class":1204},[1169,1666,1668,1670,1672,1674,1676,1678,1680,1682],{"class":1171,"line":1667},31,[1169,1669,1233],{"class":1214},[1169,1671,1236],{"class":1218},[1169,1673,1222],{"class":1214},[1169,1675,1225],{"class":1204},[1169,1677,1243],{"class":1214},[1169,1679,1246],{"class":1218},[1169,1681,1222],{"class":1214},[1169,1683,1251],{"class":1204},[1169,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1716,1718],{"class":1171,"line":1686},32,[1169,1688,1233],{"class":1214},[1169,1690,1259],{"class":1218},[1169,1692,1222],{"class":1214},[1169,1694,1225],{"class":1204},[1169,1696,1266],{"class":1186},[1169,1698,1269],{"class":1204},[1169,1700,1273],{"class":1272},[1169,1702,1276],{"class":1204},[1169,1704,1222],{"class":1214},[1169,1706,1281],{"class":1218},[1169,1708,1222],{"class":1214},[1169,1710,1286],{"class":1204},[1169,1712,1243],{"class":1214},[1169,1714,1715],{"class":1218},"redis://localhost:6379/2",[1169,1717,1222],{"class":1214},[1169,1719,1296],{"class":1204},[1169,1721,1723,1725,1727,1729,1731],{"class":1171,"line":1722},33,[1169,1724,1233],{"class":1214},[1169,1726,1304],{"class":1218},[1169,1728,1222],{"class":1214},[1169,1730,1225],{"class":1204},[1169,1732,1208],{"class":1204},[1169,1734,1736,1738,1740,1742,1744,1746,1748,1750],{"class":1171,"line":1735},34,[1169,1737,1316],{"class":1214},[1169,1739,1319],{"class":1218},[1169,1741,1222],{"class":1214},[1169,1743,1225],{"class":1204},[1169,1745,1243],{"class":1214},[1169,1747,1328],{"class":1218},[1169,1749,1222],{"class":1214},[1169,1751,1251],{"class":1204},[1169,1753,1755],{"class":1171,"line":1754},35,[1169,1756,1437],{"class":1204},[1169,1758,1760,1762,1764,1766,1768,1770,1773,1775],{"class":1171,"line":1759},36,[1169,1761,1233],{"class":1214},[1169,1763,1445],{"class":1218},[1169,1765,1222],{"class":1214},[1169,1767,1225],{"class":1204},[1169,1769,1243],{"class":1214},[1169,1771,1772],{"class":1218},"api",[1169,1774,1222],{"class":1214},[1169,1776,1251],{"class":1204},[1169,1778,1780,1782,1784,1786,1788,1791,1793],{"class":1171,"line":1779},37,[1169,1781,1233],{"class":1214},[1169,1783,1483],{"class":1218},[1169,1785,1222],{"class":1214},[1169,1787,1225],{"class":1204},[1169,1789,1790],{"class":1362}," 600",[1169,1792,1286],{"class":1204},[1169,1794,1795],{"class":1175},"  # 10 minutes\n",[1169,1797,1799],{"class":1171,"line":1798},38,[1169,1800,1801],{"class":1204},"    }\n",[1169,1803,1805],{"class":1171,"line":1804},39,[1169,1806,1807],{"class":1204},"}\n",[1169,1809,1811],{"class":1171,"line":1810},40,[1169,1812,1194],{"emptyLinePlaceholder":1193},[1169,1814,1816],{"class":1171,"line":1815},41,[1169,1817,1818],{"class":1175},"# Session configuration\n",[1169,1820,1822,1825,1827,1829,1832],{"class":1171,"line":1821},42,[1169,1823,1824],{"class":1200},"SESSION_ENGINE",[1169,1826,1205],{"class":1204},[1169,1828,1243],{"class":1214},[1169,1830,1831],{"class":1218},"django.contrib.sessions.backends.cache",[1169,1833,1834],{"class":1214},"'\n",[1169,1836,1838,1841,1843,1845,1847],{"class":1171,"line":1837},43,[1169,1839,1840],{"class":1200},"SESSION_CACHE_ALIAS",[1169,1842,1205],{"class":1204},[1169,1844,1243],{"class":1214},[1169,1846,1509],{"class":1218},[1169,1848,1834],{"class":1214},[1169,1850,1852,1855,1857,1859],{"class":1171,"line":1851},44,[1169,1853,1854],{"class":1200},"SESSION_COOKIE_AGE",[1169,1856,1205],{"class":1204},[1169,1858,1640],{"class":1362},[1169,1860,1645],{"class":1175},[1077,1862,1864],{"id":1863},"service-specific-cache-settings","Service-Specific Cache Settings",[1159,1866,1868],{"className":1161,"code":1867,"language":1163,"meta":1164,"style":1164},"# user_service/settings/production.py\nfrom shared.cache_config import CACHES\n\n# Add service-specific cache configuration\nCACHES['user_cache'] = {\n    'BACKEND': 'django_redis.cache.RedisCache',\n    'LOCATION': os.getenv('REDIS_URL', 'redis://localhost:6379/3'),\n    'OPTIONS': {\n        'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n    },\n    'KEY_PREFIX': 'user_service',\n    'TIMEOUT': 1800,  # 30 minutes\n}\n\n# Cache middleware\nMIDDLEWARE = [\n    'django.middleware.cache.UpdateCacheMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.cache.FetchFromCacheMiddleware',\n    # ... other middleware\n]\n\n# Cache settings\nCACHE_MIDDLEWARE_ALIAS = 'default'\nCACHE_MIDDLEWARE_SECONDS = 600\nCACHE_MIDDLEWARE_KEY_PREFIX = 'user_service'\n",[1166,1869,1870,1875,1893,1897,1902,1923,1941,1976,1988,2006,2010,2029,2047,2051,2055,2060,2070,2081,2092,2103,2108,2113,2117,2122,2135,2145],{"__ignoreMap":1164},[1169,1871,1872],{"class":1171,"line":1172},[1169,1873,1874],{"class":1175},"# user_service/settings/production.py\n",[1169,1876,1877,1880,1883,1885,1888,1890],{"class":1171,"line":1179},[1169,1878,1879],{"class":1182},"from",[1169,1881,1882],{"class":1186}," shared",[1169,1884,1269],{"class":1204},[1169,1886,1887],{"class":1186},"cache_config ",[1169,1889,1183],{"class":1182},[1169,1891,1892],{"class":1200}," CACHES\n",[1169,1894,1895],{"class":1171,"line":1190},[1169,1896,1194],{"emptyLinePlaceholder":1193},[1169,1898,1899],{"class":1171,"line":1197},[1169,1900,1901],{"class":1175},"# Add service-specific cache configuration\n",[1169,1903,1904,1906,1909,1911,1914,1916,1919,1921],{"class":1171,"line":1211},[1169,1905,1201],{"class":1200},[1169,1907,1908],{"class":1204},"[",[1169,1910,1222],{"class":1214},[1169,1912,1913],{"class":1218},"user_cache",[1169,1915,1222],{"class":1214},[1169,1917,1918],{"class":1204},"]",[1169,1920,1205],{"class":1204},[1169,1922,1208],{"class":1204},[1169,1924,1925,1927,1929,1931,1933,1935,1937,1939],{"class":1171,"line":1230},[1169,1926,1215],{"class":1214},[1169,1928,1236],{"class":1218},[1169,1930,1222],{"class":1214},[1169,1932,1225],{"class":1204},[1169,1934,1243],{"class":1214},[1169,1936,1246],{"class":1218},[1169,1938,1222],{"class":1214},[1169,1940,1251],{"class":1204},[1169,1942,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969,1972,1974],{"class":1171,"line":1254},[1169,1944,1215],{"class":1214},[1169,1946,1259],{"class":1218},[1169,1948,1222],{"class":1214},[1169,1950,1225],{"class":1204},[1169,1952,1266],{"class":1186},[1169,1954,1269],{"class":1204},[1169,1956,1273],{"class":1272},[1169,1958,1276],{"class":1204},[1169,1960,1222],{"class":1214},[1169,1962,1281],{"class":1218},[1169,1964,1222],{"class":1214},[1169,1966,1286],{"class":1204},[1169,1968,1243],{"class":1214},[1169,1970,1971],{"class":1218},"redis://localhost:6379/3",[1169,1973,1222],{"class":1214},[1169,1975,1296],{"class":1204},[1169,1977,1978,1980,1982,1984,1986],{"class":1171,"line":1299},[1169,1979,1215],{"class":1214},[1169,1981,1304],{"class":1218},[1169,1983,1222],{"class":1214},[1169,1985,1225],{"class":1204},[1169,1987,1208],{"class":1204},[1169,1989,1990,1992,1994,1996,1998,2000,2002,2004],{"class":1171,"line":1313},[1169,1991,1233],{"class":1214},[1169,1993,1319],{"class":1218},[1169,1995,1222],{"class":1214},[1169,1997,1225],{"class":1204},[1169,1999,1243],{"class":1214},[1169,2001,1328],{"class":1218},[1169,2003,1222],{"class":1214},[1169,2005,1251],{"class":1204},[1169,2007,2008],{"class":1171,"line":1335},[1169,2009,1501],{"class":1204},[1169,2011,2012,2014,2016,2018,2020,2022,2025,2027],{"class":1171,"line":1349},[1169,2013,1215],{"class":1214},[1169,2015,1445],{"class":1218},[1169,2017,1222],{"class":1214},[1169,2019,1225],{"class":1204},[1169,2021,1243],{"class":1214},[1169,2023,2024],{"class":1218},"user_service",[1169,2026,1222],{"class":1214},[1169,2028,1251],{"class":1204},[1169,2030,2031,2033,2035,2037,2039,2042,2044],{"class":1171,"line":1368},[1169,2032,1215],{"class":1214},[1169,2034,1483],{"class":1218},[1169,2036,1222],{"class":1214},[1169,2038,1225],{"class":1204},[1169,2040,2041],{"class":1362}," 1800",[1169,2043,1286],{"class":1204},[1169,2045,2046],{"class":1175},"  # 30 minutes\n",[1169,2048,2049],{"class":1171,"line":1386},[1169,2050,1807],{"class":1204},[1169,2052,2053],{"class":1171,"line":1392},[1169,2054,1194],{"emptyLinePlaceholder":1193},[1169,2056,2057],{"class":1171,"line":1413},[1169,2058,2059],{"class":1175},"# Cache middleware\n",[1169,2061,2062,2065,2067],{"class":1171,"line":1434},[1169,2063,2064],{"class":1200},"MIDDLEWARE",[1169,2066,1205],{"class":1204},[1169,2068,2069],{"class":1204}," [\n",[1169,2071,2072,2074,2077,2079],{"class":1171,"line":1440},[1169,2073,1215],{"class":1214},[1169,2075,2076],{"class":1218},"django.middleware.cache.UpdateCacheMiddleware",[1169,2078,1222],{"class":1214},[1169,2080,1251],{"class":1204},[1169,2082,2083,2085,2088,2090],{"class":1171,"line":1461},[1169,2084,1215],{"class":1214},[1169,2086,2087],{"class":1218},"django.middleware.common.CommonMiddleware",[1169,2089,1222],{"class":1214},[1169,2091,1251],{"class":1204},[1169,2093,2094,2096,2099,2101],{"class":1171,"line":1478},[1169,2095,1215],{"class":1214},[1169,2097,2098],{"class":1218},"django.middleware.cache.FetchFromCacheMiddleware",[1169,2100,1222],{"class":1214},[1169,2102,1251],{"class":1204},[1169,2104,2105],{"class":1171,"line":1498},[1169,2106,2107],{"class":1175},"    # ... other middleware\n",[1169,2109,2110],{"class":1171,"line":1504},[1169,2111,2112],{"class":1204},"]\n",[1169,2114,2115],{"class":1171,"line":1518},[1169,2116,1194],{"emptyLinePlaceholder":1193},[1169,2118,2119],{"class":1171,"line":1537},[1169,2120,2121],{"class":1175},"# Cache settings\n",[1169,2123,2124,2127,2129,2131,2133],{"class":1171,"line":1573},[1169,2125,2126],{"class":1200},"CACHE_MIDDLEWARE_ALIAS",[1169,2128,1205],{"class":1204},[1169,2130,1243],{"class":1214},[1169,2132,1219],{"class":1218},[1169,2134,1834],{"class":1214},[1169,2136,2137,2140,2142],{"class":1171,"line":1586},[1169,2138,2139],{"class":1200},"CACHE_MIDDLEWARE_SECONDS",[1169,2141,1205],{"class":1204},[1169,2143,2144],{"class":1362}," 600\n",[1169,2146,2147,2150,2152,2154,2156],{"class":1171,"line":1605},[1169,2148,2149],{"class":1200},"CACHE_MIDDLEWARE_KEY_PREFIX",[1169,2151,1205],{"class":1204},[1169,2153,1243],{"class":1214},[1169,2155,2024],{"class":1218},[1169,2157,1834],{"class":1214},[1030,2159,2161],{"id":2160},"application-level-caching","Application-Level Caching",[1077,2163,2165],{"id":2164},"view-level-caching","View-Level Caching",[1159,2167,2169],{"className":1161,"code":2168,"language":1163,"meta":1164,"style":1164},"# user_service/views.py\nfrom django.views.decorators.cache import cache_page\nfrom django.views.decorators.vary import vary_on_headers\nfrom django.core.cache import cache, caches\nfrom django.utils.decorators import method_decorator\nfrom rest_framework.decorators import api_view\nfrom rest_framework.response import Response\nimport hashlib\nimport json\n\n# Function-based view caching\n@cache_page(60 * 15)  # Cache for 15 minutes\n@vary_on_headers('Authorization')\n@api_view(['GET'])\ndef user_list(request):\n    \"\"\"Cached user list endpoint\"\"\"\n    users = User.objects.select_related('profile').all()\n    serializer = UserSerializer(users, many=True)\n    return Response(serializer.data)\n\n# Class-based view caching\n@method_decorator(cache_page(60 * 10), name='get')\n@method_decorator(vary_on_headers('Authorization'), name='get')\nclass UserDetailView(RetrieveAPIView):\n    queryset = User.objects.select_related('profile')\n    serializer_class = UserDetailSerializer\n\n# Custom cache key generation\ndef generate_cache_key(prefix, *args, **kwargs):\n    \"\"\"Generate consistent cache keys\"\"\"\n    key_data = {\n        'args': args,\n        'kwargs': sorted(kwargs.items())\n    }\n    key_string = json.dumps(key_data, sort_keys=True)\n    key_hash = hashlib.md5(key_string.encode()).hexdigest()\n    return f\"{prefix}:{key_hash}\"\n\n@api_view(['GET'])\ndef user_statistics(request):\n    \"\"\"Custom caching with dynamic keys\"\"\"\n    filters = request.GET.dict()\n    cache_key = generate_cache_key('user_stats', **filters)\n    \n    # Try to get from cache\n    cached_result = cache.get(cache_key)\n    if cached_result is not None:\n        return Response(cached_result)\n    \n    # Calculate statistics\n    stats = calculate_user_statistics(filters)\n    \n    # Cache the result for 1 hour\n    cache.set(cache_key, stats, 3600)\n    \n    return Response(stats)\n",[1166,2170,2171,2176,2203,2227,2252,2273,2289,2305,2312,2319,2323,2328,2355,2374,2394,2412,2425,2465,2493,2513,2517,2522,2559,2591,2608,2635,2645,2649,2654,2683,2692,2701,2716,2742,2746,2777,2810,2841,2845,2861,2874,2883,2905,2932,2937,2943,2964,2985,3000,3005,3011,3028,3033,3039,3066,3071],{"__ignoreMap":1164},[1169,2172,2173],{"class":1171,"line":1172},[1169,2174,2175],{"class":1175},"# user_service/views.py\n",[1169,2177,2178,2180,2183,2185,2188,2190,2193,2195,2198,2200],{"class":1171,"line":1179},[1169,2179,1879],{"class":1182},[1169,2181,2182],{"class":1186}," django",[1169,2184,1269],{"class":1204},[1169,2186,2187],{"class":1186},"views",[1169,2189,1269],{"class":1204},[1169,2191,2192],{"class":1186},"decorators",[1169,2194,1269],{"class":1204},[1169,2196,2197],{"class":1186},"cache ",[1169,2199,1183],{"class":1182},[1169,2201,2202],{"class":1186}," cache_page\n",[1169,2204,2205,2207,2209,2211,2213,2215,2217,2219,2222,2224],{"class":1171,"line":1190},[1169,2206,1879],{"class":1182},[1169,2208,2182],{"class":1186},[1169,2210,1269],{"class":1204},[1169,2212,2187],{"class":1186},[1169,2214,1269],{"class":1204},[1169,2216,2192],{"class":1186},[1169,2218,1269],{"class":1204},[1169,2220,2221],{"class":1186},"vary ",[1169,2223,1183],{"class":1182},[1169,2225,2226],{"class":1186}," vary_on_headers\n",[1169,2228,2229,2231,2233,2235,2238,2240,2242,2244,2247,2249],{"class":1171,"line":1197},[1169,2230,1879],{"class":1182},[1169,2232,2182],{"class":1186},[1169,2234,1269],{"class":1204},[1169,2236,2237],{"class":1186},"core",[1169,2239,1269],{"class":1204},[1169,2241,2197],{"class":1186},[1169,2243,1183],{"class":1182},[1169,2245,2246],{"class":1186}," cache",[1169,2248,1286],{"class":1204},[1169,2250,2251],{"class":1186}," caches\n",[1169,2253,2254,2256,2258,2260,2263,2265,2268,2270],{"class":1171,"line":1211},[1169,2255,1879],{"class":1182},[1169,2257,2182],{"class":1186},[1169,2259,1269],{"class":1204},[1169,2261,2262],{"class":1186},"utils",[1169,2264,1269],{"class":1204},[1169,2266,2267],{"class":1186},"decorators ",[1169,2269,1183],{"class":1182},[1169,2271,2272],{"class":1186}," method_decorator\n",[1169,2274,2275,2277,2280,2282,2284,2286],{"class":1171,"line":1230},[1169,2276,1879],{"class":1182},[1169,2278,2279],{"class":1186}," rest_framework",[1169,2281,1269],{"class":1204},[1169,2283,2267],{"class":1186},[1169,2285,1183],{"class":1182},[1169,2287,2288],{"class":1186}," api_view\n",[1169,2290,2291,2293,2295,2297,2300,2302],{"class":1171,"line":1254},[1169,2292,1879],{"class":1182},[1169,2294,2279],{"class":1186},[1169,2296,1269],{"class":1204},[1169,2298,2299],{"class":1186},"response ",[1169,2301,1183],{"class":1182},[1169,2303,2304],{"class":1186}," Response\n",[1169,2306,2307,2309],{"class":1171,"line":1299},[1169,2308,1183],{"class":1182},[1169,2310,2311],{"class":1186}," hashlib\n",[1169,2313,2314,2316],{"class":1171,"line":1313},[1169,2315,1183],{"class":1182},[1169,2317,2318],{"class":1186}," json\n",[1169,2320,2321],{"class":1171,"line":1335},[1169,2322,1194],{"emptyLinePlaceholder":1193},[1169,2324,2325],{"class":1171,"line":1349},[1169,2326,2327],{"class":1175},"# Function-based view caching\n",[1169,2329,2330,2333,2337,2339,2342,2346,2349,2352],{"class":1171,"line":1368},[1169,2331,2332],{"class":1204},"@",[1169,2334,2336],{"class":2335},"sljsM","cache_page",[1169,2338,1276],{"class":1204},[1169,2340,2341],{"class":1362},"60",[1169,2343,2345],{"class":2344},"sVsLi"," *",[1169,2347,2348],{"class":1362}," 15",[1169,2350,2351],{"class":1204},")",[1169,2353,2354],{"class":1175},"  # Cache for 15 minutes\n",[1169,2356,2357,2359,2362,2364,2366,2369,2371],{"class":1171,"line":1386},[1169,2358,2332],{"class":1204},[1169,2360,2361],{"class":2335},"vary_on_headers",[1169,2363,1276],{"class":1204},[1169,2365,1222],{"class":1214},[1169,2367,2368],{"class":1218},"Authorization",[1169,2370,1222],{"class":1214},[1169,2372,2373],{"class":1204},")\n",[1169,2375,2376,2378,2381,2384,2386,2389,2391],{"class":1171,"line":1392},[1169,2377,2332],{"class":1204},[1169,2379,2380],{"class":2335},"api_view",[1169,2382,2383],{"class":1204},"([",[1169,2385,1222],{"class":1214},[1169,2387,2388],{"class":1218},"GET",[1169,2390,1222],{"class":1214},[1169,2392,2393],{"class":1204},"])\n",[1169,2395,2396,2400,2403,2405,2409],{"class":1171,"line":1413},[1169,2397,2399],{"class":2398},"s5Kfy","def",[1169,2401,2402],{"class":2335}," user_list",[1169,2404,1276],{"class":1204},[1169,2406,2408],{"class":2407},"sCyAa","request",[1169,2410,2411],{"class":1204},"):\n",[1169,2413,2414,2418,2422],{"class":1171,"line":1434},[1169,2415,2417],{"class":2416},"sm7ve","    \"\"\"",[1169,2419,2421],{"class":2420},"sVyVU","Cached user list endpoint",[1169,2423,2424],{"class":2416},"\"\"\"\n",[1169,2426,2427,2430,2433,2436,2438,2442,2444,2447,2449,2451,2454,2456,2459,2462],{"class":1171,"line":1440},[1169,2428,2429],{"class":1186},"    users ",[1169,2431,2432],{"class":1204},"=",[1169,2434,2435],{"class":1186}," User",[1169,2437,1269],{"class":1204},[1169,2439,2441],{"class":2440},"sBPpx","objects",[1169,2443,1269],{"class":1204},[1169,2445,2446],{"class":1272},"select_related",[1169,2448,1276],{"class":1204},[1169,2450,1222],{"class":1214},[1169,2452,2453],{"class":1218},"profile",[1169,2455,1222],{"class":1214},[1169,2457,2458],{"class":1204},").",[1169,2460,2461],{"class":1272},"all",[1169,2463,2464],{"class":1204},"()\n",[1169,2466,2467,2470,2472,2475,2477,2480,2482,2486,2488,2491],{"class":1171,"line":1461},[1169,2468,2469],{"class":1186},"    serializer ",[1169,2471,2432],{"class":1204},[1169,2473,2474],{"class":1272}," UserSerializer",[1169,2476,1276],{"class":1204},[1169,2478,2479],{"class":1272},"users",[1169,2481,1286],{"class":1204},[1169,2483,2485],{"class":2484},"sqOPj"," many",[1169,2487,2432],{"class":1204},[1169,2489,2490],{"class":1380},"True",[1169,2492,2373],{"class":1204},[1169,2494,2495,2498,2501,2503,2506,2508,2511],{"class":1171,"line":1478},[1169,2496,2497],{"class":1182},"    return",[1169,2499,2500],{"class":1272}," Response",[1169,2502,1276],{"class":1204},[1169,2504,2505],{"class":1272},"serializer",[1169,2507,1269],{"class":1204},[1169,2509,2510],{"class":2440},"data",[1169,2512,2373],{"class":1204},[1169,2514,2515],{"class":1171,"line":1498},[1169,2516,1194],{"emptyLinePlaceholder":1193},[1169,2518,2519],{"class":1171,"line":1504},[1169,2520,2521],{"class":1175},"# Class-based view caching\n",[1169,2523,2524,2526,2529,2531,2533,2535,2537,2539,2542,2545,2548,2550,2552,2555,2557],{"class":1171,"line":1518},[1169,2525,2332],{"class":1204},[1169,2527,2528],{"class":2335},"method_decorator",[1169,2530,1276],{"class":1204},[1169,2532,2336],{"class":1272},[1169,2534,1276],{"class":1204},[1169,2536,2341],{"class":1362},[1169,2538,2345],{"class":2344},[1169,2540,2541],{"class":1362}," 10",[1169,2543,2544],{"class":1204},"),",[1169,2546,2547],{"class":2484}," name",[1169,2549,2432],{"class":1204},[1169,2551,1222],{"class":1214},[1169,2553,2554],{"class":1218},"get",[1169,2556,1222],{"class":1214},[1169,2558,2373],{"class":1204},[1169,2560,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589],{"class":1171,"line":1537},[1169,2562,2332],{"class":1204},[1169,2564,2528],{"class":2335},[1169,2566,1276],{"class":1204},[1169,2568,2361],{"class":1272},[1169,2570,1276],{"class":1204},[1169,2572,1222],{"class":1214},[1169,2574,2368],{"class":1218},[1169,2576,1222],{"class":1214},[1169,2578,2544],{"class":1204},[1169,2580,2547],{"class":2484},[1169,2582,2432],{"class":1204},[1169,2584,1222],{"class":1214},[1169,2586,2554],{"class":1218},[1169,2588,1222],{"class":1214},[1169,2590,2373],{"class":1204},[1169,2592,2593,2596,2600,2602,2606],{"class":1171,"line":1573},[1169,2594,2595],{"class":2398},"class",[1169,2597,2599],{"class":2598},"sD-vU"," UserDetailView",[1169,2601,1276],{"class":1204},[1169,2603,2605],{"class":2604},"sYn-s","RetrieveAPIView",[1169,2607,2411],{"class":1204},[1169,2609,2610,2613,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633],{"class":1171,"line":1586},[1169,2611,2612],{"class":1186},"    queryset ",[1169,2614,2432],{"class":1204},[1169,2616,2435],{"class":1186},[1169,2618,1269],{"class":1204},[1169,2620,2441],{"class":2440},[1169,2622,1269],{"class":1204},[1169,2624,2446],{"class":1272},[1169,2626,1276],{"class":1204},[1169,2628,1222],{"class":1214},[1169,2630,2453],{"class":1218},[1169,2632,1222],{"class":1214},[1169,2634,2373],{"class":1204},[1169,2636,2637,2640,2642],{"class":1171,"line":1605},[1169,2638,2639],{"class":1186},"    serializer_class ",[1169,2641,2432],{"class":1204},[1169,2643,2644],{"class":1186}," UserDetailSerializer\n",[1169,2646,2647],{"class":1171,"line":1610},[1169,2648,1194],{"emptyLinePlaceholder":1193},[1169,2650,2651],{"class":1171,"line":1629},[1169,2652,2653],{"class":1175},"# Custom cache key generation\n",[1169,2655,2656,2658,2661,2663,2666,2668,2670,2673,2675,2678,2681],{"class":1171,"line":1648},[1169,2657,2399],{"class":2398},[1169,2659,2660],{"class":2335}," generate_cache_key",[1169,2662,1276],{"class":1204},[1169,2664,2665],{"class":2407},"prefix",[1169,2667,1286],{"class":1204},[1169,2669,2345],{"class":2344},[1169,2671,2672],{"class":2407},"args",[1169,2674,1286],{"class":1204},[1169,2676,2677],{"class":2344}," **",[1169,2679,2680],{"class":2407},"kwargs",[1169,2682,2411],{"class":1204},[1169,2684,2685,2687,2690],{"class":1171,"line":1653},[1169,2686,2417],{"class":2416},[1169,2688,2689],{"class":2420},"Generate consistent cache keys",[1169,2691,2424],{"class":2416},[1169,2693,2694,2697,2699],{"class":1171,"line":1667},[1169,2695,2696],{"class":1186},"    key_data ",[1169,2698,2432],{"class":1204},[1169,2700,1208],{"class":1204},[1169,2702,2703,2705,2707,2709,2711,2714],{"class":1171,"line":1686},[1169,2704,1233],{"class":1214},[1169,2706,2672],{"class":1218},[1169,2708,1222],{"class":1214},[1169,2710,1225],{"class":1204},[1169,2712,2713],{"class":1186}," args",[1169,2715,1251],{"class":1204},[1169,2717,2718,2720,2722,2724,2726,2730,2732,2734,2736,2739],{"class":1171,"line":1722},[1169,2719,1233],{"class":1214},[1169,2721,2680],{"class":1218},[1169,2723,1222],{"class":1214},[1169,2725,1225],{"class":1204},[1169,2727,2729],{"class":2728},"sJdAF"," sorted",[1169,2731,1276],{"class":1204},[1169,2733,2680],{"class":1272},[1169,2735,1269],{"class":1204},[1169,2737,2738],{"class":1272},"items",[1169,2740,2741],{"class":1204},"())\n",[1169,2743,2744],{"class":1171,"line":1735},[1169,2745,1801],{"class":1204},[1169,2747,2748,2751,2753,2756,2758,2761,2763,2766,2768,2771,2773,2775],{"class":1171,"line":1754},[1169,2749,2750],{"class":1186},"    key_string ",[1169,2752,2432],{"class":1204},[1169,2754,2755],{"class":1186}," json",[1169,2757,1269],{"class":1204},[1169,2759,2760],{"class":1272},"dumps",[1169,2762,1276],{"class":1204},[1169,2764,2765],{"class":1272},"key_data",[1169,2767,1286],{"class":1204},[1169,2769,2770],{"class":2484}," sort_keys",[1169,2772,2432],{"class":1204},[1169,2774,2490],{"class":1380},[1169,2776,2373],{"class":1204},[1169,2778,2779,2782,2784,2787,2789,2792,2794,2797,2799,2802,2805,2808],{"class":1171,"line":1759},[1169,2780,2781],{"class":1186},"    key_hash ",[1169,2783,2432],{"class":1204},[1169,2785,2786],{"class":1186}," hashlib",[1169,2788,1269],{"class":1204},[1169,2790,2791],{"class":1272},"md5",[1169,2793,1276],{"class":1204},[1169,2795,2796],{"class":1272},"key_string",[1169,2798,1269],{"class":1204},[1169,2800,2801],{"class":1272},"encode",[1169,2803,2804],{"class":1204},"()).",[1169,2806,2807],{"class":1272},"hexdigest",[1169,2809,2464],{"class":1204},[1169,2811,2812,2814,2817,2820,2824,2826,2829,2831,2833,2836,2838],{"class":1171,"line":1779},[1169,2813,2497],{"class":1182},[1169,2815,2816],{"class":2398}," f",[1169,2818,2819],{"class":1218},"\"",[1169,2821,2823],{"class":2822},"s3h35","{",[1169,2825,2665],{"class":1186},[1169,2827,2828],{"class":2822},"}",[1169,2830,1225],{"class":1218},[1169,2832,2823],{"class":2822},[1169,2834,2835],{"class":1186},"key_hash",[1169,2837,2828],{"class":2822},[1169,2839,2840],{"class":1218},"\"\n",[1169,2842,2843],{"class":1171,"line":1798},[1169,2844,1194],{"emptyLinePlaceholder":1193},[1169,2846,2847,2849,2851,2853,2855,2857,2859],{"class":1171,"line":1804},[1169,2848,2332],{"class":1204},[1169,2850,2380],{"class":2335},[1169,2852,2383],{"class":1204},[1169,2854,1222],{"class":1214},[1169,2856,2388],{"class":1218},[1169,2858,1222],{"class":1214},[1169,2860,2393],{"class":1204},[1169,2862,2863,2865,2868,2870,2872],{"class":1171,"line":1810},[1169,2864,2399],{"class":2398},[1169,2866,2867],{"class":2335}," user_statistics",[1169,2869,1276],{"class":1204},[1169,2871,2408],{"class":2407},[1169,2873,2411],{"class":1204},[1169,2875,2876,2878,2881],{"class":1171,"line":1815},[1169,2877,2417],{"class":2416},[1169,2879,2880],{"class":2420},"Custom caching with dynamic keys",[1169,2882,2424],{"class":2416},[1169,2884,2885,2888,2890,2893,2895,2898,2900,2903],{"class":1171,"line":1821},[1169,2886,2887],{"class":1186},"    filters ",[1169,2889,2432],{"class":1204},[1169,2891,2892],{"class":1186}," request",[1169,2894,1269],{"class":1204},[1169,2896,2388],{"class":2897},"sFGJz",[1169,2899,1269],{"class":1204},[1169,2901,2902],{"class":1272},"dict",[1169,2904,2464],{"class":1204},[1169,2906,2907,2910,2912,2914,2916,2918,2921,2923,2925,2927,2930],{"class":1171,"line":1837},[1169,2908,2909],{"class":1186},"    cache_key ",[1169,2911,2432],{"class":1204},[1169,2913,2660],{"class":1272},[1169,2915,1276],{"class":1204},[1169,2917,1222],{"class":1214},[1169,2919,2920],{"class":1218},"user_stats",[1169,2922,1222],{"class":1214},[1169,2924,1286],{"class":1204},[1169,2926,2677],{"class":2344},[1169,2928,2929],{"class":1272},"filters",[1169,2931,2373],{"class":1204},[1169,2933,2934],{"class":1171,"line":1851},[1169,2935,2936],{"class":1186},"    \n",[1169,2938,2940],{"class":1171,"line":2939},45,[1169,2941,2942],{"class":1175},"    # Try to get from cache\n",[1169,2944,2946,2949,2951,2953,2955,2957,2959,2962],{"class":1171,"line":2945},46,[1169,2947,2948],{"class":1186},"    cached_result ",[1169,2950,2432],{"class":1204},[1169,2952,2246],{"class":1186},[1169,2954,1269],{"class":1204},[1169,2956,2554],{"class":1272},[1169,2958,1276],{"class":1204},[1169,2960,2961],{"class":1272},"cache_key",[1169,2963,2373],{"class":1204},[1169,2965,2967,2970,2973,2976,2979,2982],{"class":1171,"line":2966},47,[1169,2968,2969],{"class":1182},"    if",[1169,2971,2972],{"class":1186}," cached_result ",[1169,2974,2975],{"class":2344},"is",[1169,2977,2978],{"class":2344}," not",[1169,2980,2981],{"class":1380}," None",[1169,2983,2984],{"class":1204},":\n",[1169,2986,2988,2991,2993,2995,2998],{"class":1171,"line":2987},48,[1169,2989,2990],{"class":1182},"        return",[1169,2992,2500],{"class":1272},[1169,2994,1276],{"class":1204},[1169,2996,2997],{"class":1272},"cached_result",[1169,2999,2373],{"class":1204},[1169,3001,3003],{"class":1171,"line":3002},49,[1169,3004,2936],{"class":1186},[1169,3006,3008],{"class":1171,"line":3007},50,[1169,3009,3010],{"class":1175},"    # Calculate statistics\n",[1169,3012,3014,3017,3019,3022,3024,3026],{"class":1171,"line":3013},51,[1169,3015,3016],{"class":1186},"    stats ",[1169,3018,2432],{"class":1204},[1169,3020,3021],{"class":1272}," calculate_user_statistics",[1169,3023,1276],{"class":1204},[1169,3025,2929],{"class":1272},[1169,3027,2373],{"class":1204},[1169,3029,3031],{"class":1171,"line":3030},52,[1169,3032,2936],{"class":1186},[1169,3034,3036],{"class":1171,"line":3035},53,[1169,3037,3038],{"class":1175},"    # Cache the result for 1 hour\n",[1169,3040,3042,3045,3047,3050,3052,3054,3056,3059,3061,3064],{"class":1171,"line":3041},54,[1169,3043,3044],{"class":1186},"    cache",[1169,3046,1269],{"class":1204},[1169,3048,3049],{"class":1272},"set",[1169,3051,1276],{"class":1204},[1169,3053,2961],{"class":1272},[1169,3055,1286],{"class":1204},[1169,3057,3058],{"class":1272}," stats",[1169,3060,1286],{"class":1204},[1169,3062,3063],{"class":1362}," 3600",[1169,3065,2373],{"class":1204},[1169,3067,3069],{"class":1171,"line":3068},55,[1169,3070,2936],{"class":1186},[1169,3072,3074,3076,3078,3080,3083],{"class":1171,"line":3073},56,[1169,3075,2497],{"class":1182},[1169,3077,2500],{"class":1272},[1169,3079,1276],{"class":1204},[1169,3081,3082],{"class":1272},"stats",[1169,3084,2373],{"class":1204},[1077,3086,695],{"id":3087},"template-fragment-caching",[1159,3089,3091],{"className":1161,"code":3090,"language":1163,"meta":1164,"style":1164},"# user_service/templatetags/cache_tags.py\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 cached_include(context, template_name, cache_timeout=300, **kwargs):\n    \"\"\"Cache template fragments with custom keys\"\"\"\n    # Generate cache key from template name and context\n    cache_key_data = {\n        'template': template_name,\n        'context': {k: str(v) for k, v in kwargs.items()},\n        'user_id': getattr(context.get('user'), 'id', 'anonymous')\n    }\n    \n    cache_key = hashlib.md5(\n        str(cache_key_data).encode()\n    ).hexdigest()\n    \n    # Try to get cached content\n    cached_content = cache.get(f\"template_fragment:{cache_key}\")\n    if cached_content is not None:\n        return cached_content\n    \n    # Render template\n    content = render_to_string(template_name, {**context.flatten(), **kwargs})\n    \n    # Cache the rendered content\n    cache.set(f\"template_fragment:{cache_key}\", content, cache_timeout)\n    \n    return content\n",[1166,3092,3093,3098,3110,3129,3150,3156,3160,3177,3181,3204,3239,3248,3253,3262,3276,3329,3380,3384,3388,3403,3419,3428,3432,3437,3468,3483,3490,3494,3499,3538,3542,3547,3580,3584],{"__ignoreMap":1164},[1169,3094,3095],{"class":1171,"line":1172},[1169,3096,3097],{"class":1175},"# user_service/templatetags/cache_tags.py\n",[1169,3099,3100,3102,3105,3107],{"class":1171,"line":1179},[1169,3101,1879],{"class":1182},[1169,3103,3104],{"class":1186}," django ",[1169,3106,1183],{"class":1182},[1169,3108,3109],{"class":1186}," template\n",[1169,3111,3112,3114,3116,3118,3120,3122,3124,3126],{"class":1171,"line":1190},[1169,3113,1879],{"class":1182},[1169,3115,2182],{"class":1186},[1169,3117,1269],{"class":1204},[1169,3119,2237],{"class":1186},[1169,3121,1269],{"class":1204},[1169,3123,2197],{"class":1186},[1169,3125,1183],{"class":1182},[1169,3127,3128],{"class":1186}," cache\n",[1169,3130,3131,3133,3135,3137,3140,3142,3145,3147],{"class":1171,"line":1197},[1169,3132,1879],{"class":1182},[1169,3134,2182],{"class":1186},[1169,3136,1269],{"class":1204},[1169,3138,3139],{"class":1186},"template",[1169,3141,1269],{"class":1204},[1169,3143,3144],{"class":1186},"loader ",[1169,3146,1183],{"class":1182},[1169,3148,3149],{"class":1186}," render_to_string\n",[1169,3151,3152,3154],{"class":1171,"line":1211},[1169,3153,1183],{"class":1182},[1169,3155,2311],{"class":1186},[1169,3157,3158],{"class":1171,"line":1230},[1169,3159,1194],{"emptyLinePlaceholder":1193},[1169,3161,3162,3165,3167,3170,3172,3175],{"class":1171,"line":1254},[1169,3163,3164],{"class":1186},"register ",[1169,3166,2432],{"class":1204},[1169,3168,3169],{"class":1186}," template",[1169,3171,1269],{"class":1204},[1169,3173,3174],{"class":1272},"Library",[1169,3176,2464],{"class":1204},[1169,3178,3179],{"class":1171,"line":1299},[1169,3180,1194],{"emptyLinePlaceholder":1193},[1169,3182,3183,3185,3188,3190,3193,3195,3198,3200,3202],{"class":1171,"line":1313},[1169,3184,2332],{"class":1204},[1169,3186,3187],{"class":2335},"register",[1169,3189,1269],{"class":1204},[1169,3191,3192],{"class":2335},"simple_tag",[1169,3194,1276],{"class":1204},[1169,3196,3197],{"class":2484},"takes_context",[1169,3199,2432],{"class":1204},[1169,3201,2490],{"class":1380},[1169,3203,2373],{"class":1204},[1169,3205,3206,3208,3211,3213,3216,3218,3221,3223,3226,3228,3231,3233,3235,3237],{"class":1171,"line":1335},[1169,3207,2399],{"class":2398},[1169,3209,3210],{"class":2335}," cached_include",[1169,3212,1276],{"class":1204},[1169,3214,3215],{"class":2407},"context",[1169,3217,1286],{"class":1204},[1169,3219,3220],{"class":2407}," template_name",[1169,3222,1286],{"class":1204},[1169,3224,3225],{"class":2407}," cache_timeout",[1169,3227,2432],{"class":2344},[1169,3229,3230],{"class":1362},"300",[1169,3232,1286],{"class":1204},[1169,3234,2677],{"class":2344},[1169,3236,2680],{"class":2407},[1169,3238,2411],{"class":1204},[1169,3240,3241,3243,3246],{"class":1171,"line":1349},[1169,3242,2417],{"class":2416},[1169,3244,3245],{"class":2420},"Cache template fragments with custom keys",[1169,3247,2424],{"class":2416},[1169,3249,3250],{"class":1171,"line":1368},[1169,3251,3252],{"class":1175},"    # Generate cache key from template name and context\n",[1169,3254,3255,3258,3260],{"class":1171,"line":1386},[1169,3256,3257],{"class":1186},"    cache_key_data ",[1169,3259,2432],{"class":1204},[1169,3261,1208],{"class":1204},[1169,3263,3264,3266,3268,3270,3272,3274],{"class":1171,"line":1392},[1169,3265,1233],{"class":1214},[1169,3267,3139],{"class":1218},[1169,3269,1222],{"class":1214},[1169,3271,1225],{"class":1204},[1169,3273,3220],{"class":1186},[1169,3275,1251],{"class":1204},[1169,3277,3278,3280,3282,3284,3286,3289,3292,3294,3298,3300,3303,3305,3308,3311,3313,3316,3319,3322,3324,3326],{"class":1171,"line":1413},[1169,3279,1233],{"class":1214},[1169,3281,3215],{"class":1218},[1169,3283,1222],{"class":1214},[1169,3285,1225],{"class":1204},[1169,3287,3288],{"class":1204}," {",[1169,3290,3291],{"class":1186},"k",[1169,3293,1225],{"class":1204},[1169,3295,3297],{"class":3296},"sa2tF"," str",[1169,3299,1276],{"class":1204},[1169,3301,3302],{"class":1272},"v",[1169,3304,2351],{"class":1204},[1169,3306,3307],{"class":1182}," for",[1169,3309,3310],{"class":1186}," k",[1169,3312,1286],{"class":1204},[1169,3314,3315],{"class":1186}," v ",[1169,3317,3318],{"class":1182},"in",[1169,3320,3321],{"class":1186}," kwargs",[1169,3323,1269],{"class":1204},[1169,3325,2738],{"class":1272},[1169,3327,3328],{"class":1204},"()},\n",[1169,3330,3331,3333,3336,3338,3340,3343,3345,3347,3349,3351,3353,3355,3358,3360,3362,3364,3367,3369,3371,3373,3376,3378],{"class":1171,"line":1434},[1169,3332,1233],{"class":1214},[1169,3334,3335],{"class":1218},"user_id",[1169,3337,1222],{"class":1214},[1169,3339,1225],{"class":1204},[1169,3341,3342],{"class":2728}," getattr",[1169,3344,1276],{"class":1204},[1169,3346,3215],{"class":1272},[1169,3348,1269],{"class":1204},[1169,3350,2554],{"class":1272},[1169,3352,1276],{"class":1204},[1169,3354,1222],{"class":1214},[1169,3356,3357],{"class":1218},"user",[1169,3359,1222],{"class":1214},[1169,3361,2544],{"class":1204},[1169,3363,1243],{"class":1214},[1169,3365,3366],{"class":1218},"id",[1169,3368,1222],{"class":1214},[1169,3370,1286],{"class":1204},[1169,3372,1243],{"class":1214},[1169,3374,3375],{"class":1218},"anonymous",[1169,3377,1222],{"class":1214},[1169,3379,2373],{"class":1204},[1169,3381,3382],{"class":1171,"line":1440},[1169,3383,1801],{"class":1204},[1169,3385,3386],{"class":1171,"line":1461},[1169,3387,2936],{"class":1186},[1169,3389,3390,3392,3394,3396,3398,3400],{"class":1171,"line":1478},[1169,3391,2909],{"class":1186},[1169,3393,2432],{"class":1204},[1169,3395,2786],{"class":1186},[1169,3397,1269],{"class":1204},[1169,3399,2791],{"class":1272},[1169,3401,3402],{"class":1204},"(\n",[1169,3404,3405,3408,3410,3413,3415,3417],{"class":1171,"line":1498},[1169,3406,3407],{"class":3296},"        str",[1169,3409,1276],{"class":1204},[1169,3411,3412],{"class":1272},"cache_key_data",[1169,3414,2458],{"class":1204},[1169,3416,2801],{"class":1272},[1169,3418,2464],{"class":1204},[1169,3420,3421,3424,3426],{"class":1171,"line":1504},[1169,3422,3423],{"class":1204},"    ).",[1169,3425,2807],{"class":1272},[1169,3427,2464],{"class":1204},[1169,3429,3430],{"class":1171,"line":1518},[1169,3431,2936],{"class":1186},[1169,3433,3434],{"class":1171,"line":1537},[1169,3435,3436],{"class":1175},"    # Try to get cached content\n",[1169,3438,3439,3442,3444,3446,3448,3450,3452,3455,3458,3460,3462,3464,3466],{"class":1171,"line":1573},[1169,3440,3441],{"class":1186},"    cached_content ",[1169,3443,2432],{"class":1204},[1169,3445,2246],{"class":1186},[1169,3447,1269],{"class":1204},[1169,3449,2554],{"class":1272},[1169,3451,1276],{"class":1204},[1169,3453,3454],{"class":2398},"f",[1169,3456,3457],{"class":1218},"\"template_fragment:",[1169,3459,2823],{"class":2822},[1169,3461,2961],{"class":1272},[1169,3463,2828],{"class":2822},[1169,3465,2819],{"class":1218},[1169,3467,2373],{"class":1204},[1169,3469,3470,3472,3475,3477,3479,3481],{"class":1171,"line":1586},[1169,3471,2969],{"class":1182},[1169,3473,3474],{"class":1186}," cached_content ",[1169,3476,2975],{"class":2344},[1169,3478,2978],{"class":2344},[1169,3480,2981],{"class":1380},[1169,3482,2984],{"class":1204},[1169,3484,3485,3487],{"class":1171,"line":1605},[1169,3486,2990],{"class":1182},[1169,3488,3489],{"class":1186}," cached_content\n",[1169,3491,3492],{"class":1171,"line":1610},[1169,3493,2936],{"class":1186},[1169,3495,3496],{"class":1171,"line":1629},[1169,3497,3498],{"class":1175},"    # Render template\n",[1169,3500,3501,3504,3506,3509,3511,3514,3516,3518,3521,3523,3525,3528,3531,3533,3535],{"class":1171,"line":1648},[1169,3502,3503],{"class":1186},"    content ",[1169,3505,2432],{"class":1204},[1169,3507,3508],{"class":1272}," render_to_string",[1169,3510,1276],{"class":1204},[1169,3512,3513],{"class":1272},"template_name",[1169,3515,1286],{"class":1204},[1169,3517,3288],{"class":1204},[1169,3519,3520],{"class":2344},"**",[1169,3522,3215],{"class":1272},[1169,3524,1269],{"class":1204},[1169,3526,3527],{"class":1272},"flatten",[1169,3529,3530],{"class":1204},"(),",[1169,3532,2677],{"class":2344},[1169,3534,2680],{"class":1272},[1169,3536,3537],{"class":1204},"})\n",[1169,3539,3540],{"class":1171,"line":1653},[1169,3541,2936],{"class":1186},[1169,3543,3544],{"class":1171,"line":1667},[1169,3545,3546],{"class":1175},"    # Cache the rendered content\n",[1169,3548,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3574,3576,3578],{"class":1171,"line":1686},[1169,3550,3044],{"class":1186},[1169,3552,1269],{"class":1204},[1169,3554,3049],{"class":1272},[1169,3556,1276],{"class":1204},[1169,3558,3454],{"class":2398},[1169,3560,3457],{"class":1218},[1169,3562,2823],{"class":2822},[1169,3564,2961],{"class":1272},[1169,3566,2828],{"class":2822},[1169,3568,2819],{"class":1218},[1169,3570,1286],{"class":1204},[1169,3572,3573],{"class":1272}," content",[1169,3575,1286],{"class":1204},[1169,3577,3225],{"class":1272},[1169,3579,2373],{"class":1204},[1169,3581,3582],{"class":1171,"line":1722},[1169,3583,2936],{"class":1186},[1169,3585,3586,3588],{"class":1171,"line":1735},[1169,3587,2497],{"class":1182},[1169,3589,3590],{"class":1186}," content\n",[1077,3592,3594],{"id":3593},"database-query-caching","Database Query Caching",[1159,3596,3598],{"className":1161,"code":3597,"language":1163,"meta":1164,"style":1164},"# user_service/managers.py\nfrom django.db import models\nfrom django.core.cache import cache\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\n\nclass CachedUserManager(models.Manager):\n    \"\"\"Manager with built-in caching\"\"\"\n    \n    def get_cached_user(self, user_id, timeout=1800):\n        \"\"\"Get user with caching\"\"\"\n        cache_key = f\"user:{user_id}\"\n        \n        # Try cache first\n        user = cache.get(cache_key)\n        if user is not None:\n            return user\n        \n        # Get from database\n        try:\n            user = self.select_related('profile').get(id=user_id)\n            cache.set(cache_key, user, timeout)\n            return user\n        except self.model.DoesNotExist:\n            # Cache negative results for shorter time\n            cache.set(cache_key, None, 60)\n            raise\n    \n    def get_user_list_cached(self, filters=None, timeout=600):\n        \"\"\"Get filtered user list with caching\"\"\"\n        filters = filters or {}\n        cache_key = f\"user_list:{hash(frozenset(filters.items()))}\"\n        \n        # Try cache first\n        users = cache.get(cache_key)\n        if users is not None:\n            return users\n        \n        # Query database\n        queryset = self.select_related('profile')\n        for field, value in filters.items():\n            queryset = queryset.filter(**{field: value})\n        \n        users = list(queryset.all())\n        cache.set(cache_key, users, timeout)\n        \n        return users\n\n# Cache invalidation signals\n@receiver([post_save, post_delete], sender='user_service.User')\ndef invalidate_user_cache(sender, instance, **kwargs):\n    \"\"\"Invalidate user-related caches on model changes\"\"\"\n    cache_keys = [\n        f\"user:{instance.id}\",\n        \"user_list:*\",  # Pattern for list caches\n        f\"user_stats:*\",  # Pattern for statistics caches\n    ]\n    \n    # Delete specific keys\n    for key in cache_keys:\n        if '*' in key:\n            # Delete pattern-based keys\n            cache.delete_many(cache.keys(key.replace('*', '*')))\n        else:\n            cache.delete(key)\n",[1166,3599,3600,3605,3621,3639,3670,3686,3690,3708,3717,3721,3752,3762,3782,3787,3792,3811,3827,3835,3839,3844,3851,3887,3911,3917,3936,3941,3964,3969,3973,4005,4014,4030,4066,4070,4074,4093,4108,4115,4119,4124,4147,4171,4202,4206,4226,4250,4254,4260,4264,4269,4303,4328,4337,4346,4368,4383,4395,4401,4406,4412,4428,4448,4454,4503,4511],{"__ignoreMap":1164},[1169,3601,3602],{"class":1171,"line":1172},[1169,3603,3604],{"class":1175},"# user_service/managers.py\n",[1169,3606,3607,3609,3611,3613,3616,3618],{"class":1171,"line":1179},[1169,3608,1879],{"class":1182},[1169,3610,2182],{"class":1186},[1169,3612,1269],{"class":1204},[1169,3614,3615],{"class":1186},"db ",[1169,3617,1183],{"class":1182},[1169,3619,3620],{"class":1186}," models\n",[1169,3622,3623,3625,3627,3629,3631,3633,3635,3637],{"class":1171,"line":1190},[1169,3624,1879],{"class":1182},[1169,3626,2182],{"class":1186},[1169,3628,1269],{"class":1204},[1169,3630,2237],{"class":1186},[1169,3632,1269],{"class":1204},[1169,3634,2197],{"class":1186},[1169,3636,1183],{"class":1182},[1169,3638,3128],{"class":1186},[1169,3640,3641,3643,3645,3647,3650,3652,3655,3657,3660,3662,3665,3667],{"class":1171,"line":1197},[1169,3642,1879],{"class":1182},[1169,3644,2182],{"class":1186},[1169,3646,1269],{"class":1204},[1169,3648,3649],{"class":1186},"db",[1169,3651,1269],{"class":1204},[1169,3653,3654],{"class":1186},"models",[1169,3656,1269],{"class":1204},[1169,3658,3659],{"class":1186},"signals ",[1169,3661,1183],{"class":1182},[1169,3663,3664],{"class":1186}," post_save",[1169,3666,1286],{"class":1204},[1169,3668,3669],{"class":1186}," post_delete\n",[1169,3671,3672,3674,3676,3678,3681,3683],{"class":1171,"line":1211},[1169,3673,1879],{"class":1182},[1169,3675,2182],{"class":1186},[1169,3677,1269],{"class":1204},[1169,3679,3680],{"class":1186},"dispatch ",[1169,3682,1183],{"class":1182},[1169,3684,3685],{"class":1186}," receiver\n",[1169,3687,3688],{"class":1171,"line":1230},[1169,3689,1194],{"emptyLinePlaceholder":1193},[1169,3691,3692,3694,3697,3699,3701,3703,3706],{"class":1171,"line":1254},[1169,3693,2595],{"class":2398},[1169,3695,3696],{"class":2598}," CachedUserManager",[1169,3698,1276],{"class":1204},[1169,3700,3654],{"class":2604},[1169,3702,1269],{"class":1204},[1169,3704,3705],{"class":2604},"Manager",[1169,3707,2411],{"class":1204},[1169,3709,3710,3712,3715],{"class":1171,"line":1299},[1169,3711,2417],{"class":2416},[1169,3713,3714],{"class":2420},"Manager with built-in caching",[1169,3716,2424],{"class":2416},[1169,3718,3719],{"class":1171,"line":1313},[1169,3720,2936],{"class":1186},[1169,3722,3723,3726,3729,3731,3735,3737,3740,3742,3745,3747,3750],{"class":1171,"line":1335},[1169,3724,3725],{"class":2398},"    def",[1169,3727,3728],{"class":2335}," get_cached_user",[1169,3730,1276],{"class":1204},[1169,3732,3734],{"class":3733},"sRjD_","self",[1169,3736,1286],{"class":1204},[1169,3738,3739],{"class":2407}," user_id",[1169,3741,1286],{"class":1204},[1169,3743,3744],{"class":2407}," timeout",[1169,3746,2432],{"class":2344},[1169,3748,3749],{"class":1362},"1800",[1169,3751,2411],{"class":1204},[1169,3753,3754,3757,3760],{"class":1171,"line":1349},[1169,3755,3756],{"class":2416},"        \"\"\"",[1169,3758,3759],{"class":2420},"Get user with caching",[1169,3761,2424],{"class":2416},[1169,3763,3764,3767,3769,3771,3774,3776,3778,3780],{"class":1171,"line":1368},[1169,3765,3766],{"class":1186},"        cache_key ",[1169,3768,2432],{"class":1204},[1169,3770,2816],{"class":2398},[1169,3772,3773],{"class":1218},"\"user:",[1169,3775,2823],{"class":2822},[1169,3777,3335],{"class":1186},[1169,3779,2828],{"class":2822},[1169,3781,2840],{"class":1218},[1169,3783,3784],{"class":1171,"line":1386},[1169,3785,3786],{"class":1186},"        \n",[1169,3788,3789],{"class":1171,"line":1392},[1169,3790,3791],{"class":1175},"        # Try cache first\n",[1169,3793,3794,3797,3799,3801,3803,3805,3807,3809],{"class":1171,"line":1413},[1169,3795,3796],{"class":1186},"        user ",[1169,3798,2432],{"class":1204},[1169,3800,2246],{"class":1186},[1169,3802,1269],{"class":1204},[1169,3804,2554],{"class":1272},[1169,3806,1276],{"class":1204},[1169,3808,2961],{"class":1272},[1169,3810,2373],{"class":1204},[1169,3812,3813,3816,3819,3821,3823,3825],{"class":1171,"line":1434},[1169,3814,3815],{"class":1182},"        if",[1169,3817,3818],{"class":1186}," user ",[1169,3820,2975],{"class":2344},[1169,3822,2978],{"class":2344},[1169,3824,2981],{"class":1380},[1169,3826,2984],{"class":1204},[1169,3828,3829,3832],{"class":1171,"line":1440},[1169,3830,3831],{"class":1182},"            return",[1169,3833,3834],{"class":1186}," user\n",[1169,3836,3837],{"class":1171,"line":1461},[1169,3838,3786],{"class":1186},[1169,3840,3841],{"class":1171,"line":1478},[1169,3842,3843],{"class":1175},"        # Get from database\n",[1169,3845,3846,3849],{"class":1171,"line":1498},[1169,3847,3848],{"class":1182},"        try",[1169,3850,2984],{"class":1204},[1169,3852,3853,3856,3858,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885],{"class":1171,"line":1504},[1169,3854,3855],{"class":1186},"            user ",[1169,3857,2432],{"class":1204},[1169,3859,3860],{"class":1200}," self",[1169,3862,1269],{"class":1204},[1169,3864,2446],{"class":1272},[1169,3866,1276],{"class":1204},[1169,3868,1222],{"class":1214},[1169,3870,2453],{"class":1218},[1169,3872,1222],{"class":1214},[1169,3874,2458],{"class":1204},[1169,3876,2554],{"class":1272},[1169,3878,1276],{"class":1204},[1169,3880,3366],{"class":2484},[1169,3882,2432],{"class":1204},[1169,3884,3335],{"class":1272},[1169,3886,2373],{"class":1204},[1169,3888,3889,3892,3894,3896,3898,3900,3902,3905,3907,3909],{"class":1171,"line":1518},[1169,3890,3891],{"class":1186},"            cache",[1169,3893,1269],{"class":1204},[1169,3895,3049],{"class":1272},[1169,3897,1276],{"class":1204},[1169,3899,2961],{"class":1272},[1169,3901,1286],{"class":1204},[1169,3903,3904],{"class":1272}," user",[1169,3906,1286],{"class":1204},[1169,3908,3744],{"class":1272},[1169,3910,2373],{"class":1204},[1169,3912,3913,3915],{"class":1171,"line":1537},[1169,3914,3831],{"class":1182},[1169,3916,3834],{"class":1186},[1169,3918,3919,3922,3924,3926,3929,3931,3934],{"class":1171,"line":1573},[1169,3920,3921],{"class":1182},"        except",[1169,3923,3860],{"class":1200},[1169,3925,1269],{"class":1204},[1169,3927,3928],{"class":2440},"model",[1169,3930,1269],{"class":1204},[1169,3932,3933],{"class":2440},"DoesNotExist",[1169,3935,2984],{"class":1204},[1169,3937,3938],{"class":1171,"line":1586},[1169,3939,3940],{"class":1175},"            # Cache negative results for shorter time\n",[1169,3942,3943,3945,3947,3949,3951,3953,3955,3957,3959,3962],{"class":1171,"line":1605},[1169,3944,3891],{"class":1186},[1169,3946,1269],{"class":1204},[1169,3948,3049],{"class":1272},[1169,3950,1276],{"class":1204},[1169,3952,2961],{"class":1272},[1169,3954,1286],{"class":1204},[1169,3956,2981],{"class":1380},[1169,3958,1286],{"class":1204},[1169,3960,3961],{"class":1362}," 60",[1169,3963,2373],{"class":1204},[1169,3965,3966],{"class":1171,"line":1610},[1169,3967,3968],{"class":1182},"            raise\n",[1169,3970,3971],{"class":1171,"line":1629},[1169,3972,2936],{"class":1186},[1169,3974,3975,3977,3980,3982,3984,3986,3989,3991,3994,3996,3998,4000,4003],{"class":1171,"line":1648},[1169,3976,3725],{"class":2398},[1169,3978,3979],{"class":2335}," get_user_list_cached",[1169,3981,1276],{"class":1204},[1169,3983,3734],{"class":3733},[1169,3985,1286],{"class":1204},[1169,3987,3988],{"class":2407}," filters",[1169,3990,2432],{"class":2344},[1169,3992,3993],{"class":1380},"None",[1169,3995,1286],{"class":1204},[1169,3997,3744],{"class":2407},[1169,3999,2432],{"class":2344},[1169,4001,4002],{"class":1362},"600",[1169,4004,2411],{"class":1204},[1169,4006,4007,4009,4012],{"class":1171,"line":1653},[1169,4008,3756],{"class":2416},[1169,4010,4011],{"class":2420},"Get filtered user list with caching",[1169,4013,2424],{"class":2416},[1169,4015,4016,4019,4021,4024,4027],{"class":1171,"line":1667},[1169,4017,4018],{"class":1186},"        filters ",[1169,4020,2432],{"class":1204},[1169,4022,4023],{"class":1186}," filters ",[1169,4025,4026],{"class":2344},"or",[1169,4028,4029],{"class":1204}," {}\n",[1169,4031,4032,4034,4036,4038,4041,4043,4046,4048,4051,4053,4055,4057,4059,4062,4064],{"class":1171,"line":1686},[1169,4033,3766],{"class":1186},[1169,4035,2432],{"class":1204},[1169,4037,2816],{"class":2398},[1169,4039,4040],{"class":1218},"\"user_list:",[1169,4042,2823],{"class":2822},[1169,4044,4045],{"class":2728},"hash",[1169,4047,1276],{"class":1204},[1169,4049,4050],{"class":3296},"frozenset",[1169,4052,1276],{"class":1204},[1169,4054,2929],{"class":1272},[1169,4056,1269],{"class":1204},[1169,4058,2738],{"class":1272},[1169,4060,4061],{"class":1204},"()))",[1169,4063,2828],{"class":2822},[1169,4065,2840],{"class":1218},[1169,4067,4068],{"class":1171,"line":1722},[1169,4069,3786],{"class":1186},[1169,4071,4072],{"class":1171,"line":1735},[1169,4073,3791],{"class":1175},[1169,4075,4076,4079,4081,4083,4085,4087,4089,4091],{"class":1171,"line":1754},[1169,4077,4078],{"class":1186},"        users ",[1169,4080,2432],{"class":1204},[1169,4082,2246],{"class":1186},[1169,4084,1269],{"class":1204},[1169,4086,2554],{"class":1272},[1169,4088,1276],{"class":1204},[1169,4090,2961],{"class":1272},[1169,4092,2373],{"class":1204},[1169,4094,4095,4097,4100,4102,4104,4106],{"class":1171,"line":1759},[1169,4096,3815],{"class":1182},[1169,4098,4099],{"class":1186}," users ",[1169,4101,2975],{"class":2344},[1169,4103,2978],{"class":2344},[1169,4105,2981],{"class":1380},[1169,4107,2984],{"class":1204},[1169,4109,4110,4112],{"class":1171,"line":1779},[1169,4111,3831],{"class":1182},[1169,4113,4114],{"class":1186}," users\n",[1169,4116,4117],{"class":1171,"line":1798},[1169,4118,3786],{"class":1186},[1169,4120,4121],{"class":1171,"line":1804},[1169,4122,4123],{"class":1175},"        # Query database\n",[1169,4125,4126,4129,4131,4133,4135,4137,4139,4141,4143,4145],{"class":1171,"line":1810},[1169,4127,4128],{"class":1186},"        queryset ",[1169,4130,2432],{"class":1204},[1169,4132,3860],{"class":1200},[1169,4134,1269],{"class":1204},[1169,4136,2446],{"class":1272},[1169,4138,1276],{"class":1204},[1169,4140,1222],{"class":1214},[1169,4142,2453],{"class":1218},[1169,4144,1222],{"class":1214},[1169,4146,2373],{"class":1204},[1169,4148,4149,4152,4155,4157,4160,4162,4164,4166,4168],{"class":1171,"line":1815},[1169,4150,4151],{"class":1182},"        for",[1169,4153,4154],{"class":1186}," field",[1169,4156,1286],{"class":1204},[1169,4158,4159],{"class":1186}," value ",[1169,4161,3318],{"class":1182},[1169,4163,3988],{"class":1186},[1169,4165,1269],{"class":1204},[1169,4167,2738],{"class":1272},[1169,4169,4170],{"class":1204},"():\n",[1169,4172,4173,4176,4178,4181,4183,4186,4188,4190,4192,4195,4197,4200],{"class":1171,"line":1821},[1169,4174,4175],{"class":1186},"            queryset ",[1169,4177,2432],{"class":1204},[1169,4179,4180],{"class":1186}," queryset",[1169,4182,1269],{"class":1204},[1169,4184,4185],{"class":1272},"filter",[1169,4187,1276],{"class":1204},[1169,4189,3520],{"class":2344},[1169,4191,2823],{"class":1204},[1169,4193,4194],{"class":1272},"field",[1169,4196,1225],{"class":1204},[1169,4198,4199],{"class":1272}," value",[1169,4201,3537],{"class":1204},[1169,4203,4204],{"class":1171,"line":1837},[1169,4205,3786],{"class":1186},[1169,4207,4208,4210,4212,4215,4217,4220,4222,4224],{"class":1171,"line":1851},[1169,4209,4078],{"class":1186},[1169,4211,2432],{"class":1204},[1169,4213,4214],{"class":3296}," list",[1169,4216,1276],{"class":1204},[1169,4218,4219],{"class":1272},"queryset",[1169,4221,1269],{"class":1204},[1169,4223,2461],{"class":1272},[1169,4225,2741],{"class":1204},[1169,4227,4228,4231,4233,4235,4237,4239,4241,4244,4246,4248],{"class":1171,"line":2939},[1169,4229,4230],{"class":1186},"        cache",[1169,4232,1269],{"class":1204},[1169,4234,3049],{"class":1272},[1169,4236,1276],{"class":1204},[1169,4238,2961],{"class":1272},[1169,4240,1286],{"class":1204},[1169,4242,4243],{"class":1272}," users",[1169,4245,1286],{"class":1204},[1169,4247,3744],{"class":1272},[1169,4249,2373],{"class":1204},[1169,4251,4252],{"class":1171,"line":2945},[1169,4253,3786],{"class":1186},[1169,4255,4256,4258],{"class":1171,"line":2966},[1169,4257,2990],{"class":1182},[1169,4259,4114],{"class":1186},[1169,4261,4262],{"class":1171,"line":2987},[1169,4263,1194],{"emptyLinePlaceholder":1193},[1169,4265,4266],{"class":1171,"line":3002},[1169,4267,4268],{"class":1175},"# Cache invalidation signals\n",[1169,4270,4271,4273,4276,4278,4281,4283,4286,4289,4292,4294,4296,4299,4301],{"class":1171,"line":3007},[1169,4272,2332],{"class":1204},[1169,4274,4275],{"class":2335},"receiver",[1169,4277,2383],{"class":1204},[1169,4279,4280],{"class":1272},"post_save",[1169,4282,1286],{"class":1204},[1169,4284,4285],{"class":1272}," post_delete",[1169,4287,4288],{"class":1204},"],",[1169,4290,4291],{"class":2484}," sender",[1169,4293,2432],{"class":1204},[1169,4295,1222],{"class":1214},[1169,4297,4298],{"class":1218},"user_service.User",[1169,4300,1222],{"class":1214},[1169,4302,2373],{"class":1204},[1169,4304,4305,4307,4310,4312,4315,4317,4320,4322,4324,4326],{"class":1171,"line":3013},[1169,4306,2399],{"class":2398},[1169,4308,4309],{"class":2335}," invalidate_user_cache",[1169,4311,1276],{"class":1204},[1169,4313,4314],{"class":2407},"sender",[1169,4316,1286],{"class":1204},[1169,4318,4319],{"class":2407}," instance",[1169,4321,1286],{"class":1204},[1169,4323,2677],{"class":2344},[1169,4325,2680],{"class":2407},[1169,4327,2411],{"class":1204},[1169,4329,4330,4332,4335],{"class":1171,"line":3030},[1169,4331,2417],{"class":2416},[1169,4333,4334],{"class":2420},"Invalidate user-related caches on model changes",[1169,4336,2424],{"class":2416},[1169,4338,4339,4342,4344],{"class":1171,"line":3035},[1169,4340,4341],{"class":1186},"    cache_keys ",[1169,4343,2432],{"class":1204},[1169,4345,2069],{"class":1204},[1169,4347,4348,4351,4353,4355,4358,4360,4362,4364,4366],{"class":1171,"line":3041},[1169,4349,4350],{"class":2398},"        f",[1169,4352,3773],{"class":1218},[1169,4354,2823],{"class":2822},[1169,4356,4357],{"class":1186},"instance",[1169,4359,1269],{"class":1204},[1169,4361,3366],{"class":2440},[1169,4363,2828],{"class":2822},[1169,4365,2819],{"class":1218},[1169,4367,1251],{"class":1204},[1169,4369,4370,4373,4376,4378,4380],{"class":1171,"line":3068},[1169,4371,4372],{"class":1214},"        \"",[1169,4374,4375],{"class":1218},"user_list:*",[1169,4377,2819],{"class":1214},[1169,4379,1286],{"class":1204},[1169,4381,4382],{"class":1175},"  # Pattern for list caches\n",[1169,4384,4385,4387,4390,4392],{"class":1171,"line":3073},[1169,4386,4350],{"class":2398},[1169,4388,4389],{"class":1218},"\"user_stats:*\"",[1169,4391,1286],{"class":1204},[1169,4393,4394],{"class":1175},"  # Pattern for statistics caches\n",[1169,4396,4398],{"class":1171,"line":4397},57,[1169,4399,4400],{"class":1204},"    ]\n",[1169,4402,4404],{"class":1171,"line":4403},58,[1169,4405,2936],{"class":1186},[1169,4407,4409],{"class":1171,"line":4408},59,[1169,4410,4411],{"class":1175},"    # Delete specific keys\n",[1169,4413,4415,4418,4421,4423,4426],{"class":1171,"line":4414},60,[1169,4416,4417],{"class":1182},"    for",[1169,4419,4420],{"class":1186}," key ",[1169,4422,3318],{"class":1182},[1169,4424,4425],{"class":1186}," cache_keys",[1169,4427,2984],{"class":1204},[1169,4429,4431,4433,4435,4438,4440,4443,4446],{"class":1171,"line":4430},61,[1169,4432,3815],{"class":1182},[1169,4434,1243],{"class":1214},[1169,4436,4437],{"class":1218},"*",[1169,4439,1222],{"class":1214},[1169,4441,4442],{"class":2344}," in",[1169,4444,4445],{"class":1186}," key",[1169,4447,2984],{"class":1204},[1169,4449,4451],{"class":1171,"line":4450},62,[1169,4452,4453],{"class":1175},"            # Delete pattern-based keys\n",[1169,4455,4457,4459,4461,4464,4466,4469,4471,4474,4476,4479,4481,4484,4486,4488,4490,4492,4494,4496,4498,4500],{"class":1171,"line":4456},63,[1169,4458,3891],{"class":1186},[1169,4460,1269],{"class":1204},[1169,4462,4463],{"class":1272},"delete_many",[1169,4465,1276],{"class":1204},[1169,4467,4468],{"class":1272},"cache",[1169,4470,1269],{"class":1204},[1169,4472,4473],{"class":1272},"keys",[1169,4475,1276],{"class":1204},[1169,4477,4478],{"class":1272},"key",[1169,4480,1269],{"class":1204},[1169,4482,4483],{"class":1272},"replace",[1169,4485,1276],{"class":1204},[1169,4487,1222],{"class":1214},[1169,4489,4437],{"class":1218},[1169,4491,1222],{"class":1214},[1169,4493,1286],{"class":1204},[1169,4495,1243],{"class":1214},[1169,4497,4437],{"class":1218},[1169,4499,1222],{"class":1214},[1169,4501,4502],{"class":1204},")))\n",[1169,4504,4506,4509],{"class":1171,"line":4505},64,[1169,4507,4508],{"class":1182},"        else",[1169,4510,2984],{"class":1204},[1169,4512,4514,4516,4518,4521,4523,4525],{"class":1171,"line":4513},65,[1169,4515,3891],{"class":1186},[1169,4517,1269],{"class":1204},[1169,4519,4520],{"class":1272},"delete",[1169,4522,1276],{"class":1204},[1169,4524,4478],{"class":1272},[1169,4526,2373],{"class":1204},[1030,4528,4530],{"id":4529},"distributed-caching-strategies","Distributed Caching Strategies",[1077,4532,4534],{"id":4533},"multi-level-caching","Multi-Level Caching",[1159,4536,4538],{"className":1161,"code":4537,"language":1163,"meta":1164,"style":1164},"# shared/cache_layers.py\nfrom django.core.cache import caches\nimport logging\nimport pickle\nimport time\n\nlogger = logging.getLogger(__name__)\n\nclass MultiLevelCache:\n    \"\"\"Multi-level caching with L1 (local) and L2 (distributed) cache\"\"\"\n    \n    def __init__(self, l1_cache='default', l2_cache='api_cache'):\n        self.l1_cache = caches[l1_cache]\n        self.l2_cache = caches[l2_cache]\n        self.l1_timeout = 300  # 5 minutes\n        self.l2_timeout = 1800  # 30 minutes\n    \n    def get(self, key):\n        \"\"\"Get value from multi-level cache\"\"\"\n        # Try L1 cache first (fastest)\n        value = self.l1_cache.get(key)\n        if value is not None:\n            logger.debug(f\"Cache hit L1: {key}\")\n            return value\n        \n        # Try L2 cache\n        value = self.l2_cache.get(key)\n        if value is not None:\n            logger.debug(f\"Cache hit L2: {key}\")\n            # Populate L1 cache\n            self.l1_cache.set(key, value, self.l1_timeout)\n            return value\n        \n        logger.debug(f\"Cache miss: {key}\")\n        return None\n    \n    def set(self, key, value, timeout=None):\n        \"\"\"Set value in both cache levels\"\"\"\n        l1_timeout = min(timeout or self.l1_timeout, self.l1_timeout)\n        l2_timeout = timeout or self.l2_timeout\n        \n        self.l1_cache.set(key, value, l1_timeout)\n        self.l2_cache.set(key, value, l2_timeout)\n    \n    def delete(self, key):\n        \"\"\"Delete from both cache levels\"\"\"\n        self.l1_cache.delete(key)\n        self.l2_cache.delete(key)\n\n# Usage in services\nmulti_cache = MultiLevelCache()\n\ndef get_user_profile(user_id):\n    \"\"\"Get user profile with multi-level caching\"\"\"\n    cache_key = f\"user_profile:{user_id}\"\n    \n    # Try cache first\n    profile = multi_cache.get(cache_key)\n    if profile is not None:\n        return profile\n    \n    # Get from database\n    try:\n        user = User.objects.select_related('profile').get(id=user_id)\n        profile_data = {\n            'id': user.id,\n            'username': user.username,\n            'email': user.email,\n            'profile': {\n                'bio': user.profile.bio,\n                'avatar_url': user.profile.avatar_url,\n            }\n        }\n        \n        # Cache for 30 minutes\n        multi_cache.set(cache_key, profile_data, 1800)\n        return profile_data\n        \n    except User.DoesNotExist:\n        return None\n",[1166,4539,4540,4545,4563,4570,4577,4584,4588,4611,4615,4624,4633,4637,4676,4697,4716,4732,4747,4751,4768,4777,4782,4805,4819,4846,4853,4857,4862,4884,4898,4923,4928,4959,4965,4969,4995,5002,5006,5035,5044,5077,5096,5100,5127,5154,5158,5175,5184,5202,5220,5224,5229,5240,5244,5257,5266,5285,5289,5294,5314,5329,5336,5340,5345,5352,5390,5399,5418,5438,5458,5471,5495,5519,5525,5531,5536,5542,5567,5575,5580,5594],{"__ignoreMap":1164},[1169,4541,4542],{"class":1171,"line":1172},[1169,4543,4544],{"class":1175},"# shared/cache_layers.py\n",[1169,4546,4547,4549,4551,4553,4555,4557,4559,4561],{"class":1171,"line":1179},[1169,4548,1879],{"class":1182},[1169,4550,2182],{"class":1186},[1169,4552,1269],{"class":1204},[1169,4554,2237],{"class":1186},[1169,4556,1269],{"class":1204},[1169,4558,2197],{"class":1186},[1169,4560,1183],{"class":1182},[1169,4562,2251],{"class":1186},[1169,4564,4565,4567],{"class":1171,"line":1190},[1169,4566,1183],{"class":1182},[1169,4568,4569],{"class":1186}," logging\n",[1169,4571,4572,4574],{"class":1171,"line":1197},[1169,4573,1183],{"class":1182},[1169,4575,4576],{"class":1186}," pickle\n",[1169,4578,4579,4581],{"class":1171,"line":1211},[1169,4580,1183],{"class":1182},[1169,4582,4583],{"class":1186}," time\n",[1169,4585,4586],{"class":1171,"line":1230},[1169,4587,1194],{"emptyLinePlaceholder":1193},[1169,4589,4590,4593,4595,4598,4600,4603,4605,4609],{"class":1171,"line":1254},[1169,4591,4592],{"class":1186},"logger ",[1169,4594,2432],{"class":1204},[1169,4596,4597],{"class":1186}," logging",[1169,4599,1269],{"class":1204},[1169,4601,4602],{"class":1272},"getLogger",[1169,4604,1276],{"class":1204},[1169,4606,4608],{"class":4607},"s131V","__name__",[1169,4610,2373],{"class":1204},[1169,4612,4613],{"class":1171,"line":1299},[1169,4614,1194],{"emptyLinePlaceholder":1193},[1169,4616,4617,4619,4622],{"class":1171,"line":1313},[1169,4618,2595],{"class":2398},[1169,4620,4621],{"class":2598}," MultiLevelCache",[1169,4623,2984],{"class":1204},[1169,4625,4626,4628,4631],{"class":1171,"line":1335},[1169,4627,2417],{"class":2416},[1169,4629,4630],{"class":2420},"Multi-level caching with L1 (local) and L2 (distributed) cache",[1169,4632,2424],{"class":2416},[1169,4634,4635],{"class":1171,"line":1349},[1169,4636,2936],{"class":1186},[1169,4638,4639,4641,4644,4646,4648,4650,4653,4655,4657,4659,4661,4663,4666,4668,4670,4672,4674],{"class":1171,"line":1368},[1169,4640,3725],{"class":2398},[1169,4642,4643],{"class":2728}," __init__",[1169,4645,1276],{"class":1204},[1169,4647,3734],{"class":3733},[1169,4649,1286],{"class":1204},[1169,4651,4652],{"class":2407}," l1_cache",[1169,4654,2432],{"class":2344},[1169,4656,1222],{"class":1214},[1169,4658,1219],{"class":1218},[1169,4660,1222],{"class":1214},[1169,4662,1286],{"class":1204},[1169,4664,4665],{"class":2407}," l2_cache",[1169,4667,2432],{"class":2344},[1169,4669,1222],{"class":1214},[1169,4671,1658],{"class":1218},[1169,4673,1222],{"class":1214},[1169,4675,2411],{"class":1204},[1169,4677,4678,4681,4683,4686,4688,4691,4693,4695],{"class":1171,"line":1386},[1169,4679,4680],{"class":1200},"        self",[1169,4682,1269],{"class":1204},[1169,4684,4685],{"class":2440},"l1_cache",[1169,4687,1205],{"class":1204},[1169,4689,4690],{"class":1186}," caches",[1169,4692,1908],{"class":1204},[1169,4694,4685],{"class":1186},[1169,4696,2112],{"class":1204},[1169,4698,4699,4701,4703,4706,4708,4710,4712,4714],{"class":1171,"line":1392},[1169,4700,4680],{"class":1200},[1169,4702,1269],{"class":1204},[1169,4704,4705],{"class":2440},"l2_cache",[1169,4707,1205],{"class":1204},[1169,4709,4690],{"class":1186},[1169,4711,1908],{"class":1204},[1169,4713,4705],{"class":1186},[1169,4715,2112],{"class":1204},[1169,4717,4718,4720,4722,4725,4727,4729],{"class":1171,"line":1413},[1169,4719,4680],{"class":1200},[1169,4721,1269],{"class":1204},[1169,4723,4724],{"class":2440},"l1_timeout",[1169,4726,1205],{"class":1204},[1169,4728,1490],{"class":1362},[1169,4730,4731],{"class":1175},"  # 5 minutes\n",[1169,4733,4734,4736,4738,4741,4743,4745],{"class":1171,"line":1434},[1169,4735,4680],{"class":1200},[1169,4737,1269],{"class":1204},[1169,4739,4740],{"class":2440},"l2_timeout",[1169,4742,1205],{"class":1204},[1169,4744,2041],{"class":1362},[1169,4746,2046],{"class":1175},[1169,4748,4749],{"class":1171,"line":1440},[1169,4750,2936],{"class":1186},[1169,4752,4753,4755,4758,4760,4762,4764,4766],{"class":1171,"line":1461},[1169,4754,3725],{"class":2398},[1169,4756,4757],{"class":2335}," get",[1169,4759,1276],{"class":1204},[1169,4761,3734],{"class":3733},[1169,4763,1286],{"class":1204},[1169,4765,4445],{"class":2407},[1169,4767,2411],{"class":1204},[1169,4769,4770,4772,4775],{"class":1171,"line":1478},[1169,4771,3756],{"class":2416},[1169,4773,4774],{"class":2420},"Get value from multi-level cache",[1169,4776,2424],{"class":2416},[1169,4778,4779],{"class":1171,"line":1498},[1169,4780,4781],{"class":1175},"        # Try L1 cache first (fastest)\n",[1169,4783,4784,4787,4789,4791,4793,4795,4797,4799,4801,4803],{"class":1171,"line":1504},[1169,4785,4786],{"class":1186},"        value ",[1169,4788,2432],{"class":1204},[1169,4790,3860],{"class":1200},[1169,4792,1269],{"class":1204},[1169,4794,4685],{"class":2440},[1169,4796,1269],{"class":1204},[1169,4798,2554],{"class":1272},[1169,4800,1276],{"class":1204},[1169,4802,4478],{"class":1272},[1169,4804,2373],{"class":1204},[1169,4806,4807,4809,4811,4813,4815,4817],{"class":1171,"line":1518},[1169,4808,3815],{"class":1182},[1169,4810,4159],{"class":1186},[1169,4812,2975],{"class":2344},[1169,4814,2978],{"class":2344},[1169,4816,2981],{"class":1380},[1169,4818,2984],{"class":1204},[1169,4820,4821,4824,4826,4829,4831,4833,4836,4838,4840,4842,4844],{"class":1171,"line":1537},[1169,4822,4823],{"class":1186},"            logger",[1169,4825,1269],{"class":1204},[1169,4827,4828],{"class":1272},"debug",[1169,4830,1276],{"class":1204},[1169,4832,3454],{"class":2398},[1169,4834,4835],{"class":1218},"\"Cache hit L1: ",[1169,4837,2823],{"class":2822},[1169,4839,4478],{"class":1272},[1169,4841,2828],{"class":2822},[1169,4843,2819],{"class":1218},[1169,4845,2373],{"class":1204},[1169,4847,4848,4850],{"class":1171,"line":1573},[1169,4849,3831],{"class":1182},[1169,4851,4852],{"class":1186}," value\n",[1169,4854,4855],{"class":1171,"line":1586},[1169,4856,3786],{"class":1186},[1169,4858,4859],{"class":1171,"line":1605},[1169,4860,4861],{"class":1175},"        # Try L2 cache\n",[1169,4863,4864,4866,4868,4870,4872,4874,4876,4878,4880,4882],{"class":1171,"line":1610},[1169,4865,4786],{"class":1186},[1169,4867,2432],{"class":1204},[1169,4869,3860],{"class":1200},[1169,4871,1269],{"class":1204},[1169,4873,4705],{"class":2440},[1169,4875,1269],{"class":1204},[1169,4877,2554],{"class":1272},[1169,4879,1276],{"class":1204},[1169,4881,4478],{"class":1272},[1169,4883,2373],{"class":1204},[1169,4885,4886,4888,4890,4892,4894,4896],{"class":1171,"line":1629},[1169,4887,3815],{"class":1182},[1169,4889,4159],{"class":1186},[1169,4891,2975],{"class":2344},[1169,4893,2978],{"class":2344},[1169,4895,2981],{"class":1380},[1169,4897,2984],{"class":1204},[1169,4899,4900,4902,4904,4906,4908,4910,4913,4915,4917,4919,4921],{"class":1171,"line":1648},[1169,4901,4823],{"class":1186},[1169,4903,1269],{"class":1204},[1169,4905,4828],{"class":1272},[1169,4907,1276],{"class":1204},[1169,4909,3454],{"class":2398},[1169,4911,4912],{"class":1218},"\"Cache hit L2: ",[1169,4914,2823],{"class":2822},[1169,4916,4478],{"class":1272},[1169,4918,2828],{"class":2822},[1169,4920,2819],{"class":1218},[1169,4922,2373],{"class":1204},[1169,4924,4925],{"class":1171,"line":1653},[1169,4926,4927],{"class":1175},"            # Populate L1 cache\n",[1169,4929,4930,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957],{"class":1171,"line":1667},[1169,4931,4932],{"class":1200},"            self",[1169,4934,1269],{"class":1204},[1169,4936,4685],{"class":2440},[1169,4938,1269],{"class":1204},[1169,4940,3049],{"class":1272},[1169,4942,1276],{"class":1204},[1169,4944,4478],{"class":1272},[1169,4946,1286],{"class":1204},[1169,4948,4199],{"class":1272},[1169,4950,1286],{"class":1204},[1169,4952,3860],{"class":1200},[1169,4954,1269],{"class":1204},[1169,4956,4724],{"class":2440},[1169,4958,2373],{"class":1204},[1169,4960,4961,4963],{"class":1171,"line":1686},[1169,4962,3831],{"class":1182},[1169,4964,4852],{"class":1186},[1169,4966,4967],{"class":1171,"line":1722},[1169,4968,3786],{"class":1186},[1169,4970,4971,4974,4976,4978,4980,4982,4985,4987,4989,4991,4993],{"class":1171,"line":1735},[1169,4972,4973],{"class":1186},"        logger",[1169,4975,1269],{"class":1204},[1169,4977,4828],{"class":1272},[1169,4979,1276],{"class":1204},[1169,4981,3454],{"class":2398},[1169,4983,4984],{"class":1218},"\"Cache miss: ",[1169,4986,2823],{"class":2822},[1169,4988,4478],{"class":1272},[1169,4990,2828],{"class":2822},[1169,4992,2819],{"class":1218},[1169,4994,2373],{"class":1204},[1169,4996,4997,4999],{"class":1171,"line":1754},[1169,4998,2990],{"class":1182},[1169,5000,5001],{"class":1380}," None\n",[1169,5003,5004],{"class":1171,"line":1759},[1169,5005,2936],{"class":1186},[1169,5007,5008,5010,5013,5015,5017,5019,5021,5023,5025,5027,5029,5031,5033],{"class":1171,"line":1779},[1169,5009,3725],{"class":2398},[1169,5011,5012],{"class":3296}," set",[1169,5014,1276],{"class":1204},[1169,5016,3734],{"class":3733},[1169,5018,1286],{"class":1204},[1169,5020,4445],{"class":2407},[1169,5022,1286],{"class":1204},[1169,5024,4199],{"class":2407},[1169,5026,1286],{"class":1204},[1169,5028,3744],{"class":2407},[1169,5030,2432],{"class":2344},[1169,5032,3993],{"class":1380},[1169,5034,2411],{"class":1204},[1169,5036,5037,5039,5042],{"class":1171,"line":1798},[1169,5038,3756],{"class":2416},[1169,5040,5041],{"class":2420},"Set value in both cache levels",[1169,5043,2424],{"class":2416},[1169,5045,5046,5049,5051,5054,5056,5059,5061,5063,5065,5067,5069,5071,5073,5075],{"class":1171,"line":1804},[1169,5047,5048],{"class":1186},"        l1_timeout ",[1169,5050,2432],{"class":1204},[1169,5052,5053],{"class":2728}," min",[1169,5055,1276],{"class":1204},[1169,5057,5058],{"class":1272},"timeout ",[1169,5060,4026],{"class":1182},[1169,5062,3860],{"class":1200},[1169,5064,1269],{"class":1204},[1169,5066,4724],{"class":2440},[1169,5068,1286],{"class":1204},[1169,5070,3860],{"class":1200},[1169,5072,1269],{"class":1204},[1169,5074,4724],{"class":2440},[1169,5076,2373],{"class":1204},[1169,5078,5079,5082,5084,5087,5089,5091,5093],{"class":1171,"line":1810},[1169,5080,5081],{"class":1186},"        l2_timeout ",[1169,5083,2432],{"class":1204},[1169,5085,5086],{"class":1186}," timeout ",[1169,5088,4026],{"class":2344},[1169,5090,3860],{"class":1200},[1169,5092,1269],{"class":1204},[1169,5094,5095],{"class":2440},"l2_timeout\n",[1169,5097,5098],{"class":1171,"line":1815},[1169,5099,3786],{"class":1186},[1169,5101,5102,5104,5106,5108,5110,5112,5114,5116,5118,5120,5122,5125],{"class":1171,"line":1821},[1169,5103,4680],{"class":1200},[1169,5105,1269],{"class":1204},[1169,5107,4685],{"class":2440},[1169,5109,1269],{"class":1204},[1169,5111,3049],{"class":1272},[1169,5113,1276],{"class":1204},[1169,5115,4478],{"class":1272},[1169,5117,1286],{"class":1204},[1169,5119,4199],{"class":1272},[1169,5121,1286],{"class":1204},[1169,5123,5124],{"class":1272}," l1_timeout",[1169,5126,2373],{"class":1204},[1169,5128,5129,5131,5133,5135,5137,5139,5141,5143,5145,5147,5149,5152],{"class":1171,"line":1837},[1169,5130,4680],{"class":1200},[1169,5132,1269],{"class":1204},[1169,5134,4705],{"class":2440},[1169,5136,1269],{"class":1204},[1169,5138,3049],{"class":1272},[1169,5140,1276],{"class":1204},[1169,5142,4478],{"class":1272},[1169,5144,1286],{"class":1204},[1169,5146,4199],{"class":1272},[1169,5148,1286],{"class":1204},[1169,5150,5151],{"class":1272}," l2_timeout",[1169,5153,2373],{"class":1204},[1169,5155,5156],{"class":1171,"line":1851},[1169,5157,2936],{"class":1186},[1169,5159,5160,5162,5165,5167,5169,5171,5173],{"class":1171,"line":2939},[1169,5161,3725],{"class":2398},[1169,5163,5164],{"class":2335}," delete",[1169,5166,1276],{"class":1204},[1169,5168,3734],{"class":3733},[1169,5170,1286],{"class":1204},[1169,5172,4445],{"class":2407},[1169,5174,2411],{"class":1204},[1169,5176,5177,5179,5182],{"class":1171,"line":2945},[1169,5178,3756],{"class":2416},[1169,5180,5181],{"class":2420},"Delete from both cache levels",[1169,5183,2424],{"class":2416},[1169,5185,5186,5188,5190,5192,5194,5196,5198,5200],{"class":1171,"line":2966},[1169,5187,4680],{"class":1200},[1169,5189,1269],{"class":1204},[1169,5191,4685],{"class":2440},[1169,5193,1269],{"class":1204},[1169,5195,4520],{"class":1272},[1169,5197,1276],{"class":1204},[1169,5199,4478],{"class":1272},[1169,5201,2373],{"class":1204},[1169,5203,5204,5206,5208,5210,5212,5214,5216,5218],{"class":1171,"line":2987},[1169,5205,4680],{"class":1200},[1169,5207,1269],{"class":1204},[1169,5209,4705],{"class":2440},[1169,5211,1269],{"class":1204},[1169,5213,4520],{"class":1272},[1169,5215,1276],{"class":1204},[1169,5217,4478],{"class":1272},[1169,5219,2373],{"class":1204},[1169,5221,5222],{"class":1171,"line":3002},[1169,5223,1194],{"emptyLinePlaceholder":1193},[1169,5225,5226],{"class":1171,"line":3007},[1169,5227,5228],{"class":1175},"# Usage in services\n",[1169,5230,5231,5234,5236,5238],{"class":1171,"line":3013},[1169,5232,5233],{"class":1186},"multi_cache ",[1169,5235,2432],{"class":1204},[1169,5237,4621],{"class":1272},[1169,5239,2464],{"class":1204},[1169,5241,5242],{"class":1171,"line":3030},[1169,5243,1194],{"emptyLinePlaceholder":1193},[1169,5245,5246,5248,5251,5253,5255],{"class":1171,"line":3035},[1169,5247,2399],{"class":2398},[1169,5249,5250],{"class":2335}," get_user_profile",[1169,5252,1276],{"class":1204},[1169,5254,3335],{"class":2407},[1169,5256,2411],{"class":1204},[1169,5258,5259,5261,5264],{"class":1171,"line":3041},[1169,5260,2417],{"class":2416},[1169,5262,5263],{"class":2420},"Get user profile with multi-level caching",[1169,5265,2424],{"class":2416},[1169,5267,5268,5270,5272,5274,5277,5279,5281,5283],{"class":1171,"line":3068},[1169,5269,2909],{"class":1186},[1169,5271,2432],{"class":1204},[1169,5273,2816],{"class":2398},[1169,5275,5276],{"class":1218},"\"user_profile:",[1169,5278,2823],{"class":2822},[1169,5280,3335],{"class":1186},[1169,5282,2828],{"class":2822},[1169,5284,2840],{"class":1218},[1169,5286,5287],{"class":1171,"line":3073},[1169,5288,2936],{"class":1186},[1169,5290,5291],{"class":1171,"line":4397},[1169,5292,5293],{"class":1175},"    # Try cache first\n",[1169,5295,5296,5299,5301,5304,5306,5308,5310,5312],{"class":1171,"line":4403},[1169,5297,5298],{"class":1186},"    profile ",[1169,5300,2432],{"class":1204},[1169,5302,5303],{"class":1186}," multi_cache",[1169,5305,1269],{"class":1204},[1169,5307,2554],{"class":1272},[1169,5309,1276],{"class":1204},[1169,5311,2961],{"class":1272},[1169,5313,2373],{"class":1204},[1169,5315,5316,5318,5321,5323,5325,5327],{"class":1171,"line":4408},[1169,5317,2969],{"class":1182},[1169,5319,5320],{"class":1186}," profile ",[1169,5322,2975],{"class":2344},[1169,5324,2978],{"class":2344},[1169,5326,2981],{"class":1380},[1169,5328,2984],{"class":1204},[1169,5330,5331,5333],{"class":1171,"line":4414},[1169,5332,2990],{"class":1182},[1169,5334,5335],{"class":1186}," profile\n",[1169,5337,5338],{"class":1171,"line":4430},[1169,5339,2936],{"class":1186},[1169,5341,5342],{"class":1171,"line":4450},[1169,5343,5344],{"class":1175},"    # Get from database\n",[1169,5346,5347,5350],{"class":1171,"line":4456},[1169,5348,5349],{"class":1182},"    try",[1169,5351,2984],{"class":1204},[1169,5353,5354,5356,5358,5360,5362,5364,5366,5368,5370,5372,5374,5376,5378,5380,5382,5384,5386,5388],{"class":1171,"line":4505},[1169,5355,3796],{"class":1186},[1169,5357,2432],{"class":1204},[1169,5359,2435],{"class":1186},[1169,5361,1269],{"class":1204},[1169,5363,2441],{"class":2440},[1169,5365,1269],{"class":1204},[1169,5367,2446],{"class":1272},[1169,5369,1276],{"class":1204},[1169,5371,1222],{"class":1214},[1169,5373,2453],{"class":1218},[1169,5375,1222],{"class":1214},[1169,5377,2458],{"class":1204},[1169,5379,2554],{"class":1272},[1169,5381,1276],{"class":1204},[1169,5383,3366],{"class":2484},[1169,5385,2432],{"class":1204},[1169,5387,3335],{"class":1272},[1169,5389,2373],{"class":1204},[1169,5391,5392,5395,5397],{"class":1171,"line":4513},[1169,5393,5394],{"class":1186},"        profile_data ",[1169,5396,2432],{"class":1204},[1169,5398,1208],{"class":1204},[1169,5400,5402,5404,5406,5408,5410,5412,5414,5416],{"class":1171,"line":5401},66,[1169,5403,1316],{"class":1214},[1169,5405,3366],{"class":1218},[1169,5407,1222],{"class":1214},[1169,5409,1225],{"class":1204},[1169,5411,3904],{"class":1186},[1169,5413,1269],{"class":1204},[1169,5415,3366],{"class":2440},[1169,5417,1251],{"class":1204},[1169,5419,5421,5423,5426,5428,5430,5432,5434,5436],{"class":1171,"line":5420},67,[1169,5422,1316],{"class":1214},[1169,5424,5425],{"class":1218},"username",[1169,5427,1222],{"class":1214},[1169,5429,1225],{"class":1204},[1169,5431,3904],{"class":1186},[1169,5433,1269],{"class":1204},[1169,5435,5425],{"class":2440},[1169,5437,1251],{"class":1204},[1169,5439,5441,5443,5446,5448,5450,5452,5454,5456],{"class":1171,"line":5440},68,[1169,5442,1316],{"class":1214},[1169,5444,5445],{"class":1218},"email",[1169,5447,1222],{"class":1214},[1169,5449,1225],{"class":1204},[1169,5451,3904],{"class":1186},[1169,5453,1269],{"class":1204},[1169,5455,5445],{"class":2440},[1169,5457,1251],{"class":1204},[1169,5459,5461,5463,5465,5467,5469],{"class":1171,"line":5460},69,[1169,5462,1316],{"class":1214},[1169,5464,2453],{"class":1218},[1169,5466,1222],{"class":1214},[1169,5468,1225],{"class":1204},[1169,5470,1208],{"class":1204},[1169,5472,5474,5476,5479,5481,5483,5485,5487,5489,5491,5493],{"class":1171,"line":5473},70,[1169,5475,1352],{"class":1214},[1169,5477,5478],{"class":1218},"bio",[1169,5480,1222],{"class":1214},[1169,5482,1225],{"class":1204},[1169,5484,3904],{"class":1186},[1169,5486,1269],{"class":1204},[1169,5488,2453],{"class":2440},[1169,5490,1269],{"class":1204},[1169,5492,5478],{"class":2440},[1169,5494,1251],{"class":1204},[1169,5496,5498,5500,5503,5505,5507,5509,5511,5513,5515,5517],{"class":1171,"line":5497},71,[1169,5499,1352],{"class":1214},[1169,5501,5502],{"class":1218},"avatar_url",[1169,5504,1222],{"class":1214},[1169,5506,1225],{"class":1204},[1169,5508,3904],{"class":1186},[1169,5510,1269],{"class":1204},[1169,5512,2453],{"class":2440},[1169,5514,1269],{"class":1204},[1169,5516,5502],{"class":2440},[1169,5518,1251],{"class":1204},[1169,5520,5522],{"class":1171,"line":5521},72,[1169,5523,5524],{"class":1204},"            }\n",[1169,5526,5528],{"class":1171,"line":5527},73,[1169,5529,5530],{"class":1204},"        }\n",[1169,5532,5534],{"class":1171,"line":5533},74,[1169,5535,3786],{"class":1186},[1169,5537,5539],{"class":1171,"line":5538},75,[1169,5540,5541],{"class":1175},"        # Cache for 30 minutes\n",[1169,5543,5545,5548,5550,5552,5554,5556,5558,5561,5563,5565],{"class":1171,"line":5544},76,[1169,5546,5547],{"class":1186},"        multi_cache",[1169,5549,1269],{"class":1204},[1169,5551,3049],{"class":1272},[1169,5553,1276],{"class":1204},[1169,5555,2961],{"class":1272},[1169,5557,1286],{"class":1204},[1169,5559,5560],{"class":1272}," profile_data",[1169,5562,1286],{"class":1204},[1169,5564,2041],{"class":1362},[1169,5566,2373],{"class":1204},[1169,5568,5570,5572],{"class":1171,"line":5569},77,[1169,5571,2990],{"class":1182},[1169,5573,5574],{"class":1186}," profile_data\n",[1169,5576,5578],{"class":1171,"line":5577},78,[1169,5579,3786],{"class":1186},[1169,5581,5583,5586,5588,5590,5592],{"class":1171,"line":5582},79,[1169,5584,5585],{"class":1182},"    except",[1169,5587,2435],{"class":1186},[1169,5589,1269],{"class":1204},[1169,5591,3933],{"class":2440},[1169,5593,2984],{"class":1204},[1169,5595,5597,5599],{"class":1171,"line":5596},80,[1169,5598,2990],{"class":1182},[1169,5600,5001],{"class":1380},[1077,5602,5604],{"id":5603},"cache-warming-and-preloading","Cache Warming and Preloading",[1159,5606,5608],{"className":1161,"code":5607,"language":1163,"meta":1164,"style":1164},"# user_service/management/commands/warm_cache.py\nfrom django.core.management.base import BaseCommand\nfrom django.core.cache import cache\nfrom django.contrib.auth.models import User\nfrom user_service.services import UserService\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass Command(BaseCommand):\n    help = 'Warm up application caches'\n    \n    def add_arguments(self, parser):\n        parser.add_argument(\n            '--batch-size',\n            type=int,\n            default=100,\n            help='Batch size for processing users'\n        )\n        \n        parser.add_argument(\n            '--cache-timeout',\n            type=int,\n            default=3600,\n            help='Cache timeout in seconds'\n        )\n    \n    def handle(self, *args, **options):\n        batch_size = options['batch_size']\n        cache_timeout = options['cache_timeout']\n        \n        self.stdout.write('Starting cache warming...')\n        \n        # Warm user profile cache\n        self.warm_user_profiles(batch_size, cache_timeout)\n        \n        # Warm user statistics cache\n        self.warm_user_statistics(cache_timeout)\n        \n        # Warm frequently accessed data\n        self.warm_frequent_data(cache_timeout)\n        \n        self.stdout.write(\n            self.style.SUCCESS('Cache warming completed successfully')\n        )\n    \n    def warm_user_profiles(self, batch_size, timeout):\n        \"\"\"Warm user profile cache\"\"\"\n        user_service = UserService()\n        total_users = User.objects.count()\n        \n        self.stdout.write(f'Warming {total_users} user profiles...')\n        \n        for i in range(0, total_users, batch_size):\n            users = User.objects.select_related('profile')[i:i + batch_size]\n            \n            for user in users:\n                cache_key = f\"user_profile:{user.id}\"\n                profile_data = user_service.get_profile_data(user)\n                cache.set(cache_key, profile_data, timeout)\n            \n            self.stdout.write(f'Processed {min(i + batch_size, total_users)} users')\n    \n    def warm_user_statistics(self, timeout):\n        \"\"\"Warm user statistics cache\"\"\"\n        self.stdout.write('Warming user statistics...')\n        \n        # Common statistics queries\n        stats_queries = [\n            {'is_active': True},\n            {'date_joined__gte': timezone.now() - timedelta(days=30)},\n            {'is_staff': True},\n        ]\n        \n        for filters in stats_queries:\n            cache_key = f\"user_stats:{hash(frozenset(filters.items()))}\"\n            stats = self.calculate_user_stats(filters)\n            cache.set(cache_key, stats, timeout)\n    \n    def warm_frequent_data(self, timeout):\n        \"\"\"Warm frequently accessed data\"\"\"\n        self.stdout.write('Warming frequent data...')\n        \n        # Cache popular user lists\n        popular_users = User.objects.filter(\n            is_active=True\n        ).order_by('-last_login')[:100]\n        \n        cache.set('popular_users', list(popular_users), timeout)\n        \n        # Cache system statistics\n        system_stats = {\n            'total_users': User.objects.count(),\n            'active_users': User.objects.filter(is_active=True).count(),\n            'new_users_today': User.objects.filter(\n                date_joined__date=timezone.now().date()\n            ).count(),\n        }\n        \n        cache.set('system_stats', system_stats, timeout)\n",[1166,5609,5610,5615,5640,5658,5684,5701,5707,5711,5729,5733,5747,5761,5765,5783,5795,5806,5818,5830,5844,5849,5853,5863,5874,5884,5895,5908,5912,5916,5942,5963,5983,5987,6012,6016,6021,6040,6044,6049,6064,6068,6073,6088,6092,6106,6131,6135,6139,6161,6170,6182,6202,6206,6237,6241,6269,6312,6317,6330,6353,6373,6396,6400,6445,6449,6466,6475,6498,6502,6507,6516,6535,6578,6595,6600,6604,6617,6651,6671,6693,6697,6714,6724,6748,6753,6759,6779,6790,6815,6820,6852,6857,6863,6873,6897,6933,6957,6980,6990,6995,7000],{"__ignoreMap":1164},[1169,5611,5612],{"class":1171,"line":1172},[1169,5613,5614],{"class":1175},"# user_service/management/commands/warm_cache.py\n",[1169,5616,5617,5619,5621,5623,5625,5627,5630,5632,5635,5637],{"class":1171,"line":1179},[1169,5618,1879],{"class":1182},[1169,5620,2182],{"class":1186},[1169,5622,1269],{"class":1204},[1169,5624,2237],{"class":1186},[1169,5626,1269],{"class":1204},[1169,5628,5629],{"class":1186},"management",[1169,5631,1269],{"class":1204},[1169,5633,5634],{"class":1186},"base ",[1169,5636,1183],{"class":1182},[1169,5638,5639],{"class":1186}," BaseCommand\n",[1169,5641,5642,5644,5646,5648,5650,5652,5654,5656],{"class":1171,"line":1190},[1169,5643,1879],{"class":1182},[1169,5645,2182],{"class":1186},[1169,5647,1269],{"class":1204},[1169,5649,2237],{"class":1186},[1169,5651,1269],{"class":1204},[1169,5653,2197],{"class":1186},[1169,5655,1183],{"class":1182},[1169,5657,3128],{"class":1186},[1169,5659,5660,5662,5664,5666,5669,5671,5674,5676,5679,5681],{"class":1171,"line":1197},[1169,5661,1879],{"class":1182},[1169,5663,2182],{"class":1186},[1169,5665,1269],{"class":1204},[1169,5667,5668],{"class":1186},"contrib",[1169,5670,1269],{"class":1204},[1169,5672,5673],{"class":1186},"auth",[1169,5675,1269],{"class":1204},[1169,5677,5678],{"class":1186},"models ",[1169,5680,1183],{"class":1182},[1169,5682,5683],{"class":1186}," User\n",[1169,5685,5686,5688,5691,5693,5696,5698],{"class":1171,"line":1211},[1169,5687,1879],{"class":1182},[1169,5689,5690],{"class":1186}," user_service",[1169,5692,1269],{"class":1204},[1169,5694,5695],{"class":1186},"services ",[1169,5697,1183],{"class":1182},[1169,5699,5700],{"class":1186}," UserService\n",[1169,5702,5703,5705],{"class":1171,"line":1230},[1169,5704,1183],{"class":1182},[1169,5706,4569],{"class":1186},[1169,5708,5709],{"class":1171,"line":1254},[1169,5710,1194],{"emptyLinePlaceholder":1193},[1169,5712,5713,5715,5717,5719,5721,5723,5725,5727],{"class":1171,"line":1299},[1169,5714,4592],{"class":1186},[1169,5716,2432],{"class":1204},[1169,5718,4597],{"class":1186},[1169,5720,1269],{"class":1204},[1169,5722,4602],{"class":1272},[1169,5724,1276],{"class":1204},[1169,5726,4608],{"class":4607},[1169,5728,2373],{"class":1204},[1169,5730,5731],{"class":1171,"line":1313},[1169,5732,1194],{"emptyLinePlaceholder":1193},[1169,5734,5735,5737,5740,5742,5745],{"class":1171,"line":1335},[1169,5736,2595],{"class":2398},[1169,5738,5739],{"class":2598}," Command",[1169,5741,1276],{"class":1204},[1169,5743,5744],{"class":2604},"BaseCommand",[1169,5746,2411],{"class":1204},[1169,5748,5749,5752,5754,5756,5759],{"class":1171,"line":1349},[1169,5750,5751],{"class":2728},"    help",[1169,5753,1205],{"class":1204},[1169,5755,1243],{"class":1214},[1169,5757,5758],{"class":1218},"Warm up application caches",[1169,5760,1834],{"class":1214},[1169,5762,5763],{"class":1171,"line":1368},[1169,5764,2936],{"class":1186},[1169,5766,5767,5769,5772,5774,5776,5778,5781],{"class":1171,"line":1386},[1169,5768,3725],{"class":2398},[1169,5770,5771],{"class":2335}," add_arguments",[1169,5773,1276],{"class":1204},[1169,5775,3734],{"class":3733},[1169,5777,1286],{"class":1204},[1169,5779,5780],{"class":2407}," parser",[1169,5782,2411],{"class":1204},[1169,5784,5785,5788,5790,5793],{"class":1171,"line":1392},[1169,5786,5787],{"class":1186},"        parser",[1169,5789,1269],{"class":1204},[1169,5791,5792],{"class":1272},"add_argument",[1169,5794,3402],{"class":1204},[1169,5796,5797,5799,5802,5804],{"class":1171,"line":1413},[1169,5798,1316],{"class":1214},[1169,5800,5801],{"class":1218},"--batch-size",[1169,5803,1222],{"class":1214},[1169,5805,1251],{"class":1204},[1169,5807,5808,5811,5813,5816],{"class":1171,"line":1434},[1169,5809,5810],{"class":2484},"            type",[1169,5812,2432],{"class":1204},[1169,5814,5815],{"class":3296},"int",[1169,5817,1251],{"class":1204},[1169,5819,5820,5823,5825,5828],{"class":1171,"line":1440},[1169,5821,5822],{"class":2484},"            default",[1169,5824,2432],{"class":1204},[1169,5826,5827],{"class":1362},"100",[1169,5829,1251],{"class":1204},[1169,5831,5832,5835,5837,5839,5842],{"class":1171,"line":1461},[1169,5833,5834],{"class":2484},"            help",[1169,5836,2432],{"class":1204},[1169,5838,1222],{"class":1214},[1169,5840,5841],{"class":1218},"Batch size for processing users",[1169,5843,1834],{"class":1214},[1169,5845,5846],{"class":1171,"line":1478},[1169,5847,5848],{"class":1204},"        )\n",[1169,5850,5851],{"class":1171,"line":1498},[1169,5852,3786],{"class":1186},[1169,5854,5855,5857,5859,5861],{"class":1171,"line":1504},[1169,5856,5787],{"class":1186},[1169,5858,1269],{"class":1204},[1169,5860,5792],{"class":1272},[1169,5862,3402],{"class":1204},[1169,5864,5865,5867,5870,5872],{"class":1171,"line":1518},[1169,5866,1316],{"class":1214},[1169,5868,5869],{"class":1218},"--cache-timeout",[1169,5871,1222],{"class":1214},[1169,5873,1251],{"class":1204},[1169,5875,5876,5878,5880,5882],{"class":1171,"line":1537},[1169,5877,5810],{"class":2484},[1169,5879,2432],{"class":1204},[1169,5881,5815],{"class":3296},[1169,5883,1251],{"class":1204},[1169,5885,5886,5888,5890,5893],{"class":1171,"line":1573},[1169,5887,5822],{"class":2484},[1169,5889,2432],{"class":1204},[1169,5891,5892],{"class":1362},"3600",[1169,5894,1251],{"class":1204},[1169,5896,5897,5899,5901,5903,5906],{"class":1171,"line":1586},[1169,5898,5834],{"class":2484},[1169,5900,2432],{"class":1204},[1169,5902,1222],{"class":1214},[1169,5904,5905],{"class":1218},"Cache timeout in seconds",[1169,5907,1834],{"class":1214},[1169,5909,5910],{"class":1171,"line":1605},[1169,5911,5848],{"class":1204},[1169,5913,5914],{"class":1171,"line":1610},[1169,5915,2936],{"class":1186},[1169,5917,5918,5920,5923,5925,5927,5929,5931,5933,5935,5937,5940],{"class":1171,"line":1629},[1169,5919,3725],{"class":2398},[1169,5921,5922],{"class":2335}," handle",[1169,5924,1276],{"class":1204},[1169,5926,3734],{"class":3733},[1169,5928,1286],{"class":1204},[1169,5930,2345],{"class":2344},[1169,5932,2672],{"class":2407},[1169,5934,1286],{"class":1204},[1169,5936,2677],{"class":2344},[1169,5938,5939],{"class":2407},"options",[1169,5941,2411],{"class":1204},[1169,5943,5944,5947,5949,5952,5954,5956,5959,5961],{"class":1171,"line":1648},[1169,5945,5946],{"class":1186},"        batch_size ",[1169,5948,2432],{"class":1204},[1169,5950,5951],{"class":1186}," options",[1169,5953,1908],{"class":1204},[1169,5955,1222],{"class":1214},[1169,5957,5958],{"class":1218},"batch_size",[1169,5960,1222],{"class":1214},[1169,5962,2112],{"class":1204},[1169,5964,5965,5968,5970,5972,5974,5976,5979,5981],{"class":1171,"line":1653},[1169,5966,5967],{"class":1186},"        cache_timeout ",[1169,5969,2432],{"class":1204},[1169,5971,5951],{"class":1186},[1169,5973,1908],{"class":1204},[1169,5975,1222],{"class":1214},[1169,5977,5978],{"class":1218},"cache_timeout",[1169,5980,1222],{"class":1214},[1169,5982,2112],{"class":1204},[1169,5984,5985],{"class":1171,"line":1667},[1169,5986,3786],{"class":1186},[1169,5988,5989,5991,5993,5996,5998,6001,6003,6005,6008,6010],{"class":1171,"line":1686},[1169,5990,4680],{"class":1200},[1169,5992,1269],{"class":1204},[1169,5994,5995],{"class":2440},"stdout",[1169,5997,1269],{"class":1204},[1169,5999,6000],{"class":1272},"write",[1169,6002,1276],{"class":1204},[1169,6004,1222],{"class":1214},[1169,6006,6007],{"class":1218},"Starting cache warming...",[1169,6009,1222],{"class":1214},[1169,6011,2373],{"class":1204},[1169,6013,6014],{"class":1171,"line":1722},[1169,6015,3786],{"class":1186},[1169,6017,6018],{"class":1171,"line":1735},[1169,6019,6020],{"class":1175},"        # Warm user profile cache\n",[1169,6022,6023,6025,6027,6030,6032,6034,6036,6038],{"class":1171,"line":1754},[1169,6024,4680],{"class":1200},[1169,6026,1269],{"class":1204},[1169,6028,6029],{"class":1272},"warm_user_profiles",[1169,6031,1276],{"class":1204},[1169,6033,5958],{"class":1272},[1169,6035,1286],{"class":1204},[1169,6037,3225],{"class":1272},[1169,6039,2373],{"class":1204},[1169,6041,6042],{"class":1171,"line":1759},[1169,6043,3786],{"class":1186},[1169,6045,6046],{"class":1171,"line":1779},[1169,6047,6048],{"class":1175},"        # Warm user statistics cache\n",[1169,6050,6051,6053,6055,6058,6060,6062],{"class":1171,"line":1798},[1169,6052,4680],{"class":1200},[1169,6054,1269],{"class":1204},[1169,6056,6057],{"class":1272},"warm_user_statistics",[1169,6059,1276],{"class":1204},[1169,6061,5978],{"class":1272},[1169,6063,2373],{"class":1204},[1169,6065,6066],{"class":1171,"line":1804},[1169,6067,3786],{"class":1186},[1169,6069,6070],{"class":1171,"line":1810},[1169,6071,6072],{"class":1175},"        # Warm frequently accessed data\n",[1169,6074,6075,6077,6079,6082,6084,6086],{"class":1171,"line":1815},[1169,6076,4680],{"class":1200},[1169,6078,1269],{"class":1204},[1169,6080,6081],{"class":1272},"warm_frequent_data",[1169,6083,1276],{"class":1204},[1169,6085,5978],{"class":1272},[1169,6087,2373],{"class":1204},[1169,6089,6090],{"class":1171,"line":1821},[1169,6091,3786],{"class":1186},[1169,6093,6094,6096,6098,6100,6102,6104],{"class":1171,"line":1837},[1169,6095,4680],{"class":1200},[1169,6097,1269],{"class":1204},[1169,6099,5995],{"class":2440},[1169,6101,1269],{"class":1204},[1169,6103,6000],{"class":1272},[1169,6105,3402],{"class":1204},[1169,6107,6108,6110,6112,6115,6117,6120,6122,6124,6127,6129],{"class":1171,"line":1851},[1169,6109,4932],{"class":1200},[1169,6111,1269],{"class":1204},[1169,6113,6114],{"class":2440},"style",[1169,6116,1269],{"class":1204},[1169,6118,6119],{"class":1272},"SUCCESS",[1169,6121,1276],{"class":1204},[1169,6123,1222],{"class":1214},[1169,6125,6126],{"class":1218},"Cache warming completed successfully",[1169,6128,1222],{"class":1214},[1169,6130,2373],{"class":1204},[1169,6132,6133],{"class":1171,"line":2939},[1169,6134,5848],{"class":1204},[1169,6136,6137],{"class":1171,"line":2945},[1169,6138,2936],{"class":1186},[1169,6140,6141,6143,6146,6148,6150,6152,6155,6157,6159],{"class":1171,"line":2966},[1169,6142,3725],{"class":2398},[1169,6144,6145],{"class":2335}," warm_user_profiles",[1169,6147,1276],{"class":1204},[1169,6149,3734],{"class":3733},[1169,6151,1286],{"class":1204},[1169,6153,6154],{"class":2407}," batch_size",[1169,6156,1286],{"class":1204},[1169,6158,3744],{"class":2407},[1169,6160,2411],{"class":1204},[1169,6162,6163,6165,6168],{"class":1171,"line":2987},[1169,6164,3756],{"class":2416},[1169,6166,6167],{"class":2420},"Warm user profile cache",[1169,6169,2424],{"class":2416},[1169,6171,6172,6175,6177,6180],{"class":1171,"line":3002},[1169,6173,6174],{"class":1186},"        user_service ",[1169,6176,2432],{"class":1204},[1169,6178,6179],{"class":1272}," UserService",[1169,6181,2464],{"class":1204},[1169,6183,6184,6187,6189,6191,6193,6195,6197,6200],{"class":1171,"line":3007},[1169,6185,6186],{"class":1186},"        total_users ",[1169,6188,2432],{"class":1204},[1169,6190,2435],{"class":1186},[1169,6192,1269],{"class":1204},[1169,6194,2441],{"class":2440},[1169,6196,1269],{"class":1204},[1169,6198,6199],{"class":1272},"count",[1169,6201,2464],{"class":1204},[1169,6203,6204],{"class":1171,"line":3013},[1169,6205,3786],{"class":1186},[1169,6207,6208,6210,6212,6214,6216,6218,6220,6222,6225,6227,6230,6232,6235],{"class":1171,"line":3030},[1169,6209,4680],{"class":1200},[1169,6211,1269],{"class":1204},[1169,6213,5995],{"class":2440},[1169,6215,1269],{"class":1204},[1169,6217,6000],{"class":1272},[1169,6219,1276],{"class":1204},[1169,6221,3454],{"class":2398},[1169,6223,6224],{"class":1218},"'Warming ",[1169,6226,2823],{"class":2822},[1169,6228,6229],{"class":1272},"total_users",[1169,6231,2828],{"class":2822},[1169,6233,6234],{"class":1218}," user profiles...'",[1169,6236,2373],{"class":1204},[1169,6238,6239],{"class":1171,"line":3035},[1169,6240,3786],{"class":1186},[1169,6242,6243,6245,6248,6250,6253,6255,6258,6260,6263,6265,6267],{"class":1171,"line":3041},[1169,6244,4151],{"class":1182},[1169,6246,6247],{"class":1186}," i ",[1169,6249,3318],{"class":1182},[1169,6251,6252],{"class":2728}," range",[1169,6254,1276],{"class":1204},[1169,6256,6257],{"class":1362},"0",[1169,6259,1286],{"class":1204},[1169,6261,6262],{"class":1272}," total_users",[1169,6264,1286],{"class":1204},[1169,6266,6154],{"class":1272},[1169,6268,2411],{"class":1204},[1169,6270,6271,6274,6276,6278,6280,6282,6284,6286,6288,6290,6292,6294,6297,6300,6302,6305,6308,6310],{"class":1171,"line":3068},[1169,6272,6273],{"class":1186},"            users ",[1169,6275,2432],{"class":1204},[1169,6277,2435],{"class":1186},[1169,6279,1269],{"class":1204},[1169,6281,2441],{"class":2440},[1169,6283,1269],{"class":1204},[1169,6285,2446],{"class":1272},[1169,6287,1276],{"class":1204},[1169,6289,1222],{"class":1214},[1169,6291,2453],{"class":1218},[1169,6293,1222],{"class":1214},[1169,6295,6296],{"class":1204},")[",[1169,6298,6299],{"class":1186},"i",[1169,6301,1225],{"class":1204},[1169,6303,6304],{"class":1186},"i ",[1169,6306,6307],{"class":2344},"+",[1169,6309,6154],{"class":1186},[1169,6311,2112],{"class":1204},[1169,6313,6314],{"class":1171,"line":3073},[1169,6315,6316],{"class":1186},"            \n",[1169,6318,6319,6322,6324,6326,6328],{"class":1171,"line":4397},[1169,6320,6321],{"class":1182},"            for",[1169,6323,3818],{"class":1186},[1169,6325,3318],{"class":1182},[1169,6327,4243],{"class":1186},[1169,6329,2984],{"class":1204},[1169,6331,6332,6335,6337,6339,6341,6343,6345,6347,6349,6351],{"class":1171,"line":4403},[1169,6333,6334],{"class":1186},"                cache_key ",[1169,6336,2432],{"class":1204},[1169,6338,2816],{"class":2398},[1169,6340,5276],{"class":1218},[1169,6342,2823],{"class":2822},[1169,6344,3357],{"class":1186},[1169,6346,1269],{"class":1204},[1169,6348,3366],{"class":2440},[1169,6350,2828],{"class":2822},[1169,6352,2840],{"class":1218},[1169,6354,6355,6358,6360,6362,6364,6367,6369,6371],{"class":1171,"line":4408},[1169,6356,6357],{"class":1186},"                profile_data ",[1169,6359,2432],{"class":1204},[1169,6361,5690],{"class":1186},[1169,6363,1269],{"class":1204},[1169,6365,6366],{"class":1272},"get_profile_data",[1169,6368,1276],{"class":1204},[1169,6370,3357],{"class":1272},[1169,6372,2373],{"class":1204},[1169,6374,6375,6378,6380,6382,6384,6386,6388,6390,6392,6394],{"class":1171,"line":4414},[1169,6376,6377],{"class":1186},"                cache",[1169,6379,1269],{"class":1204},[1169,6381,3049],{"class":1272},[1169,6383,1276],{"class":1204},[1169,6385,2961],{"class":1272},[1169,6387,1286],{"class":1204},[1169,6389,5560],{"class":1272},[1169,6391,1286],{"class":1204},[1169,6393,3744],{"class":1272},[1169,6395,2373],{"class":1204},[1169,6397,6398],{"class":1171,"line":4430},[1169,6399,6316],{"class":1186},[1169,6401,6402,6404,6406,6408,6410,6412,6414,6416,6419,6421,6424,6426,6428,6430,6432,6434,6436,6438,6440,6443],{"class":1171,"line":4450},[1169,6403,4932],{"class":1200},[1169,6405,1269],{"class":1204},[1169,6407,5995],{"class":2440},[1169,6409,1269],{"class":1204},[1169,6411,6000],{"class":1272},[1169,6413,1276],{"class":1204},[1169,6415,3454],{"class":2398},[1169,6417,6418],{"class":1218},"'Processed ",[1169,6420,2823],{"class":2822},[1169,6422,6423],{"class":2728},"min",[1169,6425,1276],{"class":1204},[1169,6427,6304],{"class":1272},[1169,6429,6307],{"class":2344},[1169,6431,6154],{"class":1272},[1169,6433,1286],{"class":1204},[1169,6435,6262],{"class":1272},[1169,6437,2351],{"class":1204},[1169,6439,2828],{"class":2822},[1169,6441,6442],{"class":1218}," users'",[1169,6444,2373],{"class":1204},[1169,6446,6447],{"class":1171,"line":4456},[1169,6448,2936],{"class":1186},[1169,6450,6451,6453,6456,6458,6460,6462,6464],{"class":1171,"line":4505},[1169,6452,3725],{"class":2398},[1169,6454,6455],{"class":2335}," warm_user_statistics",[1169,6457,1276],{"class":1204},[1169,6459,3734],{"class":3733},[1169,6461,1286],{"class":1204},[1169,6463,3744],{"class":2407},[1169,6465,2411],{"class":1204},[1169,6467,6468,6470,6473],{"class":1171,"line":4513},[1169,6469,3756],{"class":2416},[1169,6471,6472],{"class":2420},"Warm user statistics cache",[1169,6474,2424],{"class":2416},[1169,6476,6477,6479,6481,6483,6485,6487,6489,6491,6494,6496],{"class":1171,"line":5401},[1169,6478,4680],{"class":1200},[1169,6480,1269],{"class":1204},[1169,6482,5995],{"class":2440},[1169,6484,1269],{"class":1204},[1169,6486,6000],{"class":1272},[1169,6488,1276],{"class":1204},[1169,6490,1222],{"class":1214},[1169,6492,6493],{"class":1218},"Warming user statistics...",[1169,6495,1222],{"class":1214},[1169,6497,2373],{"class":1204},[1169,6499,6500],{"class":1171,"line":5420},[1169,6501,3786],{"class":1186},[1169,6503,6504],{"class":1171,"line":5440},[1169,6505,6506],{"class":1175},"        # Common statistics queries\n",[1169,6508,6509,6512,6514],{"class":1171,"line":5460},[1169,6510,6511],{"class":1186},"        stats_queries ",[1169,6513,2432],{"class":1204},[1169,6515,2069],{"class":1204},[1169,6517,6518,6521,6523,6526,6528,6530,6532],{"class":1171,"line":5473},[1169,6519,6520],{"class":1204},"            {",[1169,6522,1222],{"class":1214},[1169,6524,6525],{"class":1218},"is_active",[1169,6527,1222],{"class":1214},[1169,6529,1225],{"class":1204},[1169,6531,1381],{"class":1380},[1169,6533,6534],{"class":1204},"},\n",[1169,6536,6537,6539,6541,6544,6546,6548,6551,6553,6556,6559,6562,6565,6567,6570,6572,6575],{"class":1171,"line":5497},[1169,6538,6520],{"class":1204},[1169,6540,1222],{"class":1214},[1169,6542,6543],{"class":1218},"date_joined__gte",[1169,6545,1222],{"class":1214},[1169,6547,1225],{"class":1204},[1169,6549,6550],{"class":1186}," timezone",[1169,6552,1269],{"class":1204},[1169,6554,6555],{"class":1272},"now",[1169,6557,6558],{"class":1204},"()",[1169,6560,6561],{"class":2344}," -",[1169,6563,6564],{"class":1272}," timedelta",[1169,6566,1276],{"class":1204},[1169,6568,6569],{"class":2484},"days",[1169,6571,2432],{"class":1204},[1169,6573,6574],{"class":1362},"30",[1169,6576,6577],{"class":1204},")},\n",[1169,6579,6580,6582,6584,6587,6589,6591,6593],{"class":1171,"line":5521},[1169,6581,6520],{"class":1204},[1169,6583,1222],{"class":1214},[1169,6585,6586],{"class":1218},"is_staff",[1169,6588,1222],{"class":1214},[1169,6590,1225],{"class":1204},[1169,6592,1381],{"class":1380},[1169,6594,6534],{"class":1204},[1169,6596,6597],{"class":1171,"line":5527},[1169,6598,6599],{"class":1204},"        ]\n",[1169,6601,6602],{"class":1171,"line":5533},[1169,6603,3786],{"class":1186},[1169,6605,6606,6608,6610,6612,6615],{"class":1171,"line":5538},[1169,6607,4151],{"class":1182},[1169,6609,4023],{"class":1186},[1169,6611,3318],{"class":1182},[1169,6613,6614],{"class":1186}," stats_queries",[1169,6616,2984],{"class":1204},[1169,6618,6619,6622,6624,6626,6629,6631,6633,6635,6637,6639,6641,6643,6645,6647,6649],{"class":1171,"line":5544},[1169,6620,6621],{"class":1186},"            cache_key ",[1169,6623,2432],{"class":1204},[1169,6625,2816],{"class":2398},[1169,6627,6628],{"class":1218},"\"user_stats:",[1169,6630,2823],{"class":2822},[1169,6632,4045],{"class":2728},[1169,6634,1276],{"class":1204},[1169,6636,4050],{"class":3296},[1169,6638,1276],{"class":1204},[1169,6640,2929],{"class":1272},[1169,6642,1269],{"class":1204},[1169,6644,2738],{"class":1272},[1169,6646,4061],{"class":1204},[1169,6648,2828],{"class":2822},[1169,6650,2840],{"class":1218},[1169,6652,6653,6656,6658,6660,6662,6665,6667,6669],{"class":1171,"line":5569},[1169,6654,6655],{"class":1186},"            stats ",[1169,6657,2432],{"class":1204},[1169,6659,3860],{"class":1200},[1169,6661,1269],{"class":1204},[1169,6663,6664],{"class":1272},"calculate_user_stats",[1169,6666,1276],{"class":1204},[1169,6668,2929],{"class":1272},[1169,6670,2373],{"class":1204},[1169,6672,6673,6675,6677,6679,6681,6683,6685,6687,6689,6691],{"class":1171,"line":5577},[1169,6674,3891],{"class":1186},[1169,6676,1269],{"class":1204},[1169,6678,3049],{"class":1272},[1169,6680,1276],{"class":1204},[1169,6682,2961],{"class":1272},[1169,6684,1286],{"class":1204},[1169,6686,3058],{"class":1272},[1169,6688,1286],{"class":1204},[1169,6690,3744],{"class":1272},[1169,6692,2373],{"class":1204},[1169,6694,6695],{"class":1171,"line":5582},[1169,6696,2936],{"class":1186},[1169,6698,6699,6701,6704,6706,6708,6710,6712],{"class":1171,"line":5596},[1169,6700,3725],{"class":2398},[1169,6702,6703],{"class":2335}," warm_frequent_data",[1169,6705,1276],{"class":1204},[1169,6707,3734],{"class":3733},[1169,6709,1286],{"class":1204},[1169,6711,3744],{"class":2407},[1169,6713,2411],{"class":1204},[1169,6715,6717,6719,6722],{"class":1171,"line":6716},81,[1169,6718,3756],{"class":2416},[1169,6720,6721],{"class":2420},"Warm frequently accessed data",[1169,6723,2424],{"class":2416},[1169,6725,6727,6729,6731,6733,6735,6737,6739,6741,6744,6746],{"class":1171,"line":6726},82,[1169,6728,4680],{"class":1200},[1169,6730,1269],{"class":1204},[1169,6732,5995],{"class":2440},[1169,6734,1269],{"class":1204},[1169,6736,6000],{"class":1272},[1169,6738,1276],{"class":1204},[1169,6740,1222],{"class":1214},[1169,6742,6743],{"class":1218},"Warming frequent data...",[1169,6745,1222],{"class":1214},[1169,6747,2373],{"class":1204},[1169,6749,6751],{"class":1171,"line":6750},83,[1169,6752,3786],{"class":1186},[1169,6754,6756],{"class":1171,"line":6755},84,[1169,6757,6758],{"class":1175},"        # Cache popular user lists\n",[1169,6760,6762,6765,6767,6769,6771,6773,6775,6777],{"class":1171,"line":6761},85,[1169,6763,6764],{"class":1186},"        popular_users ",[1169,6766,2432],{"class":1204},[1169,6768,2435],{"class":1186},[1169,6770,1269],{"class":1204},[1169,6772,2441],{"class":2440},[1169,6774,1269],{"class":1204},[1169,6776,4185],{"class":1272},[1169,6778,3402],{"class":1204},[1169,6780,6782,6785,6787],{"class":1171,"line":6781},86,[1169,6783,6784],{"class":2484},"            is_active",[1169,6786,2432],{"class":1204},[1169,6788,6789],{"class":1380},"True\n",[1169,6791,6793,6796,6799,6801,6803,6806,6808,6811,6813],{"class":1171,"line":6792},87,[1169,6794,6795],{"class":1204},"        ).",[1169,6797,6798],{"class":1272},"order_by",[1169,6800,1276],{"class":1204},[1169,6802,1222],{"class":1214},[1169,6804,6805],{"class":1218},"-last_login",[1169,6807,1222],{"class":1214},[1169,6809,6810],{"class":1204},")[:",[1169,6812,5827],{"class":1362},[1169,6814,2112],{"class":1204},[1169,6816,6818],{"class":1171,"line":6817},88,[1169,6819,3786],{"class":1186},[1169,6821,6823,6825,6827,6829,6831,6833,6836,6838,6840,6842,6844,6846,6848,6850],{"class":1171,"line":6822},89,[1169,6824,4230],{"class":1186},[1169,6826,1269],{"class":1204},[1169,6828,3049],{"class":1272},[1169,6830,1276],{"class":1204},[1169,6832,1222],{"class":1214},[1169,6834,6835],{"class":1218},"popular_users",[1169,6837,1222],{"class":1214},[1169,6839,1286],{"class":1204},[1169,6841,4214],{"class":3296},[1169,6843,1276],{"class":1204},[1169,6845,6835],{"class":1272},[1169,6847,2544],{"class":1204},[1169,6849,3744],{"class":1272},[1169,6851,2373],{"class":1204},[1169,6853,6855],{"class":1171,"line":6854},90,[1169,6856,3786],{"class":1186},[1169,6858,6860],{"class":1171,"line":6859},91,[1169,6861,6862],{"class":1175},"        # Cache system statistics\n",[1169,6864,6866,6869,6871],{"class":1171,"line":6865},92,[1169,6867,6868],{"class":1186},"        system_stats ",[1169,6870,2432],{"class":1204},[1169,6872,1208],{"class":1204},[1169,6874,6876,6878,6880,6882,6884,6886,6888,6890,6892,6894],{"class":1171,"line":6875},93,[1169,6877,1316],{"class":1214},[1169,6879,6229],{"class":1218},[1169,6881,1222],{"class":1214},[1169,6883,1225],{"class":1204},[1169,6885,2435],{"class":1186},[1169,6887,1269],{"class":1204},[1169,6889,2441],{"class":2440},[1169,6891,1269],{"class":1204},[1169,6893,6199],{"class":1272},[1169,6895,6896],{"class":1204},"(),\n",[1169,6898,6900,6902,6905,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925,6927,6929,6931],{"class":1171,"line":6899},94,[1169,6901,1316],{"class":1214},[1169,6903,6904],{"class":1218},"active_users",[1169,6906,1222],{"class":1214},[1169,6908,1225],{"class":1204},[1169,6910,2435],{"class":1186},[1169,6912,1269],{"class":1204},[1169,6914,2441],{"class":2440},[1169,6916,1269],{"class":1204},[1169,6918,4185],{"class":1272},[1169,6920,1276],{"class":1204},[1169,6922,6525],{"class":2484},[1169,6924,2432],{"class":1204},[1169,6926,2490],{"class":1380},[1169,6928,2458],{"class":1204},[1169,6930,6199],{"class":1272},[1169,6932,6896],{"class":1204},[1169,6934,6936,6938,6941,6943,6945,6947,6949,6951,6953,6955],{"class":1171,"line":6935},95,[1169,6937,1316],{"class":1214},[1169,6939,6940],{"class":1218},"new_users_today",[1169,6942,1222],{"class":1214},[1169,6944,1225],{"class":1204},[1169,6946,2435],{"class":1186},[1169,6948,1269],{"class":1204},[1169,6950,2441],{"class":2440},[1169,6952,1269],{"class":1204},[1169,6954,4185],{"class":1272},[1169,6956,3402],{"class":1204},[1169,6958,6960,6963,6965,6968,6970,6972,6975,6978],{"class":1171,"line":6959},96,[1169,6961,6962],{"class":2484},"                date_joined__date",[1169,6964,2432],{"class":1204},[1169,6966,6967],{"class":1272},"timezone",[1169,6969,1269],{"class":1204},[1169,6971,6555],{"class":1272},[1169,6973,6974],{"class":1204},"().",[1169,6976,6977],{"class":1272},"date",[1169,6979,2464],{"class":1204},[1169,6981,6983,6986,6988],{"class":1171,"line":6982},97,[1169,6984,6985],{"class":1204},"            ).",[1169,6987,6199],{"class":1272},[1169,6989,6896],{"class":1204},[1169,6991,6993],{"class":1171,"line":6992},98,[1169,6994,5530],{"class":1204},[1169,6996,6998],{"class":1171,"line":6997},99,[1169,6999,3786],{"class":1186},[1169,7001,7003,7005,7007,7009,7011,7013,7016,7018,7020,7023,7025,7027],{"class":1171,"line":7002},100,[1169,7004,4230],{"class":1186},[1169,7006,1269],{"class":1204},[1169,7008,3049],{"class":1272},[1169,7010,1276],{"class":1204},[1169,7012,1222],{"class":1214},[1169,7014,7015],{"class":1218},"system_stats",[1169,7017,1222],{"class":1214},[1169,7019,1286],{"class":1204},[1169,7021,7022],{"class":1272}," system_stats",[1169,7024,1286],{"class":1204},[1169,7026,3744],{"class":1272},[1169,7028,2373],{"class":1204},[1030,7030,7032],{"id":7031},"inter-service-caching","Inter-Service Caching",[1077,7034,7036],{"id":7035},"api-response-caching","API Response Caching",[1159,7038,7040],{"className":1161,"code":7039,"language":1163,"meta":1164,"style":1164},"# shared/decorators.py\nfrom functools import wraps\nfrom django.core.cache import cache\nfrom django.http import JsonResponse\nimport json\nimport hashlib\nimport logging\n\nlogger = logging.getLogger(__name__)\n\ndef cache_api_response(timeout=300, cache_alias='api_cache', vary_on=None):\n    \"\"\"Decorator for caching API responses\"\"\"\n    def decorator(view_func):\n        @wraps(view_func)\n        def wrapper(request, *args, **kwargs):\n            # Generate cache key\n            cache_key_parts = [\n                request.path,\n                request.method,\n                str(sorted(request.GET.items())),\n            ]\n            \n            # Add vary_on parameters\n            if vary_on:\n                for header in vary_on:\n                    cache_key_parts.append(request.META.get(header, ''))\n            \n            cache_key = hashlib.md5(\n                '|'.join(cache_key_parts).encode()\n            ).hexdigest()\n            \n            cache_key = f\"api_response:{cache_key}\"\n            \n            # Try to get cached response\n            cached_response = cache.get(cache_key, cache_alias)\n            if cached_response is not None:\n                logger.debug(f\"API cache hit: {cache_key}\")\n                return JsonResponse(cached_response)\n            \n            # Execute view function\n            response = view_func(request, *args, **kwargs)\n            \n            # Cache successful responses\n            if hasattr(response, 'data') and response.status_code == 200:\n                cache.set(cache_key, response.data, timeout, cache_alias)\n                logger.debug(f\"API response cached: {cache_key}\")\n            \n            return response\n        \n        return wrapper\n    return decorator\n\n# Usage in views\n@cache_api_response(timeout=600, vary_on=['Authorization'])\n@api_view(['GET'])\ndef user_dashboard_data(request):\n    \"\"\"Cached dashboard data endpoint\"\"\"\n    user = request.user\n    \n    dashboard_data = {\n        'user_info': UserSerializer(user).data,\n        'recent_orders': get_recent_orders(user.id),\n        'notifications': get_user_notifications(user.id),\n        'statistics': get_user_statistics(user.id),\n    }\n    \n    return Response(dashboard_data)\n",[1166,7041,7042,7047,7059,7077,7093,7099,7105,7111,7115,7133,7137,7177,7186,7200,7214,7240,7245,7254,7266,7277,7302,7307,7311,7316,7325,7339,7375,7379,7393,7418,7426,7430,7449,7453,7458,7481,7496,7522,7537,7541,7546,7574,7578,7583,7624,7654,7679,7683,7690,7694,7701,7708,7712,7717,7747,7763,7776,7785,7799,7803,7812,7835,7859,7883,7907,7911,7915],{"__ignoreMap":1164},[1169,7043,7044],{"class":1171,"line":1172},[1169,7045,7046],{"class":1175},"# shared/decorators.py\n",[1169,7048,7049,7051,7054,7056],{"class":1171,"line":1179},[1169,7050,1879],{"class":1182},[1169,7052,7053],{"class":1186}," functools ",[1169,7055,1183],{"class":1182},[1169,7057,7058],{"class":1186}," wraps\n",[1169,7060,7061,7063,7065,7067,7069,7071,7073,7075],{"class":1171,"line":1190},[1169,7062,1879],{"class":1182},[1169,7064,2182],{"class":1186},[1169,7066,1269],{"class":1204},[1169,7068,2237],{"class":1186},[1169,7070,1269],{"class":1204},[1169,7072,2197],{"class":1186},[1169,7074,1183],{"class":1182},[1169,7076,3128],{"class":1186},[1169,7078,7079,7081,7083,7085,7088,7090],{"class":1171,"line":1197},[1169,7080,1879],{"class":1182},[1169,7082,2182],{"class":1186},[1169,7084,1269],{"class":1204},[1169,7086,7087],{"class":1186},"http ",[1169,7089,1183],{"class":1182},[1169,7091,7092],{"class":1186}," JsonResponse\n",[1169,7094,7095,7097],{"class":1171,"line":1211},[1169,7096,1183],{"class":1182},[1169,7098,2318],{"class":1186},[1169,7100,7101,7103],{"class":1171,"line":1230},[1169,7102,1183],{"class":1182},[1169,7104,2311],{"class":1186},[1169,7106,7107,7109],{"class":1171,"line":1254},[1169,7108,1183],{"class":1182},[1169,7110,4569],{"class":1186},[1169,7112,7113],{"class":1171,"line":1299},[1169,7114,1194],{"emptyLinePlaceholder":1193},[1169,7116,7117,7119,7121,7123,7125,7127,7129,7131],{"class":1171,"line":1313},[1169,7118,4592],{"class":1186},[1169,7120,2432],{"class":1204},[1169,7122,4597],{"class":1186},[1169,7124,1269],{"class":1204},[1169,7126,4602],{"class":1272},[1169,7128,1276],{"class":1204},[1169,7130,4608],{"class":4607},[1169,7132,2373],{"class":1204},[1169,7134,7135],{"class":1171,"line":1335},[1169,7136,1194],{"emptyLinePlaceholder":1193},[1169,7138,7139,7141,7144,7146,7149,7151,7153,7155,7158,7160,7162,7164,7166,7168,7171,7173,7175],{"class":1171,"line":1349},[1169,7140,2399],{"class":2398},[1169,7142,7143],{"class":2335}," cache_api_response",[1169,7145,1276],{"class":1204},[1169,7147,7148],{"class":2407},"timeout",[1169,7150,2432],{"class":2344},[1169,7152,3230],{"class":1362},[1169,7154,1286],{"class":1204},[1169,7156,7157],{"class":2407}," cache_alias",[1169,7159,2432],{"class":2344},[1169,7161,1222],{"class":1214},[1169,7163,1658],{"class":1218},[1169,7165,1222],{"class":1214},[1169,7167,1286],{"class":1204},[1169,7169,7170],{"class":2407}," vary_on",[1169,7172,2432],{"class":2344},[1169,7174,3993],{"class":1380},[1169,7176,2411],{"class":1204},[1169,7178,7179,7181,7184],{"class":1171,"line":1368},[1169,7180,2417],{"class":2416},[1169,7182,7183],{"class":2420},"Decorator for caching API responses",[1169,7185,2424],{"class":2416},[1169,7187,7188,7190,7193,7195,7198],{"class":1171,"line":1386},[1169,7189,3725],{"class":2398},[1169,7191,7192],{"class":2335}," decorator",[1169,7194,1276],{"class":1204},[1169,7196,7197],{"class":2407},"view_func",[1169,7199,2411],{"class":1204},[1169,7201,7202,7205,7208,7210,7212],{"class":1171,"line":1392},[1169,7203,7204],{"class":1204},"        @",[1169,7206,7207],{"class":2335},"wraps",[1169,7209,1276],{"class":1204},[1169,7211,7197],{"class":1272},[1169,7213,2373],{"class":1204},[1169,7215,7216,7219,7222,7224,7226,7228,7230,7232,7234,7236,7238],{"class":1171,"line":1413},[1169,7217,7218],{"class":2398},"        def",[1169,7220,7221],{"class":2335}," wrapper",[1169,7223,1276],{"class":1204},[1169,7225,2408],{"class":2407},[1169,7227,1286],{"class":1204},[1169,7229,2345],{"class":2344},[1169,7231,2672],{"class":2407},[1169,7233,1286],{"class":1204},[1169,7235,2677],{"class":2344},[1169,7237,2680],{"class":2407},[1169,7239,2411],{"class":1204},[1169,7241,7242],{"class":1171,"line":1434},[1169,7243,7244],{"class":1175},"            # Generate cache key\n",[1169,7246,7247,7250,7252],{"class":1171,"line":1440},[1169,7248,7249],{"class":1186},"            cache_key_parts ",[1169,7251,2432],{"class":1204},[1169,7253,2069],{"class":1204},[1169,7255,7256,7259,7261,7264],{"class":1171,"line":1461},[1169,7257,7258],{"class":1186},"                request",[1169,7260,1269],{"class":1204},[1169,7262,7263],{"class":2440},"path",[1169,7265,1251],{"class":1204},[1169,7267,7268,7270,7272,7275],{"class":1171,"line":1478},[1169,7269,7258],{"class":1186},[1169,7271,1269],{"class":1204},[1169,7273,7274],{"class":2440},"method",[1169,7276,1251],{"class":1204},[1169,7278,7279,7282,7284,7287,7289,7291,7293,7295,7297,7299],{"class":1171,"line":1498},[1169,7280,7281],{"class":3296},"                str",[1169,7283,1276],{"class":1204},[1169,7285,7286],{"class":2728},"sorted",[1169,7288,1276],{"class":1204},[1169,7290,2408],{"class":1272},[1169,7292,1269],{"class":1204},[1169,7294,2388],{"class":2897},[1169,7296,1269],{"class":1204},[1169,7298,2738],{"class":1272},[1169,7300,7301],{"class":1204},"())),\n",[1169,7303,7304],{"class":1171,"line":1504},[1169,7305,7306],{"class":1204},"            ]\n",[1169,7308,7309],{"class":1171,"line":1518},[1169,7310,6316],{"class":1186},[1169,7312,7313],{"class":1171,"line":1537},[1169,7314,7315],{"class":1175},"            # Add vary_on parameters\n",[1169,7317,7318,7321,7323],{"class":1171,"line":1573},[1169,7319,7320],{"class":1182},"            if",[1169,7322,7170],{"class":1186},[1169,7324,2984],{"class":1204},[1169,7326,7327,7330,7333,7335,7337],{"class":1171,"line":1586},[1169,7328,7329],{"class":1182},"                for",[1169,7331,7332],{"class":1186}," header ",[1169,7334,3318],{"class":1182},[1169,7336,7170],{"class":1186},[1169,7338,2984],{"class":1204},[1169,7340,7341,7344,7346,7349,7351,7353,7355,7358,7360,7362,7364,7367,7369,7372],{"class":1171,"line":1605},[1169,7342,7343],{"class":1186},"                    cache_key_parts",[1169,7345,1269],{"class":1204},[1169,7347,7348],{"class":1272},"append",[1169,7350,1276],{"class":1204},[1169,7352,2408],{"class":1272},[1169,7354,1269],{"class":1204},[1169,7356,7357],{"class":2897},"META",[1169,7359,1269],{"class":1204},[1169,7361,2554],{"class":1272},[1169,7363,1276],{"class":1204},[1169,7365,7366],{"class":1272},"header",[1169,7368,1286],{"class":1204},[1169,7370,7371],{"class":1214}," ''",[1169,7373,7374],{"class":1204},"))\n",[1169,7376,7377],{"class":1171,"line":1610},[1169,7378,6316],{"class":1186},[1169,7380,7381,7383,7385,7387,7389,7391],{"class":1171,"line":1629},[1169,7382,6621],{"class":1186},[1169,7384,2432],{"class":1204},[1169,7386,2786],{"class":1186},[1169,7388,1269],{"class":1204},[1169,7390,2791],{"class":1272},[1169,7392,3402],{"class":1204},[1169,7394,7395,7397,7400,7402,7404,7407,7409,7412,7414,7416],{"class":1171,"line":1648},[1169,7396,1352],{"class":1214},[1169,7398,7399],{"class":1218},"|",[1169,7401,1222],{"class":1214},[1169,7403,1269],{"class":1204},[1169,7405,7406],{"class":1272},"join",[1169,7408,1276],{"class":1204},[1169,7410,7411],{"class":1272},"cache_key_parts",[1169,7413,2458],{"class":1204},[1169,7415,2801],{"class":1272},[1169,7417,2464],{"class":1204},[1169,7419,7420,7422,7424],{"class":1171,"line":1653},[1169,7421,6985],{"class":1204},[1169,7423,2807],{"class":1272},[1169,7425,2464],{"class":1204},[1169,7427,7428],{"class":1171,"line":1667},[1169,7429,6316],{"class":1186},[1169,7431,7432,7434,7436,7438,7441,7443,7445,7447],{"class":1171,"line":1686},[1169,7433,6621],{"class":1186},[1169,7435,2432],{"class":1204},[1169,7437,2816],{"class":2398},[1169,7439,7440],{"class":1218},"\"api_response:",[1169,7442,2823],{"class":2822},[1169,7444,2961],{"class":1186},[1169,7446,2828],{"class":2822},[1169,7448,2840],{"class":1218},[1169,7450,7451],{"class":1171,"line":1722},[1169,7452,6316],{"class":1186},[1169,7454,7455],{"class":1171,"line":1735},[1169,7456,7457],{"class":1175},"            # Try to get cached response\n",[1169,7459,7460,7463,7465,7467,7469,7471,7473,7475,7477,7479],{"class":1171,"line":1754},[1169,7461,7462],{"class":1186},"            cached_response ",[1169,7464,2432],{"class":1204},[1169,7466,2246],{"class":1186},[1169,7468,1269],{"class":1204},[1169,7470,2554],{"class":1272},[1169,7472,1276],{"class":1204},[1169,7474,2961],{"class":1272},[1169,7476,1286],{"class":1204},[1169,7478,7157],{"class":1272},[1169,7480,2373],{"class":1204},[1169,7482,7483,7485,7488,7490,7492,7494],{"class":1171,"line":1759},[1169,7484,7320],{"class":1182},[1169,7486,7487],{"class":1186}," cached_response ",[1169,7489,2975],{"class":2344},[1169,7491,2978],{"class":2344},[1169,7493,2981],{"class":1380},[1169,7495,2984],{"class":1204},[1169,7497,7498,7501,7503,7505,7507,7509,7512,7514,7516,7518,7520],{"class":1171,"line":1779},[1169,7499,7500],{"class":1186},"                logger",[1169,7502,1269],{"class":1204},[1169,7504,4828],{"class":1272},[1169,7506,1276],{"class":1204},[1169,7508,3454],{"class":2398},[1169,7510,7511],{"class":1218},"\"API cache hit: ",[1169,7513,2823],{"class":2822},[1169,7515,2961],{"class":1272},[1169,7517,2828],{"class":2822},[1169,7519,2819],{"class":1218},[1169,7521,2373],{"class":1204},[1169,7523,7524,7527,7530,7532,7535],{"class":1171,"line":1798},[1169,7525,7526],{"class":1182},"                return",[1169,7528,7529],{"class":1272}," JsonResponse",[1169,7531,1276],{"class":1204},[1169,7533,7534],{"class":1272},"cached_response",[1169,7536,2373],{"class":1204},[1169,7538,7539],{"class":1171,"line":1804},[1169,7540,6316],{"class":1186},[1169,7542,7543],{"class":1171,"line":1810},[1169,7544,7545],{"class":1175},"            # Execute view function\n",[1169,7547,7548,7551,7553,7556,7558,7560,7562,7564,7566,7568,7570,7572],{"class":1171,"line":1815},[1169,7549,7550],{"class":1186},"            response ",[1169,7552,2432],{"class":1204},[1169,7554,7555],{"class":1272}," view_func",[1169,7557,1276],{"class":1204},[1169,7559,2408],{"class":1272},[1169,7561,1286],{"class":1204},[1169,7563,2345],{"class":2344},[1169,7565,2672],{"class":1272},[1169,7567,1286],{"class":1204},[1169,7569,2677],{"class":2344},[1169,7571,2680],{"class":1272},[1169,7573,2373],{"class":1204},[1169,7575,7576],{"class":1171,"line":1821},[1169,7577,6316],{"class":1186},[1169,7579,7580],{"class":1171,"line":1837},[1169,7581,7582],{"class":1175},"            # Cache successful responses\n",[1169,7584,7585,7587,7590,7592,7595,7597,7599,7601,7603,7605,7608,7611,7613,7616,7619,7622],{"class":1171,"line":1851},[1169,7586,7320],{"class":1182},[1169,7588,7589],{"class":2728}," hasattr",[1169,7591,1276],{"class":1204},[1169,7593,7594],{"class":1272},"response",[1169,7596,1286],{"class":1204},[1169,7598,1243],{"class":1214},[1169,7600,2510],{"class":1218},[1169,7602,1222],{"class":1214},[1169,7604,2351],{"class":1204},[1169,7606,7607],{"class":2344}," and",[1169,7609,7610],{"class":1186}," response",[1169,7612,1269],{"class":1204},[1169,7614,7615],{"class":2440},"status_code",[1169,7617,7618],{"class":2344}," ==",[1169,7620,7621],{"class":1362}," 200",[1169,7623,2984],{"class":1204},[1169,7625,7626,7628,7630,7632,7634,7636,7638,7640,7642,7644,7646,7648,7650,7652],{"class":1171,"line":2939},[1169,7627,6377],{"class":1186},[1169,7629,1269],{"class":1204},[1169,7631,3049],{"class":1272},[1169,7633,1276],{"class":1204},[1169,7635,2961],{"class":1272},[1169,7637,1286],{"class":1204},[1169,7639,7610],{"class":1272},[1169,7641,1269],{"class":1204},[1169,7643,2510],{"class":2440},[1169,7645,1286],{"class":1204},[1169,7647,3744],{"class":1272},[1169,7649,1286],{"class":1204},[1169,7651,7157],{"class":1272},[1169,7653,2373],{"class":1204},[1169,7655,7656,7658,7660,7662,7664,7666,7669,7671,7673,7675,7677],{"class":1171,"line":2945},[1169,7657,7500],{"class":1186},[1169,7659,1269],{"class":1204},[1169,7661,4828],{"class":1272},[1169,7663,1276],{"class":1204},[1169,7665,3454],{"class":2398},[1169,7667,7668],{"class":1218},"\"API response cached: ",[1169,7670,2823],{"class":2822},[1169,7672,2961],{"class":1272},[1169,7674,2828],{"class":2822},[1169,7676,2819],{"class":1218},[1169,7678,2373],{"class":1204},[1169,7680,7681],{"class":1171,"line":2966},[1169,7682,6316],{"class":1186},[1169,7684,7685,7687],{"class":1171,"line":2987},[1169,7686,3831],{"class":1182},[1169,7688,7689],{"class":1186}," response\n",[1169,7691,7692],{"class":1171,"line":3002},[1169,7693,3786],{"class":1186},[1169,7695,7696,7698],{"class":1171,"line":3007},[1169,7697,2990],{"class":1182},[1169,7699,7700],{"class":1186}," wrapper\n",[1169,7702,7703,7705],{"class":1171,"line":3013},[1169,7704,2497],{"class":1182},[1169,7706,7707],{"class":1186}," decorator\n",[1169,7709,7710],{"class":1171,"line":3030},[1169,7711,1194],{"emptyLinePlaceholder":1193},[1169,7713,7714],{"class":1171,"line":3035},[1169,7715,7716],{"class":1175},"# Usage in views\n",[1169,7718,7719,7721,7724,7726,7728,7730,7732,7734,7736,7739,7741,7743,7745],{"class":1171,"line":3041},[1169,7720,2332],{"class":1204},[1169,7722,7723],{"class":2335},"cache_api_response",[1169,7725,1276],{"class":1204},[1169,7727,7148],{"class":2484},[1169,7729,2432],{"class":1204},[1169,7731,4002],{"class":1362},[1169,7733,1286],{"class":1204},[1169,7735,7170],{"class":2484},[1169,7737,7738],{"class":1204},"=[",[1169,7740,1222],{"class":1214},[1169,7742,2368],{"class":1218},[1169,7744,1222],{"class":1214},[1169,7746,2393],{"class":1204},[1169,7748,7749,7751,7753,7755,7757,7759,7761],{"class":1171,"line":3068},[1169,7750,2332],{"class":1204},[1169,7752,2380],{"class":2335},[1169,7754,2383],{"class":1204},[1169,7756,1222],{"class":1214},[1169,7758,2388],{"class":1218},[1169,7760,1222],{"class":1214},[1169,7762,2393],{"class":1204},[1169,7764,7765,7767,7770,7772,7774],{"class":1171,"line":3073},[1169,7766,2399],{"class":2398},[1169,7768,7769],{"class":2335}," user_dashboard_data",[1169,7771,1276],{"class":1204},[1169,7773,2408],{"class":2407},[1169,7775,2411],{"class":1204},[1169,7777,7778,7780,7783],{"class":1171,"line":4397},[1169,7779,2417],{"class":2416},[1169,7781,7782],{"class":2420},"Cached dashboard data endpoint",[1169,7784,2424],{"class":2416},[1169,7786,7787,7790,7792,7794,7796],{"class":1171,"line":4403},[1169,7788,7789],{"class":1186},"    user ",[1169,7791,2432],{"class":1204},[1169,7793,2892],{"class":1186},[1169,7795,1269],{"class":1204},[1169,7797,7798],{"class":2440},"user\n",[1169,7800,7801],{"class":1171,"line":4408},[1169,7802,2936],{"class":1186},[1169,7804,7805,7808,7810],{"class":1171,"line":4414},[1169,7806,7807],{"class":1186},"    dashboard_data ",[1169,7809,2432],{"class":1204},[1169,7811,1208],{"class":1204},[1169,7813,7814,7816,7819,7821,7823,7825,7827,7829,7831,7833],{"class":1171,"line":4430},[1169,7815,1233],{"class":1214},[1169,7817,7818],{"class":1218},"user_info",[1169,7820,1222],{"class":1214},[1169,7822,1225],{"class":1204},[1169,7824,2474],{"class":1272},[1169,7826,1276],{"class":1204},[1169,7828,3357],{"class":1272},[1169,7830,2458],{"class":1204},[1169,7832,2510],{"class":2440},[1169,7834,1251],{"class":1204},[1169,7836,7837,7839,7842,7844,7846,7849,7851,7853,7855,7857],{"class":1171,"line":4450},[1169,7838,1233],{"class":1214},[1169,7840,7841],{"class":1218},"recent_orders",[1169,7843,1222],{"class":1214},[1169,7845,1225],{"class":1204},[1169,7847,7848],{"class":1272}," get_recent_orders",[1169,7850,1276],{"class":1204},[1169,7852,3357],{"class":1272},[1169,7854,1269],{"class":1204},[1169,7856,3366],{"class":2440},[1169,7858,1296],{"class":1204},[1169,7860,7861,7863,7866,7868,7870,7873,7875,7877,7879,7881],{"class":1171,"line":4456},[1169,7862,1233],{"class":1214},[1169,7864,7865],{"class":1218},"notifications",[1169,7867,1222],{"class":1214},[1169,7869,1225],{"class":1204},[1169,7871,7872],{"class":1272}," get_user_notifications",[1169,7874,1276],{"class":1204},[1169,7876,3357],{"class":1272},[1169,7878,1269],{"class":1204},[1169,7880,3366],{"class":2440},[1169,7882,1296],{"class":1204},[1169,7884,7885,7887,7890,7892,7894,7897,7899,7901,7903,7905],{"class":1171,"line":4505},[1169,7886,1233],{"class":1214},[1169,7888,7889],{"class":1218},"statistics",[1169,7891,1222],{"class":1214},[1169,7893,1225],{"class":1204},[1169,7895,7896],{"class":1272}," get_user_statistics",[1169,7898,1276],{"class":1204},[1169,7900,3357],{"class":1272},[1169,7902,1269],{"class":1204},[1169,7904,3366],{"class":2440},[1169,7906,1296],{"class":1204},[1169,7908,7909],{"class":1171,"line":4513},[1169,7910,1801],{"class":1204},[1169,7912,7913],{"class":1171,"line":5401},[1169,7914,2936],{"class":1186},[1169,7916,7917,7919,7921,7923,7926],{"class":1171,"line":5420},[1169,7918,2497],{"class":1182},[1169,7920,2500],{"class":1272},[1169,7922,1276],{"class":1204},[1169,7924,7925],{"class":1272},"dashboard_data",[1169,7927,2373],{"class":1204},[1077,7929,7931],{"id":7930},"service-to-service-caching","Service-to-Service Caching",[1159,7933,7935],{"className":1161,"code":7934,"language":1163,"meta":1164,"style":1164},"# shared/service_client.py\nimport requests\nfrom django.core.cache import cache\nfrom django.conf import settings\nimport logging\nimport time\n\nlogger = logging.getLogger(__name__)\n\nclass CachedServiceClient:\n    \"\"\"HTTP client with caching for inter-service communication\"\"\"\n    \n    def __init__(self, base_url, cache_timeout=300, cache_alias='default'):\n        self.base_url = base_url.rstrip('/')\n        self.cache_timeout = cache_timeout\n        self.cache_alias = cache_alias\n        self.session = requests.Session()\n        \n        # Set default headers\n        self.session.headers.update({\n            'Content-Type': 'application/json',\n            'User-Agent': f'{settings.SERVICE_NAME}/1.0'\n        })\n    \n    def get(self, endpoint, params=None, cache_timeout=None, use_cache=True):\n        \"\"\"GET request with caching\"\"\"\n        url = f\"{self.base_url}/{endpoint.lstrip('/')}\"\n        \n        if not use_cache:\n            return self._make_request('GET', url, params=params)\n        \n        # Generate cache key\n        cache_key = self._generate_cache_key('GET', url, params)\n        \n        # Try cache first\n        cached_response = cache.get(cache_key, cache_alias=self.cache_alias)\n        if cached_response is not None:\n            logger.debug(f\"Service cache hit: {cache_key}\")\n            return cached_response\n        \n        # Make request\n        response_data = self._make_request('GET', url, params=params)\n        \n        # Cache successful responses\n        if response_data.get('status_code') == 200:\n            timeout = cache_timeout or self.cache_timeout\n            cache.set(cache_key, response_data, timeout, self.cache_alias)\n            logger.debug(f\"Service response cached: {cache_key}\")\n        \n        return response_data\n    \n    def post(self, endpoint, data=None, invalidate_cache_patterns=None):\n        \"\"\"POST request with cache invalidation\"\"\"\n        url = f\"{self.base_url}/{endpoint.lstrip('/')}\"\n        \n        response_data = self._make_request('POST', url, json=data)\n        \n        # Invalidate related cache entries\n        if invalidate_cache_patterns and response_data.get('status_code') in [200, 201]:\n            self._invalidate_cache_patterns(invalidate_cache_patterns)\n        \n        return response_data\n    \n    def _make_request(self, method, url, **kwargs):\n        \"\"\"Make HTTP request with error handling\"\"\"\n        try:\n            response = self.session.request(method, url, timeout=10, **kwargs)\n            \n            return {\n                'status_code': response.status_code,\n                'data': response.json() if response.content else None,\n                'headers': dict(response.headers)\n            }\n        \n        except requests.RequestException as e:\n            logger.error(f\"Service request failed: {method} {url} - {e}\")\n            return {\n                'status_code': 500,\n                'error': str(e),\n                'data': None\n            }\n    \n    def _generate_cache_key(self, method, url, params=None):\n        \"\"\"Generate consistent cache key\"\"\"\n        key_parts = [method, url]\n        if params:\n            key_parts.append(str(sorted(params.items())))\n        \n        key_string = '|'.join(key_parts)\n        return f\"service_request:{hashlib.md5(key_string.encode()).hexdigest()}\"\n    \n    def _invalidate_cache_patterns(self, patterns):\n        \"\"\"Invalidate cache entries matching patterns\"\"\"\n        for pattern in patterns:\n            # Simple pattern matching - in production, use Redis SCAN\n            cache_keys = cache.keys(f\"service_request:*{pattern}*\")\n            if cache_keys:\n                cache.delete_many(cache_keys)\n                logger.debug(f\"Invalidated {len(cache_keys)} cache entries for pattern: {pattern}\")\n\n# Service clients\nuser_service_client = CachedServiceClient(\n    base_url=settings.USER_SERVICE_URL,\n    cache_timeout=600\n)\n\norder_service_client = CachedServiceClient(\n    base_url=settings.ORDER_SERVICE_URL,\n    cache_timeout=300\n)\n\n# Usage in services\ndef get_user_profile(user_id):\n    \"\"\"Get user profile from user service with caching\"\"\"\n    response = user_service_client.get(\n        f'/api/users/{user_id}/',\n        cache_timeout=1800  # Cache for 30 minutes\n    )\n    \n    if response['status_code'] == 200:\n        return response['data']\n    else:\n        logger.error(f\"Failed to get user profile: {response}\")\n        return None\n\ndef create_order(order_data):\n    \"\"\"Create order and invalidate related caches\"\"\"\n    response = order_service_client.post(\n        '/api/orders/',\n        data=order_data,\n        invalidate_cache_patterns=['orders', f\"user_{order_data['user_id']}\"]\n    )\n    \n    return response\n",[1166,7936,7937,7942,7949,7967,7983,7989,7995,7999,8017,8021,8030,8039,8043,8080,8109,8122,8136,8157,8161,8166,8187,8207,8237,8242,8246,8289,8298,8345,8349,8359,8394,8398,8403,8434,8438,8442,8473,8487,8512,8519,8523,8528,8563,8567,8572,8599,8618,8648,8673,8677,8684,8688,8723,8732,8776,8780,8815,8819,8824,8866,8882,8886,8892,8896,8924,8933,8939,8980,8984,8990,9008,9044,9067,9071,9075,9094,9137,9143,9158,9176,9188,9192,9196,9225,9234,9251,9259,9288,9292,9316,9352,9356,9374,9383,9396,9401,9433,9441,9456,9497,9501,9507,9519,9536,9547,9552,9557,9569,9585,9595,9600,9605,9610,9623,9633,9650,9669,9682,9688,9693,9716,9733,9741,9767,9774,9779,9794,9804,9821,9833,9845,9887,9892,9897],{"__ignoreMap":1164},[1169,7938,7939],{"class":1171,"line":1172},[1169,7940,7941],{"class":1175},"# shared/service_client.py\n",[1169,7943,7944,7946],{"class":1171,"line":1179},[1169,7945,1183],{"class":1182},[1169,7947,7948],{"class":1186}," requests\n",[1169,7950,7951,7953,7955,7957,7959,7961,7963,7965],{"class":1171,"line":1190},[1169,7952,1879],{"class":1182},[1169,7954,2182],{"class":1186},[1169,7956,1269],{"class":1204},[1169,7958,2237],{"class":1186},[1169,7960,1269],{"class":1204},[1169,7962,2197],{"class":1186},[1169,7964,1183],{"class":1182},[1169,7966,3128],{"class":1186},[1169,7968,7969,7971,7973,7975,7978,7980],{"class":1171,"line":1197},[1169,7970,1879],{"class":1182},[1169,7972,2182],{"class":1186},[1169,7974,1269],{"class":1204},[1169,7976,7977],{"class":1186},"conf ",[1169,7979,1183],{"class":1182},[1169,7981,7982],{"class":1186}," settings\n",[1169,7984,7985,7987],{"class":1171,"line":1211},[1169,7986,1183],{"class":1182},[1169,7988,4569],{"class":1186},[1169,7990,7991,7993],{"class":1171,"line":1230},[1169,7992,1183],{"class":1182},[1169,7994,4583],{"class":1186},[1169,7996,7997],{"class":1171,"line":1254},[1169,7998,1194],{"emptyLinePlaceholder":1193},[1169,8000,8001,8003,8005,8007,8009,8011,8013,8015],{"class":1171,"line":1299},[1169,8002,4592],{"class":1186},[1169,8004,2432],{"class":1204},[1169,8006,4597],{"class":1186},[1169,8008,1269],{"class":1204},[1169,8010,4602],{"class":1272},[1169,8012,1276],{"class":1204},[1169,8014,4608],{"class":4607},[1169,8016,2373],{"class":1204},[1169,8018,8019],{"class":1171,"line":1313},[1169,8020,1194],{"emptyLinePlaceholder":1193},[1169,8022,8023,8025,8028],{"class":1171,"line":1335},[1169,8024,2595],{"class":2398},[1169,8026,8027],{"class":2598}," CachedServiceClient",[1169,8029,2984],{"class":1204},[1169,8031,8032,8034,8037],{"class":1171,"line":1349},[1169,8033,2417],{"class":2416},[1169,8035,8036],{"class":2420},"HTTP client with caching for inter-service communication",[1169,8038,2424],{"class":2416},[1169,8040,8041],{"class":1171,"line":1368},[1169,8042,2936],{"class":1186},[1169,8044,8045,8047,8049,8051,8053,8055,8058,8060,8062,8064,8066,8068,8070,8072,8074,8076,8078],{"class":1171,"line":1386},[1169,8046,3725],{"class":2398},[1169,8048,4643],{"class":2728},[1169,8050,1276],{"class":1204},[1169,8052,3734],{"class":3733},[1169,8054,1286],{"class":1204},[1169,8056,8057],{"class":2407}," base_url",[1169,8059,1286],{"class":1204},[1169,8061,3225],{"class":2407},[1169,8063,2432],{"class":2344},[1169,8065,3230],{"class":1362},[1169,8067,1286],{"class":1204},[1169,8069,7157],{"class":2407},[1169,8071,2432],{"class":2344},[1169,8073,1222],{"class":1214},[1169,8075,1219],{"class":1218},[1169,8077,1222],{"class":1214},[1169,8079,2411],{"class":1204},[1169,8081,8082,8084,8086,8089,8091,8093,8095,8098,8100,8102,8105,8107],{"class":1171,"line":1392},[1169,8083,4680],{"class":1200},[1169,8085,1269],{"class":1204},[1169,8087,8088],{"class":2440},"base_url",[1169,8090,1205],{"class":1204},[1169,8092,8057],{"class":1186},[1169,8094,1269],{"class":1204},[1169,8096,8097],{"class":1272},"rstrip",[1169,8099,1276],{"class":1204},[1169,8101,1222],{"class":1214},[1169,8103,8104],{"class":1218},"/",[1169,8106,1222],{"class":1214},[1169,8108,2373],{"class":1204},[1169,8110,8111,8113,8115,8117,8119],{"class":1171,"line":1413},[1169,8112,4680],{"class":1200},[1169,8114,1269],{"class":1204},[1169,8116,5978],{"class":2440},[1169,8118,1205],{"class":1204},[1169,8120,8121],{"class":1186}," cache_timeout\n",[1169,8123,8124,8126,8128,8131,8133],{"class":1171,"line":1434},[1169,8125,4680],{"class":1200},[1169,8127,1269],{"class":1204},[1169,8129,8130],{"class":2440},"cache_alias",[1169,8132,1205],{"class":1204},[1169,8134,8135],{"class":1186}," cache_alias\n",[1169,8137,8138,8140,8142,8145,8147,8150,8152,8155],{"class":1171,"line":1440},[1169,8139,4680],{"class":1200},[1169,8141,1269],{"class":1204},[1169,8143,8144],{"class":2440},"session",[1169,8146,1205],{"class":1204},[1169,8148,8149],{"class":1186}," requests",[1169,8151,1269],{"class":1204},[1169,8153,8154],{"class":1272},"Session",[1169,8156,2464],{"class":1204},[1169,8158,8159],{"class":1171,"line":1461},[1169,8160,3786],{"class":1186},[1169,8162,8163],{"class":1171,"line":1478},[1169,8164,8165],{"class":1175},"        # Set default headers\n",[1169,8167,8168,8170,8172,8174,8176,8179,8181,8184],{"class":1171,"line":1498},[1169,8169,4680],{"class":1200},[1169,8171,1269],{"class":1204},[1169,8173,8144],{"class":2440},[1169,8175,1269],{"class":1204},[1169,8177,8178],{"class":2440},"headers",[1169,8180,1269],{"class":1204},[1169,8182,8183],{"class":1272},"update",[1169,8185,8186],{"class":1204},"({\n",[1169,8188,8189,8191,8194,8196,8198,8200,8203,8205],{"class":1171,"line":1504},[1169,8190,1316],{"class":1214},[1169,8192,8193],{"class":1218},"Content-Type",[1169,8195,1222],{"class":1214},[1169,8197,1225],{"class":1204},[1169,8199,1243],{"class":1214},[1169,8201,8202],{"class":1218},"application/json",[1169,8204,1222],{"class":1214},[1169,8206,1251],{"class":1204},[1169,8208,8209,8211,8214,8216,8218,8220,8222,8224,8227,8229,8232,8234],{"class":1171,"line":1518},[1169,8210,1316],{"class":1214},[1169,8212,8213],{"class":1218},"User-Agent",[1169,8215,1222],{"class":1214},[1169,8217,1225],{"class":1204},[1169,8219,2816],{"class":2398},[1169,8221,1222],{"class":1218},[1169,8223,2823],{"class":2822},[1169,8225,8226],{"class":1272},"settings",[1169,8228,1269],{"class":1204},[1169,8230,8231],{"class":2897},"SERVICE_NAME",[1169,8233,2828],{"class":2822},[1169,8235,8236],{"class":1218},"/1.0'\n",[1169,8238,8239],{"class":1171,"line":1537},[1169,8240,8241],{"class":1204},"        })\n",[1169,8243,8244],{"class":1171,"line":1573},[1169,8245,2936],{"class":1186},[1169,8247,8248,8250,8252,8254,8256,8258,8261,8263,8266,8268,8270,8272,8274,8276,8278,8280,8283,8285,8287],{"class":1171,"line":1586},[1169,8249,3725],{"class":2398},[1169,8251,4757],{"class":2335},[1169,8253,1276],{"class":1204},[1169,8255,3734],{"class":3733},[1169,8257,1286],{"class":1204},[1169,8259,8260],{"class":2407}," endpoint",[1169,8262,1286],{"class":1204},[1169,8264,8265],{"class":2407}," params",[1169,8267,2432],{"class":2344},[1169,8269,3993],{"class":1380},[1169,8271,1286],{"class":1204},[1169,8273,3225],{"class":2407},[1169,8275,2432],{"class":2344},[1169,8277,3993],{"class":1380},[1169,8279,1286],{"class":1204},[1169,8281,8282],{"class":2407}," use_cache",[1169,8284,2432],{"class":2344},[1169,8286,2490],{"class":1380},[1169,8288,2411],{"class":1204},[1169,8290,8291,8293,8296],{"class":1171,"line":1605},[1169,8292,3756],{"class":2416},[1169,8294,8295],{"class":2420},"GET request with caching",[1169,8297,2424],{"class":2416},[1169,8299,8300,8303,8305,8307,8309,8311,8313,8315,8317,8319,8321,8323,8326,8328,8331,8333,8335,8337,8339,8341,8343],{"class":1171,"line":1610},[1169,8301,8302],{"class":1186},"        url ",[1169,8304,2432],{"class":1204},[1169,8306,2816],{"class":2398},[1169,8308,2819],{"class":1218},[1169,8310,2823],{"class":2822},[1169,8312,3734],{"class":1200},[1169,8314,1269],{"class":1204},[1169,8316,8088],{"class":2440},[1169,8318,2828],{"class":2822},[1169,8320,8104],{"class":1218},[1169,8322,2823],{"class":2822},[1169,8324,8325],{"class":1186},"endpoint",[1169,8327,1269],{"class":1204},[1169,8329,8330],{"class":1272},"lstrip",[1169,8332,1276],{"class":1204},[1169,8334,1222],{"class":1214},[1169,8336,8104],{"class":1218},[1169,8338,1222],{"class":1214},[1169,8340,2351],{"class":1204},[1169,8342,2828],{"class":2822},[1169,8344,2840],{"class":1218},[1169,8346,8347],{"class":1171,"line":1629},[1169,8348,3786],{"class":1186},[1169,8350,8351,8353,8355,8357],{"class":1171,"line":1648},[1169,8352,3815],{"class":1182},[1169,8354,2978],{"class":2344},[1169,8356,8282],{"class":1186},[1169,8358,2984],{"class":1204},[1169,8360,8361,8363,8365,8367,8370,8372,8374,8376,8378,8380,8383,8385,8387,8389,8392],{"class":1171,"line":1653},[1169,8362,3831],{"class":1182},[1169,8364,3860],{"class":1200},[1169,8366,1269],{"class":1204},[1169,8368,8369],{"class":1272},"_make_request",[1169,8371,1276],{"class":1204},[1169,8373,1222],{"class":1214},[1169,8375,2388],{"class":1218},[1169,8377,1222],{"class":1214},[1169,8379,1286],{"class":1204},[1169,8381,8382],{"class":1272}," url",[1169,8384,1286],{"class":1204},[1169,8386,8265],{"class":2484},[1169,8388,2432],{"class":1204},[1169,8390,8391],{"class":1272},"params",[1169,8393,2373],{"class":1204},[1169,8395,8396],{"class":1171,"line":1667},[1169,8397,3786],{"class":1186},[1169,8399,8400],{"class":1171,"line":1686},[1169,8401,8402],{"class":1175},"        # Generate cache key\n",[1169,8404,8405,8407,8409,8411,8413,8416,8418,8420,8422,8424,8426,8428,8430,8432],{"class":1171,"line":1722},[1169,8406,3766],{"class":1186},[1169,8408,2432],{"class":1204},[1169,8410,3860],{"class":1200},[1169,8412,1269],{"class":1204},[1169,8414,8415],{"class":1272},"_generate_cache_key",[1169,8417,1276],{"class":1204},[1169,8419,1222],{"class":1214},[1169,8421,2388],{"class":1218},[1169,8423,1222],{"class":1214},[1169,8425,1286],{"class":1204},[1169,8427,8382],{"class":1272},[1169,8429,1286],{"class":1204},[1169,8431,8265],{"class":1272},[1169,8433,2373],{"class":1204},[1169,8435,8436],{"class":1171,"line":1735},[1169,8437,3786],{"class":1186},[1169,8439,8440],{"class":1171,"line":1754},[1169,8441,3791],{"class":1175},[1169,8443,8444,8447,8449,8451,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471],{"class":1171,"line":1759},[1169,8445,8446],{"class":1186},"        cached_response ",[1169,8448,2432],{"class":1204},[1169,8450,2246],{"class":1186},[1169,8452,1269],{"class":1204},[1169,8454,2554],{"class":1272},[1169,8456,1276],{"class":1204},[1169,8458,2961],{"class":1272},[1169,8460,1286],{"class":1204},[1169,8462,7157],{"class":2484},[1169,8464,2432],{"class":1204},[1169,8466,3734],{"class":1200},[1169,8468,1269],{"class":1204},[1169,8470,8130],{"class":2440},[1169,8472,2373],{"class":1204},[1169,8474,8475,8477,8479,8481,8483,8485],{"class":1171,"line":1779},[1169,8476,3815],{"class":1182},[1169,8478,7487],{"class":1186},[1169,8480,2975],{"class":2344},[1169,8482,2978],{"class":2344},[1169,8484,2981],{"class":1380},[1169,8486,2984],{"class":1204},[1169,8488,8489,8491,8493,8495,8497,8499,8502,8504,8506,8508,8510],{"class":1171,"line":1798},[1169,8490,4823],{"class":1186},[1169,8492,1269],{"class":1204},[1169,8494,4828],{"class":1272},[1169,8496,1276],{"class":1204},[1169,8498,3454],{"class":2398},[1169,8500,8501],{"class":1218},"\"Service cache hit: ",[1169,8503,2823],{"class":2822},[1169,8505,2961],{"class":1272},[1169,8507,2828],{"class":2822},[1169,8509,2819],{"class":1218},[1169,8511,2373],{"class":1204},[1169,8513,8514,8516],{"class":1171,"line":1804},[1169,8515,3831],{"class":1182},[1169,8517,8518],{"class":1186}," cached_response\n",[1169,8520,8521],{"class":1171,"line":1810},[1169,8522,3786],{"class":1186},[1169,8524,8525],{"class":1171,"line":1815},[1169,8526,8527],{"class":1175},"        # Make request\n",[1169,8529,8530,8533,8535,8537,8539,8541,8543,8545,8547,8549,8551,8553,8555,8557,8559,8561],{"class":1171,"line":1821},[1169,8531,8532],{"class":1186},"        response_data ",[1169,8534,2432],{"class":1204},[1169,8536,3860],{"class":1200},[1169,8538,1269],{"class":1204},[1169,8540,8369],{"class":1272},[1169,8542,1276],{"class":1204},[1169,8544,1222],{"class":1214},[1169,8546,2388],{"class":1218},[1169,8548,1222],{"class":1214},[1169,8550,1286],{"class":1204},[1169,8552,8382],{"class":1272},[1169,8554,1286],{"class":1204},[1169,8556,8265],{"class":2484},[1169,8558,2432],{"class":1204},[1169,8560,8391],{"class":1272},[1169,8562,2373],{"class":1204},[1169,8564,8565],{"class":1171,"line":1837},[1169,8566,3786],{"class":1186},[1169,8568,8569],{"class":1171,"line":1851},[1169,8570,8571],{"class":1175},"        # Cache successful responses\n",[1169,8573,8574,8576,8579,8581,8583,8585,8587,8589,8591,8593,8595,8597],{"class":1171,"line":2939},[1169,8575,3815],{"class":1182},[1169,8577,8578],{"class":1186}," response_data",[1169,8580,1269],{"class":1204},[1169,8582,2554],{"class":1272},[1169,8584,1276],{"class":1204},[1169,8586,1222],{"class":1214},[1169,8588,7615],{"class":1218},[1169,8590,1222],{"class":1214},[1169,8592,2351],{"class":1204},[1169,8594,7618],{"class":2344},[1169,8596,7621],{"class":1362},[1169,8598,2984],{"class":1204},[1169,8600,8601,8604,8606,8609,8611,8613,8615],{"class":1171,"line":2945},[1169,8602,8603],{"class":1186},"            timeout ",[1169,8605,2432],{"class":1204},[1169,8607,8608],{"class":1186}," cache_timeout ",[1169,8610,4026],{"class":2344},[1169,8612,3860],{"class":1200},[1169,8614,1269],{"class":1204},[1169,8616,8617],{"class":2440},"cache_timeout\n",[1169,8619,8620,8622,8624,8626,8628,8630,8632,8634,8636,8638,8640,8642,8644,8646],{"class":1171,"line":2966},[1169,8621,3891],{"class":1186},[1169,8623,1269],{"class":1204},[1169,8625,3049],{"class":1272},[1169,8627,1276],{"class":1204},[1169,8629,2961],{"class":1272},[1169,8631,1286],{"class":1204},[1169,8633,8578],{"class":1272},[1169,8635,1286],{"class":1204},[1169,8637,3744],{"class":1272},[1169,8639,1286],{"class":1204},[1169,8641,3860],{"class":1200},[1169,8643,1269],{"class":1204},[1169,8645,8130],{"class":2440},[1169,8647,2373],{"class":1204},[1169,8649,8650,8652,8654,8656,8658,8660,8663,8665,8667,8669,8671],{"class":1171,"line":2987},[1169,8651,4823],{"class":1186},[1169,8653,1269],{"class":1204},[1169,8655,4828],{"class":1272},[1169,8657,1276],{"class":1204},[1169,8659,3454],{"class":2398},[1169,8661,8662],{"class":1218},"\"Service response cached: ",[1169,8664,2823],{"class":2822},[1169,8666,2961],{"class":1272},[1169,8668,2828],{"class":2822},[1169,8670,2819],{"class":1218},[1169,8672,2373],{"class":1204},[1169,8674,8675],{"class":1171,"line":3002},[1169,8676,3786],{"class":1186},[1169,8678,8679,8681],{"class":1171,"line":3007},[1169,8680,2990],{"class":1182},[1169,8682,8683],{"class":1186}," response_data\n",[1169,8685,8686],{"class":1171,"line":3013},[1169,8687,2936],{"class":1186},[1169,8689,8690,8692,8695,8697,8699,8701,8703,8705,8708,8710,8712,8714,8717,8719,8721],{"class":1171,"line":3030},[1169,8691,3725],{"class":2398},[1169,8693,8694],{"class":2335}," post",[1169,8696,1276],{"class":1204},[1169,8698,3734],{"class":3733},[1169,8700,1286],{"class":1204},[1169,8702,8260],{"class":2407},[1169,8704,1286],{"class":1204},[1169,8706,8707],{"class":2407}," data",[1169,8709,2432],{"class":2344},[1169,8711,3993],{"class":1380},[1169,8713,1286],{"class":1204},[1169,8715,8716],{"class":2407}," invalidate_cache_patterns",[1169,8718,2432],{"class":2344},[1169,8720,3993],{"class":1380},[1169,8722,2411],{"class":1204},[1169,8724,8725,8727,8730],{"class":1171,"line":3035},[1169,8726,3756],{"class":2416},[1169,8728,8729],{"class":2420},"POST request with cache invalidation",[1169,8731,2424],{"class":2416},[1169,8733,8734,8736,8738,8740,8742,8744,8746,8748,8750,8752,8754,8756,8758,8760,8762,8764,8766,8768,8770,8772,8774],{"class":1171,"line":3041},[1169,8735,8302],{"class":1186},[1169,8737,2432],{"class":1204},[1169,8739,2816],{"class":2398},[1169,8741,2819],{"class":1218},[1169,8743,2823],{"class":2822},[1169,8745,3734],{"class":1200},[1169,8747,1269],{"class":1204},[1169,8749,8088],{"class":2440},[1169,8751,2828],{"class":2822},[1169,8753,8104],{"class":1218},[1169,8755,2823],{"class":2822},[1169,8757,8325],{"class":1186},[1169,8759,1269],{"class":1204},[1169,8761,8330],{"class":1272},[1169,8763,1276],{"class":1204},[1169,8765,1222],{"class":1214},[1169,8767,8104],{"class":1218},[1169,8769,1222],{"class":1214},[1169,8771,2351],{"class":1204},[1169,8773,2828],{"class":2822},[1169,8775,2840],{"class":1218},[1169,8777,8778],{"class":1171,"line":3068},[1169,8779,3786],{"class":1186},[1169,8781,8782,8784,8786,8788,8790,8792,8794,8796,8799,8801,8803,8805,8807,8809,8811,8813],{"class":1171,"line":3073},[1169,8783,8532],{"class":1186},[1169,8785,2432],{"class":1204},[1169,8787,3860],{"class":1200},[1169,8789,1269],{"class":1204},[1169,8791,8369],{"class":1272},[1169,8793,1276],{"class":1204},[1169,8795,1222],{"class":1214},[1169,8797,8798],{"class":1218},"POST",[1169,8800,1222],{"class":1214},[1169,8802,1286],{"class":1204},[1169,8804,8382],{"class":1272},[1169,8806,1286],{"class":1204},[1169,8808,2755],{"class":2484},[1169,8810,2432],{"class":1204},[1169,8812,2510],{"class":1272},[1169,8814,2373],{"class":1204},[1169,8816,8817],{"class":1171,"line":4397},[1169,8818,3786],{"class":1186},[1169,8820,8821],{"class":1171,"line":4403},[1169,8822,8823],{"class":1175},"        # Invalidate related cache entries\n",[1169,8825,8826,8828,8831,8834,8836,8838,8840,8842,8844,8846,8848,8850,8852,8855,8858,8860,8863],{"class":1171,"line":4408},[1169,8827,3815],{"class":1182},[1169,8829,8830],{"class":1186}," invalidate_cache_patterns ",[1169,8832,8833],{"class":2344},"and",[1169,8835,8578],{"class":1186},[1169,8837,1269],{"class":1204},[1169,8839,2554],{"class":1272},[1169,8841,1276],{"class":1204},[1169,8843,1222],{"class":1214},[1169,8845,7615],{"class":1218},[1169,8847,1222],{"class":1214},[1169,8849,2351],{"class":1204},[1169,8851,4442],{"class":2344},[1169,8853,8854],{"class":1204}," [",[1169,8856,8857],{"class":1362},"200",[1169,8859,1286],{"class":1204},[1169,8861,8862],{"class":1362}," 201",[1169,8864,8865],{"class":1204},"]:\n",[1169,8867,8868,8870,8872,8875,8877,8880],{"class":1171,"line":4414},[1169,8869,4932],{"class":1200},[1169,8871,1269],{"class":1204},[1169,8873,8874],{"class":1272},"_invalidate_cache_patterns",[1169,8876,1276],{"class":1204},[1169,8878,8879],{"class":1272},"invalidate_cache_patterns",[1169,8881,2373],{"class":1204},[1169,8883,8884],{"class":1171,"line":4430},[1169,8885,3786],{"class":1186},[1169,8887,8888,8890],{"class":1171,"line":4450},[1169,8889,2990],{"class":1182},[1169,8891,8683],{"class":1186},[1169,8893,8894],{"class":1171,"line":4456},[1169,8895,2936],{"class":1186},[1169,8897,8898,8900,8903,8905,8907,8909,8912,8914,8916,8918,8920,8922],{"class":1171,"line":4505},[1169,8899,3725],{"class":2398},[1169,8901,8902],{"class":2335}," _make_request",[1169,8904,1276],{"class":1204},[1169,8906,3734],{"class":3733},[1169,8908,1286],{"class":1204},[1169,8910,8911],{"class":2407}," method",[1169,8913,1286],{"class":1204},[1169,8915,8382],{"class":2407},[1169,8917,1286],{"class":1204},[1169,8919,2677],{"class":2344},[1169,8921,2680],{"class":2407},[1169,8923,2411],{"class":1204},[1169,8925,8926,8928,8931],{"class":1171,"line":4513},[1169,8927,3756],{"class":2416},[1169,8929,8930],{"class":2420},"Make HTTP request with error handling",[1169,8932,2424],{"class":2416},[1169,8934,8935,8937],{"class":1171,"line":5401},[1169,8936,3848],{"class":1182},[1169,8938,2984],{"class":1204},[1169,8940,8941,8943,8945,8947,8949,8951,8953,8955,8957,8959,8961,8963,8965,8967,8969,8972,8974,8976,8978],{"class":1171,"line":5420},[1169,8942,7550],{"class":1186},[1169,8944,2432],{"class":1204},[1169,8946,3860],{"class":1200},[1169,8948,1269],{"class":1204},[1169,8950,8144],{"class":2440},[1169,8952,1269],{"class":1204},[1169,8954,2408],{"class":1272},[1169,8956,1276],{"class":1204},[1169,8958,7274],{"class":1272},[1169,8960,1286],{"class":1204},[1169,8962,8382],{"class":1272},[1169,8964,1286],{"class":1204},[1169,8966,3744],{"class":2484},[1169,8968,2432],{"class":1204},[1169,8970,8971],{"class":1362},"10",[1169,8973,1286],{"class":1204},[1169,8975,2677],{"class":2344},[1169,8977,2680],{"class":1272},[1169,8979,2373],{"class":1204},[1169,8981,8982],{"class":1171,"line":5440},[1169,8983,6316],{"class":1186},[1169,8985,8986,8988],{"class":1171,"line":5460},[1169,8987,3831],{"class":1182},[1169,8989,1208],{"class":1204},[1169,8991,8992,8994,8996,8998,9000,9002,9004,9006],{"class":1171,"line":5473},[1169,8993,1352],{"class":1214},[1169,8995,7615],{"class":1218},[1169,8997,1222],{"class":1214},[1169,8999,1225],{"class":1204},[1169,9001,7610],{"class":1186},[1169,9003,1269],{"class":1204},[1169,9005,7615],{"class":2440},[1169,9007,1251],{"class":1204},[1169,9009,9010,9012,9014,9016,9018,9020,9022,9025,9027,9030,9032,9034,9037,9040,9042],{"class":1171,"line":5497},[1169,9011,1352],{"class":1214},[1169,9013,2510],{"class":1218},[1169,9015,1222],{"class":1214},[1169,9017,1225],{"class":1204},[1169,9019,7610],{"class":1186},[1169,9021,1269],{"class":1204},[1169,9023,9024],{"class":1272},"json",[1169,9026,6558],{"class":1204},[1169,9028,9029],{"class":1182}," if",[1169,9031,7610],{"class":1186},[1169,9033,1269],{"class":1204},[1169,9035,9036],{"class":2440},"content",[1169,9038,9039],{"class":1182}," else",[1169,9041,2981],{"class":1380},[1169,9043,1251],{"class":1204},[1169,9045,9046,9048,9050,9052,9054,9057,9059,9061,9063,9065],{"class":1171,"line":5521},[1169,9047,1352],{"class":1214},[1169,9049,8178],{"class":1218},[1169,9051,1222],{"class":1214},[1169,9053,1225],{"class":1204},[1169,9055,9056],{"class":3296}," dict",[1169,9058,1276],{"class":1204},[1169,9060,7594],{"class":1272},[1169,9062,1269],{"class":1204},[1169,9064,8178],{"class":2440},[1169,9066,2373],{"class":1204},[1169,9068,9069],{"class":1171,"line":5527},[1169,9070,5524],{"class":1204},[1169,9072,9073],{"class":1171,"line":5533},[1169,9074,3786],{"class":1186},[1169,9076,9077,9079,9081,9083,9086,9089,9092],{"class":1171,"line":5538},[1169,9078,3921],{"class":1182},[1169,9080,8149],{"class":1186},[1169,9082,1269],{"class":1204},[1169,9084,9085],{"class":2440},"RequestException",[1169,9087,9088],{"class":1182}," as",[1169,9090,9091],{"class":1186}," e",[1169,9093,2984],{"class":1204},[1169,9095,9096,9098,9100,9103,9105,9107,9110,9112,9114,9116,9118,9121,9123,9126,9128,9131,9133,9135],{"class":1171,"line":5544},[1169,9097,4823],{"class":1186},[1169,9099,1269],{"class":1204},[1169,9101,9102],{"class":1272},"error",[1169,9104,1276],{"class":1204},[1169,9106,3454],{"class":2398},[1169,9108,9109],{"class":1218},"\"Service request failed: ",[1169,9111,2823],{"class":2822},[1169,9113,7274],{"class":1272},[1169,9115,2828],{"class":2822},[1169,9117,3288],{"class":2822},[1169,9119,9120],{"class":1272},"url",[1169,9122,2828],{"class":2822},[1169,9124,9125],{"class":1218}," - ",[1169,9127,2823],{"class":2822},[1169,9129,9130],{"class":1272},"e",[1169,9132,2828],{"class":2822},[1169,9134,2819],{"class":1218},[1169,9136,2373],{"class":1204},[1169,9138,9139,9141],{"class":1171,"line":5569},[1169,9140,3831],{"class":1182},[1169,9142,1208],{"class":1204},[1169,9144,9145,9147,9149,9151,9153,9156],{"class":1171,"line":5577},[1169,9146,1352],{"class":1214},[1169,9148,7615],{"class":1218},[1169,9150,1222],{"class":1214},[1169,9152,1225],{"class":1204},[1169,9154,9155],{"class":1362}," 500",[1169,9157,1251],{"class":1204},[1169,9159,9160,9162,9164,9166,9168,9170,9172,9174],{"class":1171,"line":5582},[1169,9161,1352],{"class":1214},[1169,9163,9102],{"class":1218},[1169,9165,1222],{"class":1214},[1169,9167,1225],{"class":1204},[1169,9169,3297],{"class":3296},[1169,9171,1276],{"class":1204},[1169,9173,9130],{"class":1272},[1169,9175,1296],{"class":1204},[1169,9177,9178,9180,9182,9184,9186],{"class":1171,"line":5596},[1169,9179,1352],{"class":1214},[1169,9181,2510],{"class":1218},[1169,9183,1222],{"class":1214},[1169,9185,1225],{"class":1204},[1169,9187,5001],{"class":1380},[1169,9189,9190],{"class":1171,"line":6716},[1169,9191,5524],{"class":1204},[1169,9193,9194],{"class":1171,"line":6726},[1169,9195,2936],{"class":1186},[1169,9197,9198,9200,9203,9205,9207,9209,9211,9213,9215,9217,9219,9221,9223],{"class":1171,"line":6750},[1169,9199,3725],{"class":2398},[1169,9201,9202],{"class":2335}," _generate_cache_key",[1169,9204,1276],{"class":1204},[1169,9206,3734],{"class":3733},[1169,9208,1286],{"class":1204},[1169,9210,8911],{"class":2407},[1169,9212,1286],{"class":1204},[1169,9214,8382],{"class":2407},[1169,9216,1286],{"class":1204},[1169,9218,8265],{"class":2407},[1169,9220,2432],{"class":2344},[1169,9222,3993],{"class":1380},[1169,9224,2411],{"class":1204},[1169,9226,9227,9229,9232],{"class":1171,"line":6755},[1169,9228,3756],{"class":2416},[1169,9230,9231],{"class":2420},"Generate consistent cache key",[1169,9233,2424],{"class":2416},[1169,9235,9236,9239,9241,9243,9245,9247,9249],{"class":1171,"line":6761},[1169,9237,9238],{"class":1186},"        key_parts ",[1169,9240,2432],{"class":1204},[1169,9242,8854],{"class":1204},[1169,9244,7274],{"class":1186},[1169,9246,1286],{"class":1204},[1169,9248,8382],{"class":1186},[1169,9250,2112],{"class":1204},[1169,9252,9253,9255,9257],{"class":1171,"line":6781},[1169,9254,3815],{"class":1182},[1169,9256,8265],{"class":1186},[1169,9258,2984],{"class":1204},[1169,9260,9261,9264,9266,9268,9270,9273,9275,9277,9279,9281,9283,9285],{"class":1171,"line":6792},[1169,9262,9263],{"class":1186},"            key_parts",[1169,9265,1269],{"class":1204},[1169,9267,7348],{"class":1272},[1169,9269,1276],{"class":1204},[1169,9271,9272],{"class":3296},"str",[1169,9274,1276],{"class":1204},[1169,9276,7286],{"class":2728},[1169,9278,1276],{"class":1204},[1169,9280,8391],{"class":1272},[1169,9282,1269],{"class":1204},[1169,9284,2738],{"class":1272},[1169,9286,9287],{"class":1204},"())))\n",[1169,9289,9290],{"class":1171,"line":6817},[1169,9291,3786],{"class":1186},[1169,9293,9294,9297,9299,9301,9303,9305,9307,9309,9311,9314],{"class":1171,"line":6822},[1169,9295,9296],{"class":1186},"        key_string ",[1169,9298,2432],{"class":1204},[1169,9300,1243],{"class":1214},[1169,9302,7399],{"class":1218},[1169,9304,1222],{"class":1214},[1169,9306,1269],{"class":1204},[1169,9308,7406],{"class":1272},[1169,9310,1276],{"class":1204},[1169,9312,9313],{"class":1272},"key_parts",[1169,9315,2373],{"class":1204},[1169,9317,9318,9320,9322,9325,9327,9330,9332,9334,9336,9338,9340,9342,9344,9346,9348,9350],{"class":1171,"line":6854},[1169,9319,2990],{"class":1182},[1169,9321,2816],{"class":2398},[1169,9323,9324],{"class":1218},"\"service_request:",[1169,9326,2823],{"class":2822},[1169,9328,9329],{"class":1186},"hashlib",[1169,9331,1269],{"class":1204},[1169,9333,2791],{"class":1272},[1169,9335,1276],{"class":1204},[1169,9337,2796],{"class":1272},[1169,9339,1269],{"class":1204},[1169,9341,2801],{"class":1272},[1169,9343,2804],{"class":1204},[1169,9345,2807],{"class":1272},[1169,9347,6558],{"class":1204},[1169,9349,2828],{"class":2822},[1169,9351,2840],{"class":1218},[1169,9353,9354],{"class":1171,"line":6859},[1169,9355,2936],{"class":1186},[1169,9357,9358,9360,9363,9365,9367,9369,9372],{"class":1171,"line":6865},[1169,9359,3725],{"class":2398},[1169,9361,9362],{"class":2335}," _invalidate_cache_patterns",[1169,9364,1276],{"class":1204},[1169,9366,3734],{"class":3733},[1169,9368,1286],{"class":1204},[1169,9370,9371],{"class":2407}," patterns",[1169,9373,2411],{"class":1204},[1169,9375,9376,9378,9381],{"class":1171,"line":6875},[1169,9377,3756],{"class":2416},[1169,9379,9380],{"class":2420},"Invalidate cache entries matching patterns",[1169,9382,2424],{"class":2416},[1169,9384,9385,9387,9390,9392,9394],{"class":1171,"line":6899},[1169,9386,4151],{"class":1182},[1169,9388,9389],{"class":1186}," pattern ",[1169,9391,3318],{"class":1182},[1169,9393,9371],{"class":1186},[1169,9395,2984],{"class":1204},[1169,9397,9398],{"class":1171,"line":6935},[1169,9399,9400],{"class":1175},"            # Simple pattern matching - in production, use Redis SCAN\n",[1169,9402,9403,9406,9408,9410,9412,9414,9416,9418,9421,9423,9426,9428,9431],{"class":1171,"line":6959},[1169,9404,9405],{"class":1186},"            cache_keys ",[1169,9407,2432],{"class":1204},[1169,9409,2246],{"class":1186},[1169,9411,1269],{"class":1204},[1169,9413,4473],{"class":1272},[1169,9415,1276],{"class":1204},[1169,9417,3454],{"class":2398},[1169,9419,9420],{"class":1218},"\"service_request:*",[1169,9422,2823],{"class":2822},[1169,9424,9425],{"class":1272},"pattern",[1169,9427,2828],{"class":2822},[1169,9429,9430],{"class":1218},"*\"",[1169,9432,2373],{"class":1204},[1169,9434,9435,9437,9439],{"class":1171,"line":6982},[1169,9436,7320],{"class":1182},[1169,9438,4425],{"class":1186},[1169,9440,2984],{"class":1204},[1169,9442,9443,9445,9447,9449,9451,9454],{"class":1171,"line":6992},[1169,9444,6377],{"class":1186},[1169,9446,1269],{"class":1204},[1169,9448,4463],{"class":1272},[1169,9450,1276],{"class":1204},[1169,9452,9453],{"class":1272},"cache_keys",[1169,9455,2373],{"class":1204},[1169,9457,9458,9460,9462,9464,9466,9468,9471,9473,9476,9478,9480,9482,9484,9487,9489,9491,9493,9495],{"class":1171,"line":6997},[1169,9459,7500],{"class":1186},[1169,9461,1269],{"class":1204},[1169,9463,4828],{"class":1272},[1169,9465,1276],{"class":1204},[1169,9467,3454],{"class":2398},[1169,9469,9470],{"class":1218},"\"Invalidated ",[1169,9472,2823],{"class":2822},[1169,9474,9475],{"class":2728},"len",[1169,9477,1276],{"class":1204},[1169,9479,9453],{"class":1272},[1169,9481,2351],{"class":1204},[1169,9483,2828],{"class":2822},[1169,9485,9486],{"class":1218}," cache entries for pattern: ",[1169,9488,2823],{"class":2822},[1169,9490,9425],{"class":1272},[1169,9492,2828],{"class":2822},[1169,9494,2819],{"class":1218},[1169,9496,2373],{"class":1204},[1169,9498,9499],{"class":1171,"line":7002},[1169,9500,1194],{"emptyLinePlaceholder":1193},[1169,9502,9504],{"class":1171,"line":9503},101,[1169,9505,9506],{"class":1175},"# Service clients\n",[1169,9508,9510,9513,9515,9517],{"class":1171,"line":9509},102,[1169,9511,9512],{"class":1186},"user_service_client ",[1169,9514,2432],{"class":1204},[1169,9516,8027],{"class":1272},[1169,9518,3402],{"class":1204},[1169,9520,9522,9525,9527,9529,9531,9534],{"class":1171,"line":9521},103,[1169,9523,9524],{"class":2484},"    base_url",[1169,9526,2432],{"class":1204},[1169,9528,8226],{"class":1272},[1169,9530,1269],{"class":1204},[1169,9532,9533],{"class":2897},"USER_SERVICE_URL",[1169,9535,1251],{"class":1204},[1169,9537,9539,9542,9544],{"class":1171,"line":9538},104,[1169,9540,9541],{"class":2484},"    cache_timeout",[1169,9543,2432],{"class":1204},[1169,9545,9546],{"class":1362},"600\n",[1169,9548,9550],{"class":1171,"line":9549},105,[1169,9551,2373],{"class":1204},[1169,9553,9555],{"class":1171,"line":9554},106,[1169,9556,1194],{"emptyLinePlaceholder":1193},[1169,9558,9560,9563,9565,9567],{"class":1171,"line":9559},107,[1169,9561,9562],{"class":1186},"order_service_client ",[1169,9564,2432],{"class":1204},[1169,9566,8027],{"class":1272},[1169,9568,3402],{"class":1204},[1169,9570,9572,9574,9576,9578,9580,9583],{"class":1171,"line":9571},108,[1169,9573,9524],{"class":2484},[1169,9575,2432],{"class":1204},[1169,9577,8226],{"class":1272},[1169,9579,1269],{"class":1204},[1169,9581,9582],{"class":2897},"ORDER_SERVICE_URL",[1169,9584,1251],{"class":1204},[1169,9586,9588,9590,9592],{"class":1171,"line":9587},109,[1169,9589,9541],{"class":2484},[1169,9591,2432],{"class":1204},[1169,9593,9594],{"class":1362},"300\n",[1169,9596,9598],{"class":1171,"line":9597},110,[1169,9599,2373],{"class":1204},[1169,9601,9603],{"class":1171,"line":9602},111,[1169,9604,1194],{"emptyLinePlaceholder":1193},[1169,9606,9608],{"class":1171,"line":9607},112,[1169,9609,5228],{"class":1175},[1169,9611,9613,9615,9617,9619,9621],{"class":1171,"line":9612},113,[1169,9614,2399],{"class":2398},[1169,9616,5250],{"class":2335},[1169,9618,1276],{"class":1204},[1169,9620,3335],{"class":2407},[1169,9622,2411],{"class":1204},[1169,9624,9626,9628,9631],{"class":1171,"line":9625},114,[1169,9627,2417],{"class":2416},[1169,9629,9630],{"class":2420},"Get user profile from user service with caching",[1169,9632,2424],{"class":2416},[1169,9634,9636,9639,9641,9644,9646,9648],{"class":1171,"line":9635},115,[1169,9637,9638],{"class":1186},"    response ",[1169,9640,2432],{"class":1204},[1169,9642,9643],{"class":1186}," user_service_client",[1169,9645,1269],{"class":1204},[1169,9647,2554],{"class":1272},[1169,9649,3402],{"class":1204},[1169,9651,9653,9655,9658,9660,9662,9664,9667],{"class":1171,"line":9652},116,[1169,9654,4350],{"class":2398},[1169,9656,9657],{"class":1218},"'/api/users/",[1169,9659,2823],{"class":2822},[1169,9661,3335],{"class":1272},[1169,9663,2828],{"class":2822},[1169,9665,9666],{"class":1218},"/'",[1169,9668,1251],{"class":1204},[1169,9670,9672,9675,9677,9679],{"class":1171,"line":9671},117,[1169,9673,9674],{"class":2484},"        cache_timeout",[1169,9676,2432],{"class":1204},[1169,9678,3749],{"class":1362},[1169,9680,9681],{"class":1175},"  # Cache for 30 minutes\n",[1169,9683,9685],{"class":1171,"line":9684},118,[1169,9686,9687],{"class":1204},"    )\n",[1169,9689,9691],{"class":1171,"line":9690},119,[1169,9692,2936],{"class":1186},[1169,9694,9696,9698,9700,9702,9704,9706,9708,9710,9712,9714],{"class":1171,"line":9695},120,[1169,9697,2969],{"class":1182},[1169,9699,7610],{"class":1186},[1169,9701,1908],{"class":1204},[1169,9703,1222],{"class":1214},[1169,9705,7615],{"class":1218},[1169,9707,1222],{"class":1214},[1169,9709,1918],{"class":1204},[1169,9711,7618],{"class":2344},[1169,9713,7621],{"class":1362},[1169,9715,2984],{"class":1204},[1169,9717,9719,9721,9723,9725,9727,9729,9731],{"class":1171,"line":9718},121,[1169,9720,2990],{"class":1182},[1169,9722,7610],{"class":1186},[1169,9724,1908],{"class":1204},[1169,9726,1222],{"class":1214},[1169,9728,2510],{"class":1218},[1169,9730,1222],{"class":1214},[1169,9732,2112],{"class":1204},[1169,9734,9736,9739],{"class":1171,"line":9735},122,[1169,9737,9738],{"class":1182},"    else",[1169,9740,2984],{"class":1204},[1169,9742,9744,9746,9748,9750,9752,9754,9757,9759,9761,9763,9765],{"class":1171,"line":9743},123,[1169,9745,4973],{"class":1186},[1169,9747,1269],{"class":1204},[1169,9749,9102],{"class":1272},[1169,9751,1276],{"class":1204},[1169,9753,3454],{"class":2398},[1169,9755,9756],{"class":1218},"\"Failed to get user profile: ",[1169,9758,2823],{"class":2822},[1169,9760,7594],{"class":1272},[1169,9762,2828],{"class":2822},[1169,9764,2819],{"class":1218},[1169,9766,2373],{"class":1204},[1169,9768,9770,9772],{"class":1171,"line":9769},124,[1169,9771,2990],{"class":1182},[1169,9773,5001],{"class":1380},[1169,9775,9777],{"class":1171,"line":9776},125,[1169,9778,1194],{"emptyLinePlaceholder":1193},[1169,9780,9782,9784,9787,9789,9792],{"class":1171,"line":9781},126,[1169,9783,2399],{"class":2398},[1169,9785,9786],{"class":2335}," create_order",[1169,9788,1276],{"class":1204},[1169,9790,9791],{"class":2407},"order_data",[1169,9793,2411],{"class":1204},[1169,9795,9797,9799,9802],{"class":1171,"line":9796},127,[1169,9798,2417],{"class":2416},[1169,9800,9801],{"class":2420},"Create order and invalidate related caches",[1169,9803,2424],{"class":2416},[1169,9805,9807,9809,9811,9814,9816,9819],{"class":1171,"line":9806},128,[1169,9808,9638],{"class":1186},[1169,9810,2432],{"class":1204},[1169,9812,9813],{"class":1186}," order_service_client",[1169,9815,1269],{"class":1204},[1169,9817,9818],{"class":1272},"post",[1169,9820,3402],{"class":1204},[1169,9822,9824,9826,9829,9831],{"class":1171,"line":9823},129,[1169,9825,1233],{"class":1214},[1169,9827,9828],{"class":1218},"/api/orders/",[1169,9830,1222],{"class":1214},[1169,9832,1251],{"class":1204},[1169,9834,9836,9839,9841,9843],{"class":1171,"line":9835},130,[1169,9837,9838],{"class":2484},"        data",[1169,9840,2432],{"class":1204},[1169,9842,9791],{"class":1272},[1169,9844,1251],{"class":1204},[1169,9846,9848,9851,9853,9855,9858,9860,9862,9864,9867,9869,9871,9873,9875,9877,9879,9881,9883,9885],{"class":1171,"line":9847},131,[1169,9849,9850],{"class":2484},"        invalidate_cache_patterns",[1169,9852,7738],{"class":1204},[1169,9854,1222],{"class":1214},[1169,9856,9857],{"class":1218},"orders",[1169,9859,1222],{"class":1214},[1169,9861,1286],{"class":1204},[1169,9863,2816],{"class":2398},[1169,9865,9866],{"class":1218},"\"user_",[1169,9868,2823],{"class":2822},[1169,9870,9791],{"class":1272},[1169,9872,1908],{"class":1204},[1169,9874,1222],{"class":1214},[1169,9876,3335],{"class":1218},[1169,9878,1222],{"class":1214},[1169,9880,1918],{"class":1204},[1169,9882,2828],{"class":2822},[1169,9884,2819],{"class":1218},[1169,9886,2112],{"class":1204},[1169,9888,9890],{"class":1171,"line":9889},132,[1169,9891,9687],{"class":1204},[1169,9893,9895],{"class":1171,"line":9894},133,[1169,9896,2936],{"class":1186},[1169,9898,9900,9902],{"class":1171,"line":9899},134,[1169,9901,2497],{"class":1182},[1169,9903,7689],{"class":1186},[1030,9905,9907],{"id":9906},"performance-monitoring-and-optimization","Performance Monitoring and Optimization",[1077,9909,9911],{"id":9910},"cache-performance-metrics","Cache Performance Metrics",[1159,9913,9915],{"className":1161,"code":9914,"language":1163,"meta":1164,"style":1164},"# shared/cache_metrics.py\nfrom django.core.cache import cache\nfrom django.utils import timezone\nimport time\nimport logging\nfrom contextlib import contextmanager\n\nlogger = logging.getLogger(__name__)\n\nclass CacheMetrics:\n    \"\"\"Cache performance monitoring\"\"\"\n    \n    def __init__(self):\n        self.metrics = {\n            'hits': 0,\n            'misses': 0,\n            'sets': 0,\n            'deletes': 0,\n            'total_time': 0,\n            'operations': []\n        }\n    \n    @contextmanager\n    def measure_operation(self, operation_type, key):\n        \"\"\"Context manager to measure cache operations\"\"\"\n        start_time = time.time()\n        try:\n            yield\n            self.metrics[operation_type] += 1\n        finally:\n            duration = time.time() - start_time\n            self.metrics['total_time'] += duration\n            \n            self.metrics['operations'].append({\n                'type': operation_type,\n                'key': key,\n                'duration': duration,\n                'timestamp': timezone.now().isoformat()\n            })\n            \n            # Log slow operations\n            if duration > 0.1:  # 100ms threshold\n                logger.warning(f\"Slow cache operation: {operation_type} {key} took {duration:.3f}s\")\n    \n    def get_hit_rate(self):\n        \"\"\"Calculate cache hit rate\"\"\"\n        total_reads = self.metrics['hits'] + self.metrics['misses']\n        if total_reads == 0:\n            return 0\n        return (self.metrics['hits'] / total_reads) * 100\n    \n    def get_average_operation_time(self):\n        \"\"\"Calculate average operation time\"\"\"\n        total_ops = sum([\n            self.metrics['hits'],\n            self.metrics['misses'],\n            self.metrics['sets'],\n            self.metrics['deletes']\n        ])\n        \n        if total_ops == 0:\n            return 0\n        \n        return self.metrics['total_time'] / total_ops\n    \n    def reset(self):\n        \"\"\"Reset metrics\"\"\"\n        self.metrics = {\n            'hits': 0,\n            'misses': 0,\n            'sets': 0,\n            'deletes': 0,\n            'total_time': 0,\n            'operations': []\n        }\n\n# Global metrics instance\ncache_metrics = CacheMetrics()\n\nclass MonitoredCache:\n    \"\"\"Cache wrapper with performance monitoring\"\"\"\n    \n    def __init__(self, cache_alias='default'):\n        self.cache = cache if cache_alias == 'default' else caches[cache_alias]\n        self.metrics = cache_metrics\n    \n    def get(self, key, default=None):\n        \"\"\"Get with metrics tracking\"\"\"\n        with self.metrics.measure_operation('hits' if self.cache.has_key(key) else 'misses', key):\n            return self.cache.get(key, default)\n    \n    def set(self, key, value, timeout=None):\n        \"\"\"Set with metrics tracking\"\"\"\n        with self.metrics.measure_operation('sets', key):\n            return self.cache.set(key, value, timeout)\n    \n    def delete(self, key):\n        \"\"\"Delete with metrics tracking\"\"\"\n        with self.metrics.measure_operation('deletes', key):\n            return self.cache.delete(key)\n\n# Usage\nmonitored_cache = MonitoredCache()\n\n# Metrics endpoint\n@api_view(['GET'])\ndef cache_metrics_view(request):\n    \"\"\"Endpoint to view cache metrics\"\"\"\n    metrics = {\n        'hit_rate': cache_metrics.get_hit_rate(),\n        'average_operation_time': cache_metrics.get_average_operation_time(),\n        'total_operations': cache_metrics.metrics,\n        'recent_operations': cache_metrics.metrics['operations'][-10:]  # Last 10 operations\n    }\n    \n    return Response(metrics)\n",[1166,9916,9917,9922,9940,9956,9962,9968,9980,9984,10002,10006,10015,10024,10028,10040,10053,10069,10084,10099,10114,10129,10143,10147,10151,10159,10181,10190,10207,10213,10218,10239,10246,10266,10289,10293,10316,10331,10345,10361,10385,10390,10394,10399,10417,10462,10466,10479,10488,10530,10544,10551,10587,10591,10604,10613,10626,10645,10663,10681,10699,10704,10708,10721,10727,10731,10756,10760,10773,10782,10794,10808,10822,10836,10850,10864,10876,10880,10884,10889,10900,10904,10913,10922,10926,10950,10987,11000,11004,11029,11038,11095,11119,11123,11151,11160,11188,11216,11220,11236,11245,11273,11293,11297,11302,11313,11317,11322,11338,11351,11360,11369,11390,11410,11429,11468,11472,11476],{"__ignoreMap":1164},[1169,9918,9919],{"class":1171,"line":1172},[1169,9920,9921],{"class":1175},"# shared/cache_metrics.py\n",[1169,9923,9924,9926,9928,9930,9932,9934,9936,9938],{"class":1171,"line":1179},[1169,9925,1879],{"class":1182},[1169,9927,2182],{"class":1186},[1169,9929,1269],{"class":1204},[1169,9931,2237],{"class":1186},[1169,9933,1269],{"class":1204},[1169,9935,2197],{"class":1186},[1169,9937,1183],{"class":1182},[1169,9939,3128],{"class":1186},[1169,9941,9942,9944,9946,9948,9951,9953],{"class":1171,"line":1190},[1169,9943,1879],{"class":1182},[1169,9945,2182],{"class":1186},[1169,9947,1269],{"class":1204},[1169,9949,9950],{"class":1186},"utils ",[1169,9952,1183],{"class":1182},[1169,9954,9955],{"class":1186}," timezone\n",[1169,9957,9958,9960],{"class":1171,"line":1197},[1169,9959,1183],{"class":1182},[1169,9961,4583],{"class":1186},[1169,9963,9964,9966],{"class":1171,"line":1211},[1169,9965,1183],{"class":1182},[1169,9967,4569],{"class":1186},[1169,9969,9970,9972,9975,9977],{"class":1171,"line":1230},[1169,9971,1879],{"class":1182},[1169,9973,9974],{"class":1186}," contextlib ",[1169,9976,1183],{"class":1182},[1169,9978,9979],{"class":1186}," contextmanager\n",[1169,9981,9982],{"class":1171,"line":1254},[1169,9983,1194],{"emptyLinePlaceholder":1193},[1169,9985,9986,9988,9990,9992,9994,9996,9998,10000],{"class":1171,"line":1299},[1169,9987,4592],{"class":1186},[1169,9989,2432],{"class":1204},[1169,9991,4597],{"class":1186},[1169,9993,1269],{"class":1204},[1169,9995,4602],{"class":1272},[1169,9997,1276],{"class":1204},[1169,9999,4608],{"class":4607},[1169,10001,2373],{"class":1204},[1169,10003,10004],{"class":1171,"line":1313},[1169,10005,1194],{"emptyLinePlaceholder":1193},[1169,10007,10008,10010,10013],{"class":1171,"line":1335},[1169,10009,2595],{"class":2398},[1169,10011,10012],{"class":2598}," CacheMetrics",[1169,10014,2984],{"class":1204},[1169,10016,10017,10019,10022],{"class":1171,"line":1349},[1169,10018,2417],{"class":2416},[1169,10020,10021],{"class":2420},"Cache performance monitoring",[1169,10023,2424],{"class":2416},[1169,10025,10026],{"class":1171,"line":1368},[1169,10027,2936],{"class":1186},[1169,10029,10030,10032,10034,10036,10038],{"class":1171,"line":1386},[1169,10031,3725],{"class":2398},[1169,10033,4643],{"class":2728},[1169,10035,1276],{"class":1204},[1169,10037,3734],{"class":3733},[1169,10039,2411],{"class":1204},[1169,10041,10042,10044,10046,10049,10051],{"class":1171,"line":1392},[1169,10043,4680],{"class":1200},[1169,10045,1269],{"class":1204},[1169,10047,10048],{"class":2440},"metrics",[1169,10050,1205],{"class":1204},[1169,10052,1208],{"class":1204},[1169,10054,10055,10057,10060,10062,10064,10067],{"class":1171,"line":1413},[1169,10056,1316],{"class":1214},[1169,10058,10059],{"class":1218},"hits",[1169,10061,1222],{"class":1214},[1169,10063,1225],{"class":1204},[1169,10065,10066],{"class":1362}," 0",[1169,10068,1251],{"class":1204},[1169,10070,10071,10073,10076,10078,10080,10082],{"class":1171,"line":1434},[1169,10072,1316],{"class":1214},[1169,10074,10075],{"class":1218},"misses",[1169,10077,1222],{"class":1214},[1169,10079,1225],{"class":1204},[1169,10081,10066],{"class":1362},[1169,10083,1251],{"class":1204},[1169,10085,10086,10088,10091,10093,10095,10097],{"class":1171,"line":1440},[1169,10087,1316],{"class":1214},[1169,10089,10090],{"class":1218},"sets",[1169,10092,1222],{"class":1214},[1169,10094,1225],{"class":1204},[1169,10096,10066],{"class":1362},[1169,10098,1251],{"class":1204},[1169,10100,10101,10103,10106,10108,10110,10112],{"class":1171,"line":1461},[1169,10102,1316],{"class":1214},[1169,10104,10105],{"class":1218},"deletes",[1169,10107,1222],{"class":1214},[1169,10109,1225],{"class":1204},[1169,10111,10066],{"class":1362},[1169,10113,1251],{"class":1204},[1169,10115,10116,10118,10121,10123,10125,10127],{"class":1171,"line":1478},[1169,10117,1316],{"class":1214},[1169,10119,10120],{"class":1218},"total_time",[1169,10122,1222],{"class":1214},[1169,10124,1225],{"class":1204},[1169,10126,10066],{"class":1362},[1169,10128,1251],{"class":1204},[1169,10130,10131,10133,10136,10138,10140],{"class":1171,"line":1498},[1169,10132,1316],{"class":1214},[1169,10134,10135],{"class":1218},"operations",[1169,10137,1222],{"class":1214},[1169,10139,1225],{"class":1204},[1169,10141,10142],{"class":1204}," []\n",[1169,10144,10145],{"class":1171,"line":1504},[1169,10146,5530],{"class":1204},[1169,10148,10149],{"class":1171,"line":1518},[1169,10150,2936],{"class":1186},[1169,10152,10153,10156],{"class":1171,"line":1537},[1169,10154,10155],{"class":1204},"    @",[1169,10157,10158],{"class":2335},"contextmanager\n",[1169,10160,10161,10163,10166,10168,10170,10172,10175,10177,10179],{"class":1171,"line":1573},[1169,10162,3725],{"class":2398},[1169,10164,10165],{"class":2335}," measure_operation",[1169,10167,1276],{"class":1204},[1169,10169,3734],{"class":3733},[1169,10171,1286],{"class":1204},[1169,10173,10174],{"class":2407}," operation_type",[1169,10176,1286],{"class":1204},[1169,10178,4445],{"class":2407},[1169,10180,2411],{"class":1204},[1169,10182,10183,10185,10188],{"class":1171,"line":1586},[1169,10184,3756],{"class":2416},[1169,10186,10187],{"class":2420},"Context manager to measure cache operations",[1169,10189,2424],{"class":2416},[1169,10191,10192,10195,10197,10200,10202,10205],{"class":1171,"line":1605},[1169,10193,10194],{"class":1186},"        start_time ",[1169,10196,2432],{"class":1204},[1169,10198,10199],{"class":1186}," time",[1169,10201,1269],{"class":1204},[1169,10203,10204],{"class":1272},"time",[1169,10206,2464],{"class":1204},[1169,10208,10209,10211],{"class":1171,"line":1610},[1169,10210,3848],{"class":1182},[1169,10212,2984],{"class":1204},[1169,10214,10215],{"class":1171,"line":1629},[1169,10216,10217],{"class":1182},"            yield\n",[1169,10219,10220,10222,10224,10226,10228,10231,10233,10236],{"class":1171,"line":1648},[1169,10221,4932],{"class":1200},[1169,10223,1269],{"class":1204},[1169,10225,10048],{"class":2440},[1169,10227,1908],{"class":1204},[1169,10229,10230],{"class":2440},"operation_type",[1169,10232,1918],{"class":1204},[1169,10234,10235],{"class":1204}," +=",[1169,10237,10238],{"class":1362}," 1\n",[1169,10240,10241,10244],{"class":1171,"line":1653},[1169,10242,10243],{"class":1182},"        finally",[1169,10245,2984],{"class":1204},[1169,10247,10248,10251,10253,10255,10257,10259,10261,10263],{"class":1171,"line":1667},[1169,10249,10250],{"class":1186},"            duration ",[1169,10252,2432],{"class":1204},[1169,10254,10199],{"class":1186},[1169,10256,1269],{"class":1204},[1169,10258,10204],{"class":1272},[1169,10260,6558],{"class":1204},[1169,10262,6561],{"class":2344},[1169,10264,10265],{"class":1186}," start_time\n",[1169,10267,10268,10270,10272,10274,10276,10278,10280,10282,10284,10286],{"class":1171,"line":1686},[1169,10269,4932],{"class":1200},[1169,10271,1269],{"class":1204},[1169,10273,10048],{"class":2440},[1169,10275,1908],{"class":1204},[1169,10277,1222],{"class":1214},[1169,10279,10120],{"class":1218},[1169,10281,1222],{"class":1214},[1169,10283,1918],{"class":1204},[1169,10285,10235],{"class":1204},[1169,10287,10288],{"class":1186}," duration\n",[1169,10290,10291],{"class":1171,"line":1722},[1169,10292,6316],{"class":1186},[1169,10294,10295,10297,10299,10301,10303,10305,10307,10309,10312,10314],{"class":1171,"line":1735},[1169,10296,4932],{"class":1200},[1169,10298,1269],{"class":1204},[1169,10300,10048],{"class":2440},[1169,10302,1908],{"class":1204},[1169,10304,1222],{"class":1214},[1169,10306,10135],{"class":1218},[1169,10308,1222],{"class":1214},[1169,10310,10311],{"class":1204},"].",[1169,10313,7348],{"class":1272},[1169,10315,8186],{"class":1204},[1169,10317,10318,10320,10323,10325,10327,10329],{"class":1171,"line":1754},[1169,10319,1352],{"class":1214},[1169,10321,10322],{"class":1218},"type",[1169,10324,1222],{"class":1214},[1169,10326,1225],{"class":1204},[1169,10328,10174],{"class":1272},[1169,10330,1251],{"class":1204},[1169,10332,10333,10335,10337,10339,10341,10343],{"class":1171,"line":1759},[1169,10334,1352],{"class":1214},[1169,10336,4478],{"class":1218},[1169,10338,1222],{"class":1214},[1169,10340,1225],{"class":1204},[1169,10342,4445],{"class":1272},[1169,10344,1251],{"class":1204},[1169,10346,10347,10349,10352,10354,10356,10359],{"class":1171,"line":1779},[1169,10348,1352],{"class":1214},[1169,10350,10351],{"class":1218},"duration",[1169,10353,1222],{"class":1214},[1169,10355,1225],{"class":1204},[1169,10357,10358],{"class":1272}," duration",[1169,10360,1251],{"class":1204},[1169,10362,10363,10365,10368,10370,10372,10374,10376,10378,10380,10383],{"class":1171,"line":1798},[1169,10364,1352],{"class":1214},[1169,10366,10367],{"class":1218},"timestamp",[1169,10369,1222],{"class":1214},[1169,10371,1225],{"class":1204},[1169,10373,6550],{"class":1272},[1169,10375,1269],{"class":1204},[1169,10377,6555],{"class":1272},[1169,10379,6974],{"class":1204},[1169,10381,10382],{"class":1272},"isoformat",[1169,10384,2464],{"class":1204},[1169,10386,10387],{"class":1171,"line":1804},[1169,10388,10389],{"class":1204},"            })\n",[1169,10391,10392],{"class":1171,"line":1810},[1169,10393,6316],{"class":1186},[1169,10395,10396],{"class":1171,"line":1815},[1169,10397,10398],{"class":1175},"            # Log slow operations\n",[1169,10400,10401,10403,10406,10409,10412,10414],{"class":1171,"line":1821},[1169,10402,7320],{"class":1182},[1169,10404,10405],{"class":1186}," duration ",[1169,10407,10408],{"class":2344},">",[1169,10410,10411],{"class":1362}," 0.1",[1169,10413,1225],{"class":1204},[1169,10415,10416],{"class":1175},"  # 100ms threshold\n",[1169,10418,10419,10421,10423,10426,10428,10430,10433,10435,10437,10439,10441,10443,10445,10448,10450,10452,10455,10457,10460],{"class":1171,"line":1837},[1169,10420,7500],{"class":1186},[1169,10422,1269],{"class":1204},[1169,10424,10425],{"class":1272},"warning",[1169,10427,1276],{"class":1204},[1169,10429,3454],{"class":2398},[1169,10431,10432],{"class":1218},"\"Slow cache operation: ",[1169,10434,2823],{"class":2822},[1169,10436,10230],{"class":1272},[1169,10438,2828],{"class":2822},[1169,10440,3288],{"class":2822},[1169,10442,4478],{"class":1272},[1169,10444,2828],{"class":2822},[1169,10446,10447],{"class":1218}," took ",[1169,10449,2823],{"class":2822},[1169,10451,10351],{"class":1272},[1169,10453,10454],{"class":2398},":.3f",[1169,10456,2828],{"class":2822},[1169,10458,10459],{"class":1218},"s\"",[1169,10461,2373],{"class":1204},[1169,10463,10464],{"class":1171,"line":1851},[1169,10465,2936],{"class":1186},[1169,10467,10468,10470,10473,10475,10477],{"class":1171,"line":2939},[1169,10469,3725],{"class":2398},[1169,10471,10472],{"class":2335}," get_hit_rate",[1169,10474,1276],{"class":1204},[1169,10476,3734],{"class":3733},[1169,10478,2411],{"class":1204},[1169,10480,10481,10483,10486],{"class":1171,"line":2945},[1169,10482,3756],{"class":2416},[1169,10484,10485],{"class":2420},"Calculate cache hit rate",[1169,10487,2424],{"class":2416},[1169,10489,10490,10493,10495,10497,10499,10501,10503,10505,10507,10509,10511,10514,10516,10518,10520,10522,10524,10526,10528],{"class":1171,"line":2966},[1169,10491,10492],{"class":1186},"        total_reads ",[1169,10494,2432],{"class":1204},[1169,10496,3860],{"class":1200},[1169,10498,1269],{"class":1204},[1169,10500,10048],{"class":2440},[1169,10502,1908],{"class":1204},[1169,10504,1222],{"class":1214},[1169,10506,10059],{"class":1218},[1169,10508,1222],{"class":1214},[1169,10510,1918],{"class":1204},[1169,10512,10513],{"class":2344}," +",[1169,10515,3860],{"class":1200},[1169,10517,1269],{"class":1204},[1169,10519,10048],{"class":2440},[1169,10521,1908],{"class":1204},[1169,10523,1222],{"class":1214},[1169,10525,10075],{"class":1218},[1169,10527,1222],{"class":1214},[1169,10529,2112],{"class":1204},[1169,10531,10532,10534,10537,10540,10542],{"class":1171,"line":2987},[1169,10533,3815],{"class":1182},[1169,10535,10536],{"class":1186}," total_reads ",[1169,10538,10539],{"class":2344},"==",[1169,10541,10066],{"class":1362},[1169,10543,2984],{"class":1204},[1169,10545,10546,10548],{"class":1171,"line":3002},[1169,10547,3831],{"class":1182},[1169,10549,10550],{"class":1362}," 0\n",[1169,10552,10553,10555,10558,10560,10562,10564,10566,10568,10570,10572,10574,10577,10580,10582,10584],{"class":1171,"line":3007},[1169,10554,2990],{"class":1182},[1169,10556,10557],{"class":1204}," (",[1169,10559,3734],{"class":1200},[1169,10561,1269],{"class":1204},[1169,10563,10048],{"class":2440},[1169,10565,1908],{"class":1204},[1169,10567,1222],{"class":1214},[1169,10569,10059],{"class":1218},[1169,10571,1222],{"class":1214},[1169,10573,1918],{"class":1204},[1169,10575,10576],{"class":2344}," /",[1169,10578,10579],{"class":1186}," total_reads",[1169,10581,2351],{"class":1204},[1169,10583,2345],{"class":2344},[1169,10585,10586],{"class":1362}," 100\n",[1169,10588,10589],{"class":1171,"line":3013},[1169,10590,2936],{"class":1186},[1169,10592,10593,10595,10598,10600,10602],{"class":1171,"line":3030},[1169,10594,3725],{"class":2398},[1169,10596,10597],{"class":2335}," get_average_operation_time",[1169,10599,1276],{"class":1204},[1169,10601,3734],{"class":3733},[1169,10603,2411],{"class":1204},[1169,10605,10606,10608,10611],{"class":1171,"line":3035},[1169,10607,3756],{"class":2416},[1169,10609,10610],{"class":2420},"Calculate average operation time",[1169,10612,2424],{"class":2416},[1169,10614,10615,10618,10620,10623],{"class":1171,"line":3041},[1169,10616,10617],{"class":1186},"        total_ops ",[1169,10619,2432],{"class":1204},[1169,10621,10622],{"class":2728}," sum",[1169,10624,10625],{"class":1204},"([\n",[1169,10627,10628,10630,10632,10634,10636,10638,10640,10642],{"class":1171,"line":3068},[1169,10629,4932],{"class":1200},[1169,10631,1269],{"class":1204},[1169,10633,10048],{"class":2440},[1169,10635,1908],{"class":1204},[1169,10637,1222],{"class":1214},[1169,10639,10059],{"class":1218},[1169,10641,1222],{"class":1214},[1169,10643,10644],{"class":1204},"],\n",[1169,10646,10647,10649,10651,10653,10655,10657,10659,10661],{"class":1171,"line":3073},[1169,10648,4932],{"class":1200},[1169,10650,1269],{"class":1204},[1169,10652,10048],{"class":2440},[1169,10654,1908],{"class":1204},[1169,10656,1222],{"class":1214},[1169,10658,10075],{"class":1218},[1169,10660,1222],{"class":1214},[1169,10662,10644],{"class":1204},[1169,10664,10665,10667,10669,10671,10673,10675,10677,10679],{"class":1171,"line":4397},[1169,10666,4932],{"class":1200},[1169,10668,1269],{"class":1204},[1169,10670,10048],{"class":2440},[1169,10672,1908],{"class":1204},[1169,10674,1222],{"class":1214},[1169,10676,10090],{"class":1218},[1169,10678,1222],{"class":1214},[1169,10680,10644],{"class":1204},[1169,10682,10683,10685,10687,10689,10691,10693,10695,10697],{"class":1171,"line":4403},[1169,10684,4932],{"class":1200},[1169,10686,1269],{"class":1204},[1169,10688,10048],{"class":2440},[1169,10690,1908],{"class":1204},[1169,10692,1222],{"class":1214},[1169,10694,10105],{"class":1218},[1169,10696,1222],{"class":1214},[1169,10698,2112],{"class":1204},[1169,10700,10701],{"class":1171,"line":4408},[1169,10702,10703],{"class":1204},"        ])\n",[1169,10705,10706],{"class":1171,"line":4414},[1169,10707,3786],{"class":1186},[1169,10709,10710,10712,10715,10717,10719],{"class":1171,"line":4430},[1169,10711,3815],{"class":1182},[1169,10713,10714],{"class":1186}," total_ops ",[1169,10716,10539],{"class":2344},[1169,10718,10066],{"class":1362},[1169,10720,2984],{"class":1204},[1169,10722,10723,10725],{"class":1171,"line":4450},[1169,10724,3831],{"class":1182},[1169,10726,10550],{"class":1362},[1169,10728,10729],{"class":1171,"line":4456},[1169,10730,3786],{"class":1186},[1169,10732,10733,10735,10737,10739,10741,10743,10745,10747,10749,10751,10753],{"class":1171,"line":4505},[1169,10734,2990],{"class":1182},[1169,10736,3860],{"class":1200},[1169,10738,1269],{"class":1204},[1169,10740,10048],{"class":2440},[1169,10742,1908],{"class":1204},[1169,10744,1222],{"class":1214},[1169,10746,10120],{"class":1218},[1169,10748,1222],{"class":1214},[1169,10750,1918],{"class":1204},[1169,10752,10576],{"class":2344},[1169,10754,10755],{"class":1186}," total_ops\n",[1169,10757,10758],{"class":1171,"line":4513},[1169,10759,2936],{"class":1186},[1169,10761,10762,10764,10767,10769,10771],{"class":1171,"line":5401},[1169,10763,3725],{"class":2398},[1169,10765,10766],{"class":2335}," reset",[1169,10768,1276],{"class":1204},[1169,10770,3734],{"class":3733},[1169,10772,2411],{"class":1204},[1169,10774,10775,10777,10780],{"class":1171,"line":5420},[1169,10776,3756],{"class":2416},[1169,10778,10779],{"class":2420},"Reset metrics",[1169,10781,2424],{"class":2416},[1169,10783,10784,10786,10788,10790,10792],{"class":1171,"line":5440},[1169,10785,4680],{"class":1200},[1169,10787,1269],{"class":1204},[1169,10789,10048],{"class":2440},[1169,10791,1205],{"class":1204},[1169,10793,1208],{"class":1204},[1169,10795,10796,10798,10800,10802,10804,10806],{"class":1171,"line":5460},[1169,10797,1316],{"class":1214},[1169,10799,10059],{"class":1218},[1169,10801,1222],{"class":1214},[1169,10803,1225],{"class":1204},[1169,10805,10066],{"class":1362},[1169,10807,1251],{"class":1204},[1169,10809,10810,10812,10814,10816,10818,10820],{"class":1171,"line":5473},[1169,10811,1316],{"class":1214},[1169,10813,10075],{"class":1218},[1169,10815,1222],{"class":1214},[1169,10817,1225],{"class":1204},[1169,10819,10066],{"class":1362},[1169,10821,1251],{"class":1204},[1169,10823,10824,10826,10828,10830,10832,10834],{"class":1171,"line":5497},[1169,10825,1316],{"class":1214},[1169,10827,10090],{"class":1218},[1169,10829,1222],{"class":1214},[1169,10831,1225],{"class":1204},[1169,10833,10066],{"class":1362},[1169,10835,1251],{"class":1204},[1169,10837,10838,10840,10842,10844,10846,10848],{"class":1171,"line":5521},[1169,10839,1316],{"class":1214},[1169,10841,10105],{"class":1218},[1169,10843,1222],{"class":1214},[1169,10845,1225],{"class":1204},[1169,10847,10066],{"class":1362},[1169,10849,1251],{"class":1204},[1169,10851,10852,10854,10856,10858,10860,10862],{"class":1171,"line":5527},[1169,10853,1316],{"class":1214},[1169,10855,10120],{"class":1218},[1169,10857,1222],{"class":1214},[1169,10859,1225],{"class":1204},[1169,10861,10066],{"class":1362},[1169,10863,1251],{"class":1204},[1169,10865,10866,10868,10870,10872,10874],{"class":1171,"line":5533},[1169,10867,1316],{"class":1214},[1169,10869,10135],{"class":1218},[1169,10871,1222],{"class":1214},[1169,10873,1225],{"class":1204},[1169,10875,10142],{"class":1204},[1169,10877,10878],{"class":1171,"line":5538},[1169,10879,5530],{"class":1204},[1169,10881,10882],{"class":1171,"line":5544},[1169,10883,1194],{"emptyLinePlaceholder":1193},[1169,10885,10886],{"class":1171,"line":5569},[1169,10887,10888],{"class":1175},"# Global metrics instance\n",[1169,10890,10891,10894,10896,10898],{"class":1171,"line":5577},[1169,10892,10893],{"class":1186},"cache_metrics ",[1169,10895,2432],{"class":1204},[1169,10897,10012],{"class":1272},[1169,10899,2464],{"class":1204},[1169,10901,10902],{"class":1171,"line":5582},[1169,10903,1194],{"emptyLinePlaceholder":1193},[1169,10905,10906,10908,10911],{"class":1171,"line":5596},[1169,10907,2595],{"class":2398},[1169,10909,10910],{"class":2598}," MonitoredCache",[1169,10912,2984],{"class":1204},[1169,10914,10915,10917,10920],{"class":1171,"line":6716},[1169,10916,2417],{"class":2416},[1169,10918,10919],{"class":2420},"Cache wrapper with performance monitoring",[1169,10921,2424],{"class":2416},[1169,10923,10924],{"class":1171,"line":6726},[1169,10925,2936],{"class":1186},[1169,10927,10928,10930,10932,10934,10936,10938,10940,10942,10944,10946,10948],{"class":1171,"line":6750},[1169,10929,3725],{"class":2398},[1169,10931,4643],{"class":2728},[1169,10933,1276],{"class":1204},[1169,10935,3734],{"class":3733},[1169,10937,1286],{"class":1204},[1169,10939,7157],{"class":2407},[1169,10941,2432],{"class":2344},[1169,10943,1222],{"class":1214},[1169,10945,1219],{"class":1218},[1169,10947,1222],{"class":1214},[1169,10949,2411],{"class":1204},[1169,10951,10952,10954,10956,10958,10960,10963,10966,10969,10971,10973,10975,10977,10979,10981,10983,10985],{"class":1171,"line":6755},[1169,10953,4680],{"class":1200},[1169,10955,1269],{"class":1204},[1169,10957,4468],{"class":2440},[1169,10959,1205],{"class":1204},[1169,10961,10962],{"class":1186}," cache ",[1169,10964,10965],{"class":1182},"if",[1169,10967,10968],{"class":1186}," cache_alias ",[1169,10970,10539],{"class":2344},[1169,10972,1243],{"class":1214},[1169,10974,1219],{"class":1218},[1169,10976,1222],{"class":1214},[1169,10978,9039],{"class":1182},[1169,10980,4690],{"class":1186},[1169,10982,1908],{"class":1204},[1169,10984,8130],{"class":1186},[1169,10986,2112],{"class":1204},[1169,10988,10989,10991,10993,10995,10997],{"class":1171,"line":6761},[1169,10990,4680],{"class":1200},[1169,10992,1269],{"class":1204},[1169,10994,10048],{"class":2440},[1169,10996,1205],{"class":1204},[1169,10998,10999],{"class":1186}," cache_metrics\n",[1169,11001,11002],{"class":1171,"line":6781},[1169,11003,2936],{"class":1186},[1169,11005,11006,11008,11010,11012,11014,11016,11018,11020,11023,11025,11027],{"class":1171,"line":6792},[1169,11007,3725],{"class":2398},[1169,11009,4757],{"class":2335},[1169,11011,1276],{"class":1204},[1169,11013,3734],{"class":3733},[1169,11015,1286],{"class":1204},[1169,11017,4445],{"class":2407},[1169,11019,1286],{"class":1204},[1169,11021,11022],{"class":2407}," default",[1169,11024,2432],{"class":2344},[1169,11026,3993],{"class":1380},[1169,11028,2411],{"class":1204},[1169,11030,11031,11033,11036],{"class":1171,"line":6817},[1169,11032,3756],{"class":2416},[1169,11034,11035],{"class":2420},"Get with metrics tracking",[1169,11037,2424],{"class":2416},[1169,11039,11040,11043,11045,11047,11049,11051,11054,11056,11058,11060,11062,11064,11066,11068,11070,11072,11075,11077,11079,11081,11083,11085,11087,11089,11091,11093],{"class":1171,"line":6822},[1169,11041,11042],{"class":1182},"        with",[1169,11044,3860],{"class":1200},[1169,11046,1269],{"class":1204},[1169,11048,10048],{"class":2440},[1169,11050,1269],{"class":1204},[1169,11052,11053],{"class":1272},"measure_operation",[1169,11055,1276],{"class":1204},[1169,11057,1222],{"class":1214},[1169,11059,10059],{"class":1218},[1169,11061,1222],{"class":1214},[1169,11063,9029],{"class":1182},[1169,11065,3860],{"class":1200},[1169,11067,1269],{"class":1204},[1169,11069,4468],{"class":2440},[1169,11071,1269],{"class":1204},[1169,11073,11074],{"class":1272},"has_key",[1169,11076,1276],{"class":1204},[1169,11078,4478],{"class":1272},[1169,11080,2351],{"class":1204},[1169,11082,9039],{"class":1182},[1169,11084,1243],{"class":1214},[1169,11086,10075],{"class":1218},[1169,11088,1222],{"class":1214},[1169,11090,1286],{"class":1204},[1169,11092,4445],{"class":1272},[1169,11094,2411],{"class":1204},[1169,11096,11097,11099,11101,11103,11105,11107,11109,11111,11113,11115,11117],{"class":1171,"line":6854},[1169,11098,3831],{"class":1182},[1169,11100,3860],{"class":1200},[1169,11102,1269],{"class":1204},[1169,11104,4468],{"class":2440},[1169,11106,1269],{"class":1204},[1169,11108,2554],{"class":1272},[1169,11110,1276],{"class":1204},[1169,11112,4478],{"class":1272},[1169,11114,1286],{"class":1204},[1169,11116,11022],{"class":1272},[1169,11118,2373],{"class":1204},[1169,11120,11121],{"class":1171,"line":6859},[1169,11122,2936],{"class":1186},[1169,11124,11125,11127,11129,11131,11133,11135,11137,11139,11141,11143,11145,11147,11149],{"class":1171,"line":6865},[1169,11126,3725],{"class":2398},[1169,11128,5012],{"class":3296},[1169,11130,1276],{"class":1204},[1169,11132,3734],{"class":3733},[1169,11134,1286],{"class":1204},[1169,11136,4445],{"class":2407},[1169,11138,1286],{"class":1204},[1169,11140,4199],{"class":2407},[1169,11142,1286],{"class":1204},[1169,11144,3744],{"class":2407},[1169,11146,2432],{"class":2344},[1169,11148,3993],{"class":1380},[1169,11150,2411],{"class":1204},[1169,11152,11153,11155,11158],{"class":1171,"line":6875},[1169,11154,3756],{"class":2416},[1169,11156,11157],{"class":2420},"Set with metrics tracking",[1169,11159,2424],{"class":2416},[1169,11161,11162,11164,11166,11168,11170,11172,11174,11176,11178,11180,11182,11184,11186],{"class":1171,"line":6899},[1169,11163,11042],{"class":1182},[1169,11165,3860],{"class":1200},[1169,11167,1269],{"class":1204},[1169,11169,10048],{"class":2440},[1169,11171,1269],{"class":1204},[1169,11173,11053],{"class":1272},[1169,11175,1276],{"class":1204},[1169,11177,1222],{"class":1214},[1169,11179,10090],{"class":1218},[1169,11181,1222],{"class":1214},[1169,11183,1286],{"class":1204},[1169,11185,4445],{"class":1272},[1169,11187,2411],{"class":1204},[1169,11189,11190,11192,11194,11196,11198,11200,11202,11204,11206,11208,11210,11212,11214],{"class":1171,"line":6935},[1169,11191,3831],{"class":1182},[1169,11193,3860],{"class":1200},[1169,11195,1269],{"class":1204},[1169,11197,4468],{"class":2440},[1169,11199,1269],{"class":1204},[1169,11201,3049],{"class":1272},[1169,11203,1276],{"class":1204},[1169,11205,4478],{"class":1272},[1169,11207,1286],{"class":1204},[1169,11209,4199],{"class":1272},[1169,11211,1286],{"class":1204},[1169,11213,3744],{"class":1272},[1169,11215,2373],{"class":1204},[1169,11217,11218],{"class":1171,"line":6959},[1169,11219,2936],{"class":1186},[1169,11221,11222,11224,11226,11228,11230,11232,11234],{"class":1171,"line":6982},[1169,11223,3725],{"class":2398},[1169,11225,5164],{"class":2335},[1169,11227,1276],{"class":1204},[1169,11229,3734],{"class":3733},[1169,11231,1286],{"class":1204},[1169,11233,4445],{"class":2407},[1169,11235,2411],{"class":1204},[1169,11237,11238,11240,11243],{"class":1171,"line":6992},[1169,11239,3756],{"class":2416},[1169,11241,11242],{"class":2420},"Delete with metrics tracking",[1169,11244,2424],{"class":2416},[1169,11246,11247,11249,11251,11253,11255,11257,11259,11261,11263,11265,11267,11269,11271],{"class":1171,"line":6997},[1169,11248,11042],{"class":1182},[1169,11250,3860],{"class":1200},[1169,11252,1269],{"class":1204},[1169,11254,10048],{"class":2440},[1169,11256,1269],{"class":1204},[1169,11258,11053],{"class":1272},[1169,11260,1276],{"class":1204},[1169,11262,1222],{"class":1214},[1169,11264,10105],{"class":1218},[1169,11266,1222],{"class":1214},[1169,11268,1286],{"class":1204},[1169,11270,4445],{"class":1272},[1169,11272,2411],{"class":1204},[1169,11274,11275,11277,11279,11281,11283,11285,11287,11289,11291],{"class":1171,"line":7002},[1169,11276,3831],{"class":1182},[1169,11278,3860],{"class":1200},[1169,11280,1269],{"class":1204},[1169,11282,4468],{"class":2440},[1169,11284,1269],{"class":1204},[1169,11286,4520],{"class":1272},[1169,11288,1276],{"class":1204},[1169,11290,4478],{"class":1272},[1169,11292,2373],{"class":1204},[1169,11294,11295],{"class":1171,"line":9503},[1169,11296,1194],{"emptyLinePlaceholder":1193},[1169,11298,11299],{"class":1171,"line":9509},[1169,11300,11301],{"class":1175},"# Usage\n",[1169,11303,11304,11307,11309,11311],{"class":1171,"line":9521},[1169,11305,11306],{"class":1186},"monitored_cache ",[1169,11308,2432],{"class":1204},[1169,11310,10910],{"class":1272},[1169,11312,2464],{"class":1204},[1169,11314,11315],{"class":1171,"line":9538},[1169,11316,1194],{"emptyLinePlaceholder":1193},[1169,11318,11319],{"class":1171,"line":9549},[1169,11320,11321],{"class":1175},"# Metrics endpoint\n",[1169,11323,11324,11326,11328,11330,11332,11334,11336],{"class":1171,"line":9554},[1169,11325,2332],{"class":1204},[1169,11327,2380],{"class":2335},[1169,11329,2383],{"class":1204},[1169,11331,1222],{"class":1214},[1169,11333,2388],{"class":1218},[1169,11335,1222],{"class":1214},[1169,11337,2393],{"class":1204},[1169,11339,11340,11342,11345,11347,11349],{"class":1171,"line":9559},[1169,11341,2399],{"class":2398},[1169,11343,11344],{"class":2335}," cache_metrics_view",[1169,11346,1276],{"class":1204},[1169,11348,2408],{"class":2407},[1169,11350,2411],{"class":1204},[1169,11352,11353,11355,11358],{"class":1171,"line":9571},[1169,11354,2417],{"class":2416},[1169,11356,11357],{"class":2420},"Endpoint to view cache metrics",[1169,11359,2424],{"class":2416},[1169,11361,11362,11365,11367],{"class":1171,"line":9587},[1169,11363,11364],{"class":1186},"    metrics ",[1169,11366,2432],{"class":1204},[1169,11368,1208],{"class":1204},[1169,11370,11371,11373,11376,11378,11380,11383,11385,11388],{"class":1171,"line":9597},[1169,11372,1233],{"class":1214},[1169,11374,11375],{"class":1218},"hit_rate",[1169,11377,1222],{"class":1214},[1169,11379,1225],{"class":1204},[1169,11381,11382],{"class":1186}," cache_metrics",[1169,11384,1269],{"class":1204},[1169,11386,11387],{"class":1272},"get_hit_rate",[1169,11389,6896],{"class":1204},[1169,11391,11392,11394,11397,11399,11401,11403,11405,11408],{"class":1171,"line":9602},[1169,11393,1233],{"class":1214},[1169,11395,11396],{"class":1218},"average_operation_time",[1169,11398,1222],{"class":1214},[1169,11400,1225],{"class":1204},[1169,11402,11382],{"class":1186},[1169,11404,1269],{"class":1204},[1169,11406,11407],{"class":1272},"get_average_operation_time",[1169,11409,6896],{"class":1204},[1169,11411,11412,11414,11417,11419,11421,11423,11425,11427],{"class":1171,"line":9607},[1169,11413,1233],{"class":1214},[1169,11415,11416],{"class":1218},"total_operations",[1169,11418,1222],{"class":1214},[1169,11420,1225],{"class":1204},[1169,11422,11382],{"class":1186},[1169,11424,1269],{"class":1204},[1169,11426,10048],{"class":2440},[1169,11428,1251],{"class":1204},[1169,11430,11431,11433,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11457,11460,11462,11465],{"class":1171,"line":9612},[1169,11432,1233],{"class":1214},[1169,11434,11435],{"class":1218},"recent_operations",[1169,11437,1222],{"class":1214},[1169,11439,1225],{"class":1204},[1169,11441,11382],{"class":1186},[1169,11443,1269],{"class":1204},[1169,11445,10048],{"class":2440},[1169,11447,1908],{"class":1204},[1169,11449,1222],{"class":1214},[1169,11451,10135],{"class":1218},[1169,11453,1222],{"class":1214},[1169,11455,11456],{"class":1204},"][",[1169,11458,11459],{"class":2344},"-",[1169,11461,8971],{"class":1362},[1169,11463,11464],{"class":1204},":]",[1169,11466,11467],{"class":1175},"  # Last 10 operations\n",[1169,11469,11470],{"class":1171,"line":9625},[1169,11471,1801],{"class":1204},[1169,11473,11474],{"class":1171,"line":9635},[1169,11475,2936],{"class":1186},[1169,11477,11478,11480,11482,11484,11486],{"class":1171,"line":9652},[1169,11479,2497],{"class":1182},[1169,11481,2500],{"class":1272},[1169,11483,1276],{"class":1204},[1169,11485,10048],{"class":1272},[1169,11487,2373],{"class":1204},[1077,11489,11491],{"id":11490},"database-query-optimization","Database Query Optimization",[1159,11493,11495],{"className":1161,"code":11494,"language":1163,"meta":1164,"style":1164},"# shared/query_optimization.py\nfrom django.db import connection\nfrom django.core.cache import cache\nimport logging\nimport time\nfrom contextlib import contextmanager\n\nlogger = logging.getLogger(__name__)\n\n@contextmanager\ndef monitor_queries():\n    \"\"\"Context manager to monitor database queries\"\"\"\n    initial_queries = len(connection.queries)\n    start_time = time.time()\n    \n    try:\n        yield\n    finally:\n        end_time = time.time()\n        query_count = len(connection.queries) - initial_queries\n        duration = end_time - start_time\n        \n        if query_count > 10:  # Threshold for too many queries\n            logger.warning(f\"High query count: {query_count} queries in {duration:.3f}s\")\n        \n        if duration > 1.0:  # Threshold for slow operations\n            logger.warning(f\"Slow operation: {duration:.3f}s with {query_count} queries\")\n\nclass OptimizedQuerySet:\n    \"\"\"QuerySet wrapper with caching and optimization\"\"\"\n    \n    def __init__(self, queryset, cache_timeout=300):\n        self.queryset = queryset\n        self.cache_timeout = cache_timeout\n    \n    def cached_count(self):\n        \"\"\"Cached count query\"\"\"\n        cache_key = f\"queryset_count:{hash(str(self.queryset.query))}\"\n        \n        count = cache.get(cache_key)\n        if count is None:\n            with monitor_queries():\n                count = self.queryset.count()\n            cache.set(cache_key, count, self.cache_timeout)\n        \n        return count\n    \n    def cached_exists(self):\n        \"\"\"Cached exists query\"\"\"\n        cache_key = f\"queryset_exists:{hash(str(self.queryset.query))}\"\n        \n        exists = cache.get(cache_key)\n        if exists is None:\n            with monitor_queries():\n                exists = self.queryset.exists()\n            cache.set(cache_key, exists, self.cache_timeout)\n        \n        return exists\n    \n    def cached_list(self, select_related=None, prefetch_related=None):\n        \"\"\"Cached list query with optimizations\"\"\"\n        queryset = self.queryset\n        \n        if select_related:\n            queryset = queryset.select_related(*select_related)\n        \n        if prefetch_related:\n            queryset = queryset.prefetch_related(*prefetch_related)\n        \n        cache_key = f\"queryset_list:{hash(str(queryset.query))}\"\n        \n        results = cache.get(cache_key)\n        if results is None:\n            with monitor_queries():\n                results = list(queryset.all())\n            cache.set(cache_key, results, self.cache_timeout)\n        \n        return results\n\n# Usage in services\ndef get_user_orders_optimized(user_id):\n    \"\"\"Get user orders with query optimization\"\"\"\n    from order_service.models import Order\n    \n    queryset = Order.objects.filter(user_id=user_id)\n    optimized_qs = OptimizedQuerySet(queryset, cache_timeout=600)\n    \n    return optimized_qs.cached_list(\n        select_related=['user'],\n        prefetch_related=['items__product']\n    )\n",[1166,11496,11497,11502,11517,11535,11541,11547,11557,11561,11579,11583,11589,11598,11607,11629,11644,11648,11654,11659,11666,11681,11705,11719,11723,11739,11776,11780,11796,11833,11837,11846,11855,11859,11883,11896,11908,11912,11925,11934,11973,11977,11996,12009,12018,12037,12064,12068,12075,12079,12092,12101,12138,12142,12161,12174,12182,12202,12229,12233,12240,12244,12275,12284,12297,12301,12309,12329,12333,12341,12362,12366,12399,12403,12422,12435,12443,12462,12489,12493,12500,12504,12508,12521,12530,12547,12551,12578,12601,12605,12619,12634,12650],{"__ignoreMap":1164},[1169,11498,11499],{"class":1171,"line":1172},[1169,11500,11501],{"class":1175},"# shared/query_optimization.py\n",[1169,11503,11504,11506,11508,11510,11512,11514],{"class":1171,"line":1179},[1169,11505,1879],{"class":1182},[1169,11507,2182],{"class":1186},[1169,11509,1269],{"class":1204},[1169,11511,3615],{"class":1186},[1169,11513,1183],{"class":1182},[1169,11515,11516],{"class":1186}," connection\n",[1169,11518,11519,11521,11523,11525,11527,11529,11531,11533],{"class":1171,"line":1190},[1169,11520,1879],{"class":1182},[1169,11522,2182],{"class":1186},[1169,11524,1269],{"class":1204},[1169,11526,2237],{"class":1186},[1169,11528,1269],{"class":1204},[1169,11530,2197],{"class":1186},[1169,11532,1183],{"class":1182},[1169,11534,3128],{"class":1186},[1169,11536,11537,11539],{"class":1171,"line":1197},[1169,11538,1183],{"class":1182},[1169,11540,4569],{"class":1186},[1169,11542,11543,11545],{"class":1171,"line":1211},[1169,11544,1183],{"class":1182},[1169,11546,4583],{"class":1186},[1169,11548,11549,11551,11553,11555],{"class":1171,"line":1230},[1169,11550,1879],{"class":1182},[1169,11552,9974],{"class":1186},[1169,11554,1183],{"class":1182},[1169,11556,9979],{"class":1186},[1169,11558,11559],{"class":1171,"line":1254},[1169,11560,1194],{"emptyLinePlaceholder":1193},[1169,11562,11563,11565,11567,11569,11571,11573,11575,11577],{"class":1171,"line":1299},[1169,11564,4592],{"class":1186},[1169,11566,2432],{"class":1204},[1169,11568,4597],{"class":1186},[1169,11570,1269],{"class":1204},[1169,11572,4602],{"class":1272},[1169,11574,1276],{"class":1204},[1169,11576,4608],{"class":4607},[1169,11578,2373],{"class":1204},[1169,11580,11581],{"class":1171,"line":1313},[1169,11582,1194],{"emptyLinePlaceholder":1193},[1169,11584,11585,11587],{"class":1171,"line":1335},[1169,11586,2332],{"class":1204},[1169,11588,10158],{"class":2335},[1169,11590,11591,11593,11596],{"class":1171,"line":1349},[1169,11592,2399],{"class":2398},[1169,11594,11595],{"class":2335}," monitor_queries",[1169,11597,4170],{"class":1204},[1169,11599,11600,11602,11605],{"class":1171,"line":1368},[1169,11601,2417],{"class":2416},[1169,11603,11604],{"class":2420},"Context manager to monitor database queries",[1169,11606,2424],{"class":2416},[1169,11608,11609,11612,11614,11617,11619,11622,11624,11627],{"class":1171,"line":1386},[1169,11610,11611],{"class":1186},"    initial_queries ",[1169,11613,2432],{"class":1204},[1169,11615,11616],{"class":2728}," len",[1169,11618,1276],{"class":1204},[1169,11620,11621],{"class":1272},"connection",[1169,11623,1269],{"class":1204},[1169,11625,11626],{"class":2440},"queries",[1169,11628,2373],{"class":1204},[1169,11630,11631,11634,11636,11638,11640,11642],{"class":1171,"line":1392},[1169,11632,11633],{"class":1186},"    start_time ",[1169,11635,2432],{"class":1204},[1169,11637,10199],{"class":1186},[1169,11639,1269],{"class":1204},[1169,11641,10204],{"class":1272},[1169,11643,2464],{"class":1204},[1169,11645,11646],{"class":1171,"line":1413},[1169,11647,2936],{"class":1186},[1169,11649,11650,11652],{"class":1171,"line":1434},[1169,11651,5349],{"class":1182},[1169,11653,2984],{"class":1204},[1169,11655,11656],{"class":1171,"line":1440},[1169,11657,11658],{"class":1182},"        yield\n",[1169,11660,11661,11664],{"class":1171,"line":1461},[1169,11662,11663],{"class":1182},"    finally",[1169,11665,2984],{"class":1204},[1169,11667,11668,11671,11673,11675,11677,11679],{"class":1171,"line":1478},[1169,11669,11670],{"class":1186},"        end_time ",[1169,11672,2432],{"class":1204},[1169,11674,10199],{"class":1186},[1169,11676,1269],{"class":1204},[1169,11678,10204],{"class":1272},[1169,11680,2464],{"class":1204},[1169,11682,11683,11686,11688,11690,11692,11694,11696,11698,11700,11702],{"class":1171,"line":1498},[1169,11684,11685],{"class":1186},"        query_count ",[1169,11687,2432],{"class":1204},[1169,11689,11616],{"class":2728},[1169,11691,1276],{"class":1204},[1169,11693,11621],{"class":1272},[1169,11695,1269],{"class":1204},[1169,11697,11626],{"class":2440},[1169,11699,2351],{"class":1204},[1169,11701,6561],{"class":2344},[1169,11703,11704],{"class":1186}," initial_queries\n",[1169,11706,11707,11710,11712,11715,11717],{"class":1171,"line":1504},[1169,11708,11709],{"class":1186},"        duration ",[1169,11711,2432],{"class":1204},[1169,11713,11714],{"class":1186}," end_time ",[1169,11716,11459],{"class":2344},[1169,11718,10265],{"class":1186},[1169,11720,11721],{"class":1171,"line":1518},[1169,11722,3786],{"class":1186},[1169,11724,11725,11727,11730,11732,11734,11736],{"class":1171,"line":1537},[1169,11726,3815],{"class":1182},[1169,11728,11729],{"class":1186}," query_count ",[1169,11731,10408],{"class":2344},[1169,11733,2541],{"class":1362},[1169,11735,1225],{"class":1204},[1169,11737,11738],{"class":1175},"  # Threshold for too many queries\n",[1169,11740,11741,11743,11745,11747,11749,11751,11754,11756,11759,11761,11764,11766,11768,11770,11772,11774],{"class":1171,"line":1573},[1169,11742,4823],{"class":1186},[1169,11744,1269],{"class":1204},[1169,11746,10425],{"class":1272},[1169,11748,1276],{"class":1204},[1169,11750,3454],{"class":2398},[1169,11752,11753],{"class":1218},"\"High query count: ",[1169,11755,2823],{"class":2822},[1169,11757,11758],{"class":1272},"query_count",[1169,11760,2828],{"class":2822},[1169,11762,11763],{"class":1218}," queries in ",[1169,11765,2823],{"class":2822},[1169,11767,10351],{"class":1272},[1169,11769,10454],{"class":2398},[1169,11771,2828],{"class":2822},[1169,11773,10459],{"class":1218},[1169,11775,2373],{"class":1204},[1169,11777,11778],{"class":1171,"line":1586},[1169,11779,3786],{"class":1186},[1169,11781,11782,11784,11786,11788,11791,11793],{"class":1171,"line":1605},[1169,11783,3815],{"class":1182},[1169,11785,10405],{"class":1186},[1169,11787,10408],{"class":2344},[1169,11789,11790],{"class":1362}," 1.0",[1169,11792,1225],{"class":1204},[1169,11794,11795],{"class":1175},"  # Threshold for slow operations\n",[1169,11797,11798,11800,11802,11804,11806,11808,11811,11813,11815,11817,11819,11822,11824,11826,11828,11831],{"class":1171,"line":1610},[1169,11799,4823],{"class":1186},[1169,11801,1269],{"class":1204},[1169,11803,10425],{"class":1272},[1169,11805,1276],{"class":1204},[1169,11807,3454],{"class":2398},[1169,11809,11810],{"class":1218},"\"Slow operation: ",[1169,11812,2823],{"class":2822},[1169,11814,10351],{"class":1272},[1169,11816,10454],{"class":2398},[1169,11818,2828],{"class":2822},[1169,11820,11821],{"class":1218},"s with ",[1169,11823,2823],{"class":2822},[1169,11825,11758],{"class":1272},[1169,11827,2828],{"class":2822},[1169,11829,11830],{"class":1218}," queries\"",[1169,11832,2373],{"class":1204},[1169,11834,11835],{"class":1171,"line":1629},[1169,11836,1194],{"emptyLinePlaceholder":1193},[1169,11838,11839,11841,11844],{"class":1171,"line":1648},[1169,11840,2595],{"class":2398},[1169,11842,11843],{"class":2598}," OptimizedQuerySet",[1169,11845,2984],{"class":1204},[1169,11847,11848,11850,11853],{"class":1171,"line":1653},[1169,11849,2417],{"class":2416},[1169,11851,11852],{"class":2420},"QuerySet wrapper with caching and optimization",[1169,11854,2424],{"class":2416},[1169,11856,11857],{"class":1171,"line":1667},[1169,11858,2936],{"class":1186},[1169,11860,11861,11863,11865,11867,11869,11871,11873,11875,11877,11879,11881],{"class":1171,"line":1686},[1169,11862,3725],{"class":2398},[1169,11864,4643],{"class":2728},[1169,11866,1276],{"class":1204},[1169,11868,3734],{"class":3733},[1169,11870,1286],{"class":1204},[1169,11872,4180],{"class":2407},[1169,11874,1286],{"class":1204},[1169,11876,3225],{"class":2407},[1169,11878,2432],{"class":2344},[1169,11880,3230],{"class":1362},[1169,11882,2411],{"class":1204},[1169,11884,11885,11887,11889,11891,11893],{"class":1171,"line":1722},[1169,11886,4680],{"class":1200},[1169,11888,1269],{"class":1204},[1169,11890,4219],{"class":2440},[1169,11892,1205],{"class":1204},[1169,11894,11895],{"class":1186}," queryset\n",[1169,11897,11898,11900,11902,11904,11906],{"class":1171,"line":1735},[1169,11899,4680],{"class":1200},[1169,11901,1269],{"class":1204},[1169,11903,5978],{"class":2440},[1169,11905,1205],{"class":1204},[1169,11907,8121],{"class":1186},[1169,11909,11910],{"class":1171,"line":1754},[1169,11911,2936],{"class":1186},[1169,11913,11914,11916,11919,11921,11923],{"class":1171,"line":1759},[1169,11915,3725],{"class":2398},[1169,11917,11918],{"class":2335}," cached_count",[1169,11920,1276],{"class":1204},[1169,11922,3734],{"class":3733},[1169,11924,2411],{"class":1204},[1169,11926,11927,11929,11932],{"class":1171,"line":1779},[1169,11928,3756],{"class":2416},[1169,11930,11931],{"class":2420},"Cached count query",[1169,11933,2424],{"class":2416},[1169,11935,11936,11938,11940,11942,11945,11947,11949,11951,11953,11955,11957,11959,11961,11963,11966,11969,11971],{"class":1171,"line":1798},[1169,11937,3766],{"class":1186},[1169,11939,2432],{"class":1204},[1169,11941,2816],{"class":2398},[1169,11943,11944],{"class":1218},"\"queryset_count:",[1169,11946,2823],{"class":2822},[1169,11948,4045],{"class":2728},[1169,11950,1276],{"class":1204},[1169,11952,9272],{"class":3296},[1169,11954,1276],{"class":1204},[1169,11956,3734],{"class":1200},[1169,11958,1269],{"class":1204},[1169,11960,4219],{"class":2440},[1169,11962,1269],{"class":1204},[1169,11964,11965],{"class":2440},"query",[1169,11967,11968],{"class":1204},"))",[1169,11970,2828],{"class":2822},[1169,11972,2840],{"class":1218},[1169,11974,11975],{"class":1171,"line":1804},[1169,11976,3786],{"class":1186},[1169,11978,11979,11982,11984,11986,11988,11990,11992,11994],{"class":1171,"line":1810},[1169,11980,11981],{"class":1186},"        count ",[1169,11983,2432],{"class":1204},[1169,11985,2246],{"class":1186},[1169,11987,1269],{"class":1204},[1169,11989,2554],{"class":1272},[1169,11991,1276],{"class":1204},[1169,11993,2961],{"class":1272},[1169,11995,2373],{"class":1204},[1169,11997,11998,12000,12003,12005,12007],{"class":1171,"line":1815},[1169,11999,3815],{"class":1182},[1169,12001,12002],{"class":1186}," count ",[1169,12004,2975],{"class":2344},[1169,12006,2981],{"class":1380},[1169,12008,2984],{"class":1204},[1169,12010,12011,12014,12016],{"class":1171,"line":1821},[1169,12012,12013],{"class":1182},"            with",[1169,12015,11595],{"class":1272},[1169,12017,4170],{"class":1204},[1169,12019,12020,12023,12025,12027,12029,12031,12033,12035],{"class":1171,"line":1837},[1169,12021,12022],{"class":1186},"                count ",[1169,12024,2432],{"class":1204},[1169,12026,3860],{"class":1200},[1169,12028,1269],{"class":1204},[1169,12030,4219],{"class":2440},[1169,12032,1269],{"class":1204},[1169,12034,6199],{"class":1272},[1169,12036,2464],{"class":1204},[1169,12038,12039,12041,12043,12045,12047,12049,12051,12054,12056,12058,12060,12062],{"class":1171,"line":1851},[1169,12040,3891],{"class":1186},[1169,12042,1269],{"class":1204},[1169,12044,3049],{"class":1272},[1169,12046,1276],{"class":1204},[1169,12048,2961],{"class":1272},[1169,12050,1286],{"class":1204},[1169,12052,12053],{"class":1272}," count",[1169,12055,1286],{"class":1204},[1169,12057,3860],{"class":1200},[1169,12059,1269],{"class":1204},[1169,12061,5978],{"class":2440},[1169,12063,2373],{"class":1204},[1169,12065,12066],{"class":1171,"line":2939},[1169,12067,3786],{"class":1186},[1169,12069,12070,12072],{"class":1171,"line":2945},[1169,12071,2990],{"class":1182},[1169,12073,12074],{"class":1186}," count\n",[1169,12076,12077],{"class":1171,"line":2966},[1169,12078,2936],{"class":1186},[1169,12080,12081,12083,12086,12088,12090],{"class":1171,"line":2987},[1169,12082,3725],{"class":2398},[1169,12084,12085],{"class":2335}," cached_exists",[1169,12087,1276],{"class":1204},[1169,12089,3734],{"class":3733},[1169,12091,2411],{"class":1204},[1169,12093,12094,12096,12099],{"class":1171,"line":3002},[1169,12095,3756],{"class":2416},[1169,12097,12098],{"class":2420},"Cached exists query",[1169,12100,2424],{"class":2416},[1169,12102,12103,12105,12107,12109,12112,12114,12116,12118,12120,12122,12124,12126,12128,12130,12132,12134,12136],{"class":1171,"line":3007},[1169,12104,3766],{"class":1186},[1169,12106,2432],{"class":1204},[1169,12108,2816],{"class":2398},[1169,12110,12111],{"class":1218},"\"queryset_exists:",[1169,12113,2823],{"class":2822},[1169,12115,4045],{"class":2728},[1169,12117,1276],{"class":1204},[1169,12119,9272],{"class":3296},[1169,12121,1276],{"class":1204},[1169,12123,3734],{"class":1200},[1169,12125,1269],{"class":1204},[1169,12127,4219],{"class":2440},[1169,12129,1269],{"class":1204},[1169,12131,11965],{"class":2440},[1169,12133,11968],{"class":1204},[1169,12135,2828],{"class":2822},[1169,12137,2840],{"class":1218},[1169,12139,12140],{"class":1171,"line":3013},[1169,12141,3786],{"class":1186},[1169,12143,12144,12147,12149,12151,12153,12155,12157,12159],{"class":1171,"line":3030},[1169,12145,12146],{"class":1186},"        exists ",[1169,12148,2432],{"class":1204},[1169,12150,2246],{"class":1186},[1169,12152,1269],{"class":1204},[1169,12154,2554],{"class":1272},[1169,12156,1276],{"class":1204},[1169,12158,2961],{"class":1272},[1169,12160,2373],{"class":1204},[1169,12162,12163,12165,12168,12170,12172],{"class":1171,"line":3035},[1169,12164,3815],{"class":1182},[1169,12166,12167],{"class":1186}," exists ",[1169,12169,2975],{"class":2344},[1169,12171,2981],{"class":1380},[1169,12173,2984],{"class":1204},[1169,12175,12176,12178,12180],{"class":1171,"line":3041},[1169,12177,12013],{"class":1182},[1169,12179,11595],{"class":1272},[1169,12181,4170],{"class":1204},[1169,12183,12184,12187,12189,12191,12193,12195,12197,12200],{"class":1171,"line":3068},[1169,12185,12186],{"class":1186},"                exists ",[1169,12188,2432],{"class":1204},[1169,12190,3860],{"class":1200},[1169,12192,1269],{"class":1204},[1169,12194,4219],{"class":2440},[1169,12196,1269],{"class":1204},[1169,12198,12199],{"class":1272},"exists",[1169,12201,2464],{"class":1204},[1169,12203,12204,12206,12208,12210,12212,12214,12216,12219,12221,12223,12225,12227],{"class":1171,"line":3073},[1169,12205,3891],{"class":1186},[1169,12207,1269],{"class":1204},[1169,12209,3049],{"class":1272},[1169,12211,1276],{"class":1204},[1169,12213,2961],{"class":1272},[1169,12215,1286],{"class":1204},[1169,12217,12218],{"class":1272}," exists",[1169,12220,1286],{"class":1204},[1169,12222,3860],{"class":1200},[1169,12224,1269],{"class":1204},[1169,12226,5978],{"class":2440},[1169,12228,2373],{"class":1204},[1169,12230,12231],{"class":1171,"line":4397},[1169,12232,3786],{"class":1186},[1169,12234,12235,12237],{"class":1171,"line":4403},[1169,12236,2990],{"class":1182},[1169,12238,12239],{"class":1186}," exists\n",[1169,12241,12242],{"class":1171,"line":4408},[1169,12243,2936],{"class":1186},[1169,12245,12246,12248,12251,12253,12255,12257,12260,12262,12264,12266,12269,12271,12273],{"class":1171,"line":4414},[1169,12247,3725],{"class":2398},[1169,12249,12250],{"class":2335}," cached_list",[1169,12252,1276],{"class":1204},[1169,12254,3734],{"class":3733},[1169,12256,1286],{"class":1204},[1169,12258,12259],{"class":2407}," select_related",[1169,12261,2432],{"class":2344},[1169,12263,3993],{"class":1380},[1169,12265,1286],{"class":1204},[1169,12267,12268],{"class":2407}," prefetch_related",[1169,12270,2432],{"class":2344},[1169,12272,3993],{"class":1380},[1169,12274,2411],{"class":1204},[1169,12276,12277,12279,12282],{"class":1171,"line":4430},[1169,12278,3756],{"class":2416},[1169,12280,12281],{"class":2420},"Cached list query with optimizations",[1169,12283,2424],{"class":2416},[1169,12285,12286,12288,12290,12292,12294],{"class":1171,"line":4450},[1169,12287,4128],{"class":1186},[1169,12289,2432],{"class":1204},[1169,12291,3860],{"class":1200},[1169,12293,1269],{"class":1204},[1169,12295,12296],{"class":2440},"queryset\n",[1169,12298,12299],{"class":1171,"line":4456},[1169,12300,3786],{"class":1186},[1169,12302,12303,12305,12307],{"class":1171,"line":4505},[1169,12304,3815],{"class":1182},[1169,12306,12259],{"class":1186},[1169,12308,2984],{"class":1204},[1169,12310,12311,12313,12315,12317,12319,12321,12323,12325,12327],{"class":1171,"line":4513},[1169,12312,4175],{"class":1186},[1169,12314,2432],{"class":1204},[1169,12316,4180],{"class":1186},[1169,12318,1269],{"class":1204},[1169,12320,2446],{"class":1272},[1169,12322,1276],{"class":1204},[1169,12324,4437],{"class":2344},[1169,12326,2446],{"class":1272},[1169,12328,2373],{"class":1204},[1169,12330,12331],{"class":1171,"line":5401},[1169,12332,3786],{"class":1186},[1169,12334,12335,12337,12339],{"class":1171,"line":5420},[1169,12336,3815],{"class":1182},[1169,12338,12268],{"class":1186},[1169,12340,2984],{"class":1204},[1169,12342,12343,12345,12347,12349,12351,12354,12356,12358,12360],{"class":1171,"line":5440},[1169,12344,4175],{"class":1186},[1169,12346,2432],{"class":1204},[1169,12348,4180],{"class":1186},[1169,12350,1269],{"class":1204},[1169,12352,12353],{"class":1272},"prefetch_related",[1169,12355,1276],{"class":1204},[1169,12357,4437],{"class":2344},[1169,12359,12353],{"class":1272},[1169,12361,2373],{"class":1204},[1169,12363,12364],{"class":1171,"line":5460},[1169,12365,3786],{"class":1186},[1169,12367,12368,12370,12372,12374,12377,12379,12381,12383,12385,12387,12389,12391,12393,12395,12397],{"class":1171,"line":5473},[1169,12369,3766],{"class":1186},[1169,12371,2432],{"class":1204},[1169,12373,2816],{"class":2398},[1169,12375,12376],{"class":1218},"\"queryset_list:",[1169,12378,2823],{"class":2822},[1169,12380,4045],{"class":2728},[1169,12382,1276],{"class":1204},[1169,12384,9272],{"class":3296},[1169,12386,1276],{"class":1204},[1169,12388,4219],{"class":1272},[1169,12390,1269],{"class":1204},[1169,12392,11965],{"class":2440},[1169,12394,11968],{"class":1204},[1169,12396,2828],{"class":2822},[1169,12398,2840],{"class":1218},[1169,12400,12401],{"class":1171,"line":5497},[1169,12402,3786],{"class":1186},[1169,12404,12405,12408,12410,12412,12414,12416,12418,12420],{"class":1171,"line":5521},[1169,12406,12407],{"class":1186},"        results ",[1169,12409,2432],{"class":1204},[1169,12411,2246],{"class":1186},[1169,12413,1269],{"class":1204},[1169,12415,2554],{"class":1272},[1169,12417,1276],{"class":1204},[1169,12419,2961],{"class":1272},[1169,12421,2373],{"class":1204},[1169,12423,12424,12426,12429,12431,12433],{"class":1171,"line":5527},[1169,12425,3815],{"class":1182},[1169,12427,12428],{"class":1186}," results ",[1169,12430,2975],{"class":2344},[1169,12432,2981],{"class":1380},[1169,12434,2984],{"class":1204},[1169,12436,12437,12439,12441],{"class":1171,"line":5533},[1169,12438,12013],{"class":1182},[1169,12440,11595],{"class":1272},[1169,12442,4170],{"class":1204},[1169,12444,12445,12448,12450,12452,12454,12456,12458,12460],{"class":1171,"line":5538},[1169,12446,12447],{"class":1186},"                results ",[1169,12449,2432],{"class":1204},[1169,12451,4214],{"class":3296},[1169,12453,1276],{"class":1204},[1169,12455,4219],{"class":1272},[1169,12457,1269],{"class":1204},[1169,12459,2461],{"class":1272},[1169,12461,2741],{"class":1204},[1169,12463,12464,12466,12468,12470,12472,12474,12476,12479,12481,12483,12485,12487],{"class":1171,"line":5544},[1169,12465,3891],{"class":1186},[1169,12467,1269],{"class":1204},[1169,12469,3049],{"class":1272},[1169,12471,1276],{"class":1204},[1169,12473,2961],{"class":1272},[1169,12475,1286],{"class":1204},[1169,12477,12478],{"class":1272}," results",[1169,12480,1286],{"class":1204},[1169,12482,3860],{"class":1200},[1169,12484,1269],{"class":1204},[1169,12486,5978],{"class":2440},[1169,12488,2373],{"class":1204},[1169,12490,12491],{"class":1171,"line":5569},[1169,12492,3786],{"class":1186},[1169,12494,12495,12497],{"class":1171,"line":5577},[1169,12496,2990],{"class":1182},[1169,12498,12499],{"class":1186}," results\n",[1169,12501,12502],{"class":1171,"line":5582},[1169,12503,1194],{"emptyLinePlaceholder":1193},[1169,12505,12506],{"class":1171,"line":5596},[1169,12507,5228],{"class":1175},[1169,12509,12510,12512,12515,12517,12519],{"class":1171,"line":6716},[1169,12511,2399],{"class":2398},[1169,12513,12514],{"class":2335}," get_user_orders_optimized",[1169,12516,1276],{"class":1204},[1169,12518,3335],{"class":2407},[1169,12520,2411],{"class":1204},[1169,12522,12523,12525,12528],{"class":1171,"line":6726},[1169,12524,2417],{"class":2416},[1169,12526,12527],{"class":2420},"Get user orders with query optimization",[1169,12529,2424],{"class":2416},[1169,12531,12532,12535,12538,12540,12542,12544],{"class":1171,"line":6750},[1169,12533,12534],{"class":1182},"    from",[1169,12536,12537],{"class":1186}," order_service",[1169,12539,1269],{"class":1204},[1169,12541,5678],{"class":1186},[1169,12543,1183],{"class":1182},[1169,12545,12546],{"class":1186}," Order\n",[1169,12548,12549],{"class":1171,"line":6755},[1169,12550,2936],{"class":1186},[1169,12552,12553,12555,12557,12560,12562,12564,12566,12568,12570,12572,12574,12576],{"class":1171,"line":6761},[1169,12554,2612],{"class":1186},[1169,12556,2432],{"class":1204},[1169,12558,12559],{"class":1186}," Order",[1169,12561,1269],{"class":1204},[1169,12563,2441],{"class":2440},[1169,12565,1269],{"class":1204},[1169,12567,4185],{"class":1272},[1169,12569,1276],{"class":1204},[1169,12571,3335],{"class":2484},[1169,12573,2432],{"class":1204},[1169,12575,3335],{"class":1272},[1169,12577,2373],{"class":1204},[1169,12579,12580,12583,12585,12587,12589,12591,12593,12595,12597,12599],{"class":1171,"line":6781},[1169,12581,12582],{"class":1186},"    optimized_qs ",[1169,12584,2432],{"class":1204},[1169,12586,11843],{"class":1272},[1169,12588,1276],{"class":1204},[1169,12590,4219],{"class":1272},[1169,12592,1286],{"class":1204},[1169,12594,3225],{"class":2484},[1169,12596,2432],{"class":1204},[1169,12598,4002],{"class":1362},[1169,12600,2373],{"class":1204},[1169,12602,12603],{"class":1171,"line":6792},[1169,12604,2936],{"class":1186},[1169,12606,12607,12609,12612,12614,12617],{"class":1171,"line":6817},[1169,12608,2497],{"class":1182},[1169,12610,12611],{"class":1186}," optimized_qs",[1169,12613,1269],{"class":1204},[1169,12615,12616],{"class":1272},"cached_list",[1169,12618,3402],{"class":1204},[1169,12620,12621,12624,12626,12628,12630,12632],{"class":1171,"line":6822},[1169,12622,12623],{"class":2484},"        select_related",[1169,12625,7738],{"class":1204},[1169,12627,1222],{"class":1214},[1169,12629,3357],{"class":1218},[1169,12631,1222],{"class":1214},[1169,12633,10644],{"class":1204},[1169,12635,12636,12639,12641,12643,12646,12648],{"class":1171,"line":6854},[1169,12637,12638],{"class":2484},"        prefetch_related",[1169,12640,7738],{"class":1204},[1169,12642,1222],{"class":1214},[1169,12644,12645],{"class":1218},"items__product",[1169,12647,1222],{"class":1214},[1169,12649,2112],{"class":1204},[1169,12651,12652],{"class":1171,"line":6859},[1169,12653,9687],{"class":1204},[1077,12655,12657],{"id":12656},"memory-usage-optimization","Memory Usage Optimization",[1159,12659,12661],{"className":1161,"code":12660,"language":1163,"meta":1164,"style":1164},"# shared/memory_optimization.py\nimport gc\nimport psutil\nimport logging\nfrom django.core.management.base import BaseCommand\nfrom django.core.cache import cache\n\nlogger = logging.getLogger(__name__)\n\nclass MemoryMonitor:\n    \"\"\"Monitor and optimize memory usage\"\"\"\n    \n    def __init__(self):\n        self.process = psutil.Process()\n    \n    def get_memory_usage(self):\n        \"\"\"Get current memory usage\"\"\"\n        memory_info = self.process.memory_info()\n        return {\n            'rss': memory_info.rss / 1024 / 1024,  # MB\n            'vms': memory_info.vms / 1024 / 1024,  # MB\n            'percent': self.process.memory_percent()\n        }\n    \n    def optimize_memory(self):\n        \"\"\"Perform memory optimization\"\"\"\n        initial_memory = self.get_memory_usage()\n        \n        # Force garbage collection\n        collected = gc.collect()\n        \n        # Clear expired cache entries\n        self.clear_expired_cache()\n        \n        final_memory = self.get_memory_usage()\n        \n        logger.info(f\"Memory optimization: {collected} objects collected, \"\n                   f\"memory reduced from {initial_memory['rss']:.1f}MB to {final_memory['rss']:.1f}MB\")\n        \n        return {\n            'initial_memory': initial_memory,\n            'final_memory': final_memory,\n            'objects_collected': collected\n        }\n    \n    def clear_expired_cache(self):\n        \"\"\"Clear expired cache entries\"\"\"\n        try:\n            # This is Redis-specific - adapt for other cache backends\n            from django_redis import get_redis_connection\n            \n            redis_conn = get_redis_connection(\"default\")\n            \n            # Get all keys\n            keys = redis_conn.keys(\"*\")\n            expired_keys = []\n            \n            for key in keys:\n                ttl = redis_conn.ttl(key)\n                if ttl == -1:  # No expiration set\n                    continue\n                elif ttl \u003C= 0:  # Expired\n                    expired_keys.append(key)\n            \n            if expired_keys:\n                redis_conn.delete(*expired_keys)\n                logger.info(f\"Cleared {len(expired_keys)} expired cache entries\")\n        \n        except Exception as e:\n            logger.error(f\"Failed to clear expired cache: {e}\")\n\n# Memory monitoring middleware\nclass MemoryMonitoringMiddleware:\n    \"\"\"Middleware to monitor memory usage per request\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        self.memory_monitor = MemoryMonitor()\n    \n    def __call__(self, request):\n        initial_memory = self.memory_monitor.get_memory_usage()\n        \n        response = self.get_response(request)\n        \n        final_memory = self.memory_monitor.get_memory_usage()\n        memory_diff = final_memory['rss'] - initial_memory['rss']\n        \n        # Log high memory usage requests\n        if memory_diff > 50:  # 50MB threshold\n            logger.warning(f\"High memory usage request: {request.path} used {memory_diff:.1f}MB\")\n        \n        # Add memory usage to response headers (for debugging)\n        if hasattr(response, '__setitem__'):\n            response['X-Memory-Usage'] = f\"{final_memory['rss']:.1f}MB\"\n            response['X-Memory-Delta'] = f\"{memory_diff:.1f}MB\"\n        \n        return response\n\n# Management command for memory optimization\nclass Command(BaseCommand):\n    help = 'Optimize memory usage'\n    \n    def handle(self, *args, **options):\n        monitor = MemoryMonitor()\n        result = monitor.optimize_memory()\n        \n        self.stdout.write(\n            self.style.SUCCESS(\n                f\"Memory optimization completed: \"\n                f\"{result['objects_collected']} objects collected\"\n            )\n        )\n",[1166,12662,12663,12668,12675,12682,12688,12710,12728,12732,12750,12754,12763,12772,12776,12788,12809,12813,12826,12835,12855,12861,12893,12922,12946,12950,12954,12967,12976,12992,12996,13001,13018,13022,13027,13038,13042,13057,13061,13087,13142,13146,13152,13167,13182,13196,13200,13204,13217,13226,13232,13237,13250,13254,13274,13278,13283,13307,13316,13320,13333,13353,13373,13378,13395,13410,13414,13423,13441,13473,13477,13490,13515,13519,13524,13533,13542,13546,13563,13577,13592,13596,13613,13631,13635,13654,13658,13676,13709,13713,13718,13734,13775,13779,13784,13805,13848,13879,13883,13889,13893,13898,13910,13923,13927,13951,13962,13979,13983,13997,14011,14019,14045,14050],{"__ignoreMap":1164},[1169,12664,12665],{"class":1171,"line":1172},[1169,12666,12667],{"class":1175},"# shared/memory_optimization.py\n",[1169,12669,12670,12672],{"class":1171,"line":1179},[1169,12671,1183],{"class":1182},[1169,12673,12674],{"class":1186}," gc\n",[1169,12676,12677,12679],{"class":1171,"line":1190},[1169,12678,1183],{"class":1182},[1169,12680,12681],{"class":1186}," psutil\n",[1169,12683,12684,12686],{"class":1171,"line":1197},[1169,12685,1183],{"class":1182},[1169,12687,4569],{"class":1186},[1169,12689,12690,12692,12694,12696,12698,12700,12702,12704,12706,12708],{"class":1171,"line":1211},[1169,12691,1879],{"class":1182},[1169,12693,2182],{"class":1186},[1169,12695,1269],{"class":1204},[1169,12697,2237],{"class":1186},[1169,12699,1269],{"class":1204},[1169,12701,5629],{"class":1186},[1169,12703,1269],{"class":1204},[1169,12705,5634],{"class":1186},[1169,12707,1183],{"class":1182},[1169,12709,5639],{"class":1186},[1169,12711,12712,12714,12716,12718,12720,12722,12724,12726],{"class":1171,"line":1230},[1169,12713,1879],{"class":1182},[1169,12715,2182],{"class":1186},[1169,12717,1269],{"class":1204},[1169,12719,2237],{"class":1186},[1169,12721,1269],{"class":1204},[1169,12723,2197],{"class":1186},[1169,12725,1183],{"class":1182},[1169,12727,3128],{"class":1186},[1169,12729,12730],{"class":1171,"line":1254},[1169,12731,1194],{"emptyLinePlaceholder":1193},[1169,12733,12734,12736,12738,12740,12742,12744,12746,12748],{"class":1171,"line":1299},[1169,12735,4592],{"class":1186},[1169,12737,2432],{"class":1204},[1169,12739,4597],{"class":1186},[1169,12741,1269],{"class":1204},[1169,12743,4602],{"class":1272},[1169,12745,1276],{"class":1204},[1169,12747,4608],{"class":4607},[1169,12749,2373],{"class":1204},[1169,12751,12752],{"class":1171,"line":1313},[1169,12753,1194],{"emptyLinePlaceholder":1193},[1169,12755,12756,12758,12761],{"class":1171,"line":1335},[1169,12757,2595],{"class":2398},[1169,12759,12760],{"class":2598}," MemoryMonitor",[1169,12762,2984],{"class":1204},[1169,12764,12765,12767,12770],{"class":1171,"line":1349},[1169,12766,2417],{"class":2416},[1169,12768,12769],{"class":2420},"Monitor and optimize memory usage",[1169,12771,2424],{"class":2416},[1169,12773,12774],{"class":1171,"line":1368},[1169,12775,2936],{"class":1186},[1169,12777,12778,12780,12782,12784,12786],{"class":1171,"line":1386},[1169,12779,3725],{"class":2398},[1169,12781,4643],{"class":2728},[1169,12783,1276],{"class":1204},[1169,12785,3734],{"class":3733},[1169,12787,2411],{"class":1204},[1169,12789,12790,12792,12794,12797,12799,12802,12804,12807],{"class":1171,"line":1392},[1169,12791,4680],{"class":1200},[1169,12793,1269],{"class":1204},[1169,12795,12796],{"class":2440},"process",[1169,12798,1205],{"class":1204},[1169,12800,12801],{"class":1186}," psutil",[1169,12803,1269],{"class":1204},[1169,12805,12806],{"class":1272},"Process",[1169,12808,2464],{"class":1204},[1169,12810,12811],{"class":1171,"line":1413},[1169,12812,2936],{"class":1186},[1169,12814,12815,12817,12820,12822,12824],{"class":1171,"line":1434},[1169,12816,3725],{"class":2398},[1169,12818,12819],{"class":2335}," get_memory_usage",[1169,12821,1276],{"class":1204},[1169,12823,3734],{"class":3733},[1169,12825,2411],{"class":1204},[1169,12827,12828,12830,12833],{"class":1171,"line":1440},[1169,12829,3756],{"class":2416},[1169,12831,12832],{"class":2420},"Get current memory usage",[1169,12834,2424],{"class":2416},[1169,12836,12837,12840,12842,12844,12846,12848,12850,12853],{"class":1171,"line":1461},[1169,12838,12839],{"class":1186},"        memory_info ",[1169,12841,2432],{"class":1204},[1169,12843,3860],{"class":1200},[1169,12845,1269],{"class":1204},[1169,12847,12796],{"class":2440},[1169,12849,1269],{"class":1204},[1169,12851,12852],{"class":1272},"memory_info",[1169,12854,2464],{"class":1204},[1169,12856,12857,12859],{"class":1171,"line":1478},[1169,12858,2990],{"class":1182},[1169,12860,1208],{"class":1204},[1169,12862,12863,12865,12868,12870,12872,12875,12877,12879,12881,12884,12886,12888,12890],{"class":1171,"line":1498},[1169,12864,1316],{"class":1214},[1169,12866,12867],{"class":1218},"rss",[1169,12869,1222],{"class":1214},[1169,12871,1225],{"class":1204},[1169,12873,12874],{"class":1186}," memory_info",[1169,12876,1269],{"class":1204},[1169,12878,12867],{"class":2440},[1169,12880,10576],{"class":2344},[1169,12882,12883],{"class":1362}," 1024",[1169,12885,10576],{"class":2344},[1169,12887,12883],{"class":1362},[1169,12889,1286],{"class":1204},[1169,12891,12892],{"class":1175},"  # MB\n",[1169,12894,12895,12897,12900,12902,12904,12906,12908,12910,12912,12914,12916,12918,12920],{"class":1171,"line":1504},[1169,12896,1316],{"class":1214},[1169,12898,12899],{"class":1218},"vms",[1169,12901,1222],{"class":1214},[1169,12903,1225],{"class":1204},[1169,12905,12874],{"class":1186},[1169,12907,1269],{"class":1204},[1169,12909,12899],{"class":2440},[1169,12911,10576],{"class":2344},[1169,12913,12883],{"class":1362},[1169,12915,10576],{"class":2344},[1169,12917,12883],{"class":1362},[1169,12919,1286],{"class":1204},[1169,12921,12892],{"class":1175},[1169,12923,12924,12926,12929,12931,12933,12935,12937,12939,12941,12944],{"class":1171,"line":1518},[1169,12925,1316],{"class":1214},[1169,12927,12928],{"class":1218},"percent",[1169,12930,1222],{"class":1214},[1169,12932,1225],{"class":1204},[1169,12934,3860],{"class":1200},[1169,12936,1269],{"class":1204},[1169,12938,12796],{"class":2440},[1169,12940,1269],{"class":1204},[1169,12942,12943],{"class":1272},"memory_percent",[1169,12945,2464],{"class":1204},[1169,12947,12948],{"class":1171,"line":1537},[1169,12949,5530],{"class":1204},[1169,12951,12952],{"class":1171,"line":1573},[1169,12953,2936],{"class":1186},[1169,12955,12956,12958,12961,12963,12965],{"class":1171,"line":1586},[1169,12957,3725],{"class":2398},[1169,12959,12960],{"class":2335}," optimize_memory",[1169,12962,1276],{"class":1204},[1169,12964,3734],{"class":3733},[1169,12966,2411],{"class":1204},[1169,12968,12969,12971,12974],{"class":1171,"line":1605},[1169,12970,3756],{"class":2416},[1169,12972,12973],{"class":2420},"Perform memory optimization",[1169,12975,2424],{"class":2416},[1169,12977,12978,12981,12983,12985,12987,12990],{"class":1171,"line":1610},[1169,12979,12980],{"class":1186},"        initial_memory ",[1169,12982,2432],{"class":1204},[1169,12984,3860],{"class":1200},[1169,12986,1269],{"class":1204},[1169,12988,12989],{"class":1272},"get_memory_usage",[1169,12991,2464],{"class":1204},[1169,12993,12994],{"class":1171,"line":1629},[1169,12995,3786],{"class":1186},[1169,12997,12998],{"class":1171,"line":1648},[1169,12999,13000],{"class":1175},"        # Force garbage collection\n",[1169,13002,13003,13006,13008,13011,13013,13016],{"class":1171,"line":1653},[1169,13004,13005],{"class":1186},"        collected ",[1169,13007,2432],{"class":1204},[1169,13009,13010],{"class":1186}," gc",[1169,13012,1269],{"class":1204},[1169,13014,13015],{"class":1272},"collect",[1169,13017,2464],{"class":1204},[1169,13019,13020],{"class":1171,"line":1667},[1169,13021,3786],{"class":1186},[1169,13023,13024],{"class":1171,"line":1686},[1169,13025,13026],{"class":1175},"        # Clear expired cache entries\n",[1169,13028,13029,13031,13033,13036],{"class":1171,"line":1722},[1169,13030,4680],{"class":1200},[1169,13032,1269],{"class":1204},[1169,13034,13035],{"class":1272},"clear_expired_cache",[1169,13037,2464],{"class":1204},[1169,13039,13040],{"class":1171,"line":1735},[1169,13041,3786],{"class":1186},[1169,13043,13044,13047,13049,13051,13053,13055],{"class":1171,"line":1754},[1169,13045,13046],{"class":1186},"        final_memory ",[1169,13048,2432],{"class":1204},[1169,13050,3860],{"class":1200},[1169,13052,1269],{"class":1204},[1169,13054,12989],{"class":1272},[1169,13056,2464],{"class":1204},[1169,13058,13059],{"class":1171,"line":1759},[1169,13060,3786],{"class":1186},[1169,13062,13063,13065,13067,13070,13072,13074,13077,13079,13082,13084],{"class":1171,"line":1779},[1169,13064,4973],{"class":1186},[1169,13066,1269],{"class":1204},[1169,13068,13069],{"class":1272},"info",[1169,13071,1276],{"class":1204},[1169,13073,3454],{"class":2398},[1169,13075,13076],{"class":1218},"\"Memory optimization: ",[1169,13078,2823],{"class":2822},[1169,13080,13081],{"class":1272},"collected",[1169,13083,2828],{"class":2822},[1169,13085,13086],{"class":1218}," objects collected, \"\n",[1169,13088,13089,13092,13095,13097,13100,13102,13104,13106,13108,13110,13113,13115,13118,13120,13123,13125,13127,13129,13131,13133,13135,13137,13140],{"class":1171,"line":1798},[1169,13090,13091],{"class":2398},"                   f",[1169,13093,13094],{"class":1218},"\"memory reduced from ",[1169,13096,2823],{"class":2822},[1169,13098,13099],{"class":1272},"initial_memory",[1169,13101,1908],{"class":1204},[1169,13103,1222],{"class":1214},[1169,13105,12867],{"class":1218},[1169,13107,1222],{"class":1214},[1169,13109,1918],{"class":1204},[1169,13111,13112],{"class":2398},":.1f",[1169,13114,2828],{"class":2822},[1169,13116,13117],{"class":1218},"MB to ",[1169,13119,2823],{"class":2822},[1169,13121,13122],{"class":1272},"final_memory",[1169,13124,1908],{"class":1204},[1169,13126,1222],{"class":1214},[1169,13128,12867],{"class":1218},[1169,13130,1222],{"class":1214},[1169,13132,1918],{"class":1204},[1169,13134,13112],{"class":2398},[1169,13136,2828],{"class":2822},[1169,13138,13139],{"class":1218},"MB\"",[1169,13141,2373],{"class":1204},[1169,13143,13144],{"class":1171,"line":1804},[1169,13145,3786],{"class":1186},[1169,13147,13148,13150],{"class":1171,"line":1810},[1169,13149,2990],{"class":1182},[1169,13151,1208],{"class":1204},[1169,13153,13154,13156,13158,13160,13162,13165],{"class":1171,"line":1815},[1169,13155,1316],{"class":1214},[1169,13157,13099],{"class":1218},[1169,13159,1222],{"class":1214},[1169,13161,1225],{"class":1204},[1169,13163,13164],{"class":1186}," initial_memory",[1169,13166,1251],{"class":1204},[1169,13168,13169,13171,13173,13175,13177,13180],{"class":1171,"line":1821},[1169,13170,1316],{"class":1214},[1169,13172,13122],{"class":1218},[1169,13174,1222],{"class":1214},[1169,13176,1225],{"class":1204},[1169,13178,13179],{"class":1186}," final_memory",[1169,13181,1251],{"class":1204},[1169,13183,13184,13186,13189,13191,13193],{"class":1171,"line":1837},[1169,13185,1316],{"class":1214},[1169,13187,13188],{"class":1218},"objects_collected",[1169,13190,1222],{"class":1214},[1169,13192,1225],{"class":1204},[1169,13194,13195],{"class":1186}," collected\n",[1169,13197,13198],{"class":1171,"line":1851},[1169,13199,5530],{"class":1204},[1169,13201,13202],{"class":1171,"line":2939},[1169,13203,2936],{"class":1186},[1169,13205,13206,13208,13211,13213,13215],{"class":1171,"line":2945},[1169,13207,3725],{"class":2398},[1169,13209,13210],{"class":2335}," clear_expired_cache",[1169,13212,1276],{"class":1204},[1169,13214,3734],{"class":3733},[1169,13216,2411],{"class":1204},[1169,13218,13219,13221,13224],{"class":1171,"line":2966},[1169,13220,3756],{"class":2416},[1169,13222,13223],{"class":2420},"Clear expired cache entries",[1169,13225,2424],{"class":2416},[1169,13227,13228,13230],{"class":1171,"line":2987},[1169,13229,3848],{"class":1182},[1169,13231,2984],{"class":1204},[1169,13233,13234],{"class":1171,"line":3002},[1169,13235,13236],{"class":1175},"            # This is Redis-specific - adapt for other cache backends\n",[1169,13238,13239,13242,13245,13247],{"class":1171,"line":3007},[1169,13240,13241],{"class":1182},"            from",[1169,13243,13244],{"class":1186}," django_redis ",[1169,13246,1183],{"class":1182},[1169,13248,13249],{"class":1186}," get_redis_connection\n",[1169,13251,13252],{"class":1171,"line":3013},[1169,13253,6316],{"class":1186},[1169,13255,13256,13259,13261,13264,13266,13268,13270,13272],{"class":1171,"line":3030},[1169,13257,13258],{"class":1186},"            redis_conn ",[1169,13260,2432],{"class":1204},[1169,13262,13263],{"class":1272}," get_redis_connection",[1169,13265,1276],{"class":1204},[1169,13267,2819],{"class":1214},[1169,13269,1219],{"class":1218},[1169,13271,2819],{"class":1214},[1169,13273,2373],{"class":1204},[1169,13275,13276],{"class":1171,"line":3035},[1169,13277,6316],{"class":1186},[1169,13279,13280],{"class":1171,"line":3041},[1169,13281,13282],{"class":1175},"            # Get all keys\n",[1169,13284,13285,13288,13290,13293,13295,13297,13299,13301,13303,13305],{"class":1171,"line":3068},[1169,13286,13287],{"class":1186},"            keys ",[1169,13289,2432],{"class":1204},[1169,13291,13292],{"class":1186}," redis_conn",[1169,13294,1269],{"class":1204},[1169,13296,4473],{"class":1272},[1169,13298,1276],{"class":1204},[1169,13300,2819],{"class":1214},[1169,13302,4437],{"class":1218},[1169,13304,2819],{"class":1214},[1169,13306,2373],{"class":1204},[1169,13308,13309,13312,13314],{"class":1171,"line":3073},[1169,13310,13311],{"class":1186},"            expired_keys ",[1169,13313,2432],{"class":1204},[1169,13315,10142],{"class":1204},[1169,13317,13318],{"class":1171,"line":4397},[1169,13319,6316],{"class":1186},[1169,13321,13322,13324,13326,13328,13331],{"class":1171,"line":4403},[1169,13323,6321],{"class":1182},[1169,13325,4420],{"class":1186},[1169,13327,3318],{"class":1182},[1169,13329,13330],{"class":1186}," keys",[1169,13332,2984],{"class":1204},[1169,13334,13335,13338,13340,13342,13344,13347,13349,13351],{"class":1171,"line":4408},[1169,13336,13337],{"class":1186},"                ttl ",[1169,13339,2432],{"class":1204},[1169,13341,13292],{"class":1186},[1169,13343,1269],{"class":1204},[1169,13345,13346],{"class":1272},"ttl",[1169,13348,1276],{"class":1204},[1169,13350,4478],{"class":1272},[1169,13352,2373],{"class":1204},[1169,13354,13355,13358,13361,13363,13365,13368,13370],{"class":1171,"line":4414},[1169,13356,13357],{"class":1182},"                if",[1169,13359,13360],{"class":1186}," ttl ",[1169,13362,10539],{"class":2344},[1169,13364,6561],{"class":2344},[1169,13366,13367],{"class":1362},"1",[1169,13369,1225],{"class":1204},[1169,13371,13372],{"class":1175},"  # No expiration set\n",[1169,13374,13375],{"class":1171,"line":4430},[1169,13376,13377],{"class":1182},"                    continue\n",[1169,13379,13380,13383,13385,13388,13390,13392],{"class":1171,"line":4450},[1169,13381,13382],{"class":1182},"                elif",[1169,13384,13360],{"class":1186},[1169,13386,13387],{"class":2344},"\u003C=",[1169,13389,10066],{"class":1362},[1169,13391,1225],{"class":1204},[1169,13393,13394],{"class":1175},"  # Expired\n",[1169,13396,13397,13400,13402,13404,13406,13408],{"class":1171,"line":4456},[1169,13398,13399],{"class":1186},"                    expired_keys",[1169,13401,1269],{"class":1204},[1169,13403,7348],{"class":1272},[1169,13405,1276],{"class":1204},[1169,13407,4478],{"class":1272},[1169,13409,2373],{"class":1204},[1169,13411,13412],{"class":1171,"line":4505},[1169,13413,6316],{"class":1186},[1169,13415,13416,13418,13421],{"class":1171,"line":4513},[1169,13417,7320],{"class":1182},[1169,13419,13420],{"class":1186}," expired_keys",[1169,13422,2984],{"class":1204},[1169,13424,13425,13428,13430,13432,13434,13436,13439],{"class":1171,"line":5401},[1169,13426,13427],{"class":1186},"                redis_conn",[1169,13429,1269],{"class":1204},[1169,13431,4520],{"class":1272},[1169,13433,1276],{"class":1204},[1169,13435,4437],{"class":2344},[1169,13437,13438],{"class":1272},"expired_keys",[1169,13440,2373],{"class":1204},[1169,13442,13443,13445,13447,13449,13451,13453,13456,13458,13460,13462,13464,13466,13468,13471],{"class":1171,"line":5420},[1169,13444,7500],{"class":1186},[1169,13446,1269],{"class":1204},[1169,13448,13069],{"class":1272},[1169,13450,1276],{"class":1204},[1169,13452,3454],{"class":2398},[1169,13454,13455],{"class":1218},"\"Cleared ",[1169,13457,2823],{"class":2822},[1169,13459,9475],{"class":2728},[1169,13461,1276],{"class":1204},[1169,13463,13438],{"class":1272},[1169,13465,2351],{"class":1204},[1169,13467,2828],{"class":2822},[1169,13469,13470],{"class":1218}," expired cache entries\"",[1169,13472,2373],{"class":1204},[1169,13474,13475],{"class":1171,"line":5440},[1169,13476,3786],{"class":1186},[1169,13478,13479,13481,13484,13486,13488],{"class":1171,"line":5460},[1169,13480,3921],{"class":1182},[1169,13482,13483],{"class":3296}," Exception",[1169,13485,9088],{"class":1182},[1169,13487,9091],{"class":1186},[1169,13489,2984],{"class":1204},[1169,13491,13492,13494,13496,13498,13500,13502,13505,13507,13509,13511,13513],{"class":1171,"line":5473},[1169,13493,4823],{"class":1186},[1169,13495,1269],{"class":1204},[1169,13497,9102],{"class":1272},[1169,13499,1276],{"class":1204},[1169,13501,3454],{"class":2398},[1169,13503,13504],{"class":1218},"\"Failed to clear expired cache: ",[1169,13506,2823],{"class":2822},[1169,13508,9130],{"class":1272},[1169,13510,2828],{"class":2822},[1169,13512,2819],{"class":1218},[1169,13514,2373],{"class":1204},[1169,13516,13517],{"class":1171,"line":5497},[1169,13518,1194],{"emptyLinePlaceholder":1193},[1169,13520,13521],{"class":1171,"line":5521},[1169,13522,13523],{"class":1175},"# Memory monitoring middleware\n",[1169,13525,13526,13528,13531],{"class":1171,"line":5527},[1169,13527,2595],{"class":2398},[1169,13529,13530],{"class":2598}," MemoryMonitoringMiddleware",[1169,13532,2984],{"class":1204},[1169,13534,13535,13537,13540],{"class":1171,"line":5533},[1169,13536,2417],{"class":2416},[1169,13538,13539],{"class":2420},"Middleware to monitor memory usage per request",[1169,13541,2424],{"class":2416},[1169,13543,13544],{"class":1171,"line":5538},[1169,13545,2936],{"class":1186},[1169,13547,13548,13550,13552,13554,13556,13558,13561],{"class":1171,"line":5544},[1169,13549,3725],{"class":2398},[1169,13551,4643],{"class":2728},[1169,13553,1276],{"class":1204},[1169,13555,3734],{"class":3733},[1169,13557,1286],{"class":1204},[1169,13559,13560],{"class":2407}," get_response",[1169,13562,2411],{"class":1204},[1169,13564,13565,13567,13569,13572,13574],{"class":1171,"line":5569},[1169,13566,4680],{"class":1200},[1169,13568,1269],{"class":1204},[1169,13570,13571],{"class":2440},"get_response",[1169,13573,1205],{"class":1204},[1169,13575,13576],{"class":1186}," get_response\n",[1169,13578,13579,13581,13583,13586,13588,13590],{"class":1171,"line":5577},[1169,13580,4680],{"class":1200},[1169,13582,1269],{"class":1204},[1169,13584,13585],{"class":2440},"memory_monitor",[1169,13587,1205],{"class":1204},[1169,13589,12760],{"class":1272},[1169,13591,2464],{"class":1204},[1169,13593,13594],{"class":1171,"line":5582},[1169,13595,2936],{"class":1186},[1169,13597,13598,13600,13603,13605,13607,13609,13611],{"class":1171,"line":5596},[1169,13599,3725],{"class":2398},[1169,13601,13602],{"class":2728}," __call__",[1169,13604,1276],{"class":1204},[1169,13606,3734],{"class":3733},[1169,13608,1286],{"class":1204},[1169,13610,2892],{"class":2407},[1169,13612,2411],{"class":1204},[1169,13614,13615,13617,13619,13621,13623,13625,13627,13629],{"class":1171,"line":6716},[1169,13616,12980],{"class":1186},[1169,13618,2432],{"class":1204},[1169,13620,3860],{"class":1200},[1169,13622,1269],{"class":1204},[1169,13624,13585],{"class":2440},[1169,13626,1269],{"class":1204},[1169,13628,12989],{"class":1272},[1169,13630,2464],{"class":1204},[1169,13632,13633],{"class":1171,"line":6726},[1169,13634,3786],{"class":1186},[1169,13636,13637,13640,13642,13644,13646,13648,13650,13652],{"class":1171,"line":6750},[1169,13638,13639],{"class":1186},"        response ",[1169,13641,2432],{"class":1204},[1169,13643,3860],{"class":1200},[1169,13645,1269],{"class":1204},[1169,13647,13571],{"class":1272},[1169,13649,1276],{"class":1204},[1169,13651,2408],{"class":1272},[1169,13653,2373],{"class":1204},[1169,13655,13656],{"class":1171,"line":6755},[1169,13657,3786],{"class":1186},[1169,13659,13660,13662,13664,13666,13668,13670,13672,13674],{"class":1171,"line":6761},[1169,13661,13046],{"class":1186},[1169,13663,2432],{"class":1204},[1169,13665,3860],{"class":1200},[1169,13667,1269],{"class":1204},[1169,13669,13585],{"class":2440},[1169,13671,1269],{"class":1204},[1169,13673,12989],{"class":1272},[1169,13675,2464],{"class":1204},[1169,13677,13678,13681,13683,13685,13687,13689,13691,13693,13695,13697,13699,13701,13703,13705,13707],{"class":1171,"line":6781},[1169,13679,13680],{"class":1186},"        memory_diff ",[1169,13682,2432],{"class":1204},[1169,13684,13179],{"class":1186},[1169,13686,1908],{"class":1204},[1169,13688,1222],{"class":1214},[1169,13690,12867],{"class":1218},[1169,13692,1222],{"class":1214},[1169,13694,1918],{"class":1204},[1169,13696,6561],{"class":2344},[1169,13698,13164],{"class":1186},[1169,13700,1908],{"class":1204},[1169,13702,1222],{"class":1214},[1169,13704,12867],{"class":1218},[1169,13706,1222],{"class":1214},[1169,13708,2112],{"class":1204},[1169,13710,13711],{"class":1171,"line":6792},[1169,13712,3786],{"class":1186},[1169,13714,13715],{"class":1171,"line":6817},[1169,13716,13717],{"class":1175},"        # Log high memory usage requests\n",[1169,13719,13720,13722,13725,13727,13729,13731],{"class":1171,"line":6822},[1169,13721,3815],{"class":1182},[1169,13723,13724],{"class":1186}," memory_diff ",[1169,13726,10408],{"class":2344},[1169,13728,1363],{"class":1362},[1169,13730,1225],{"class":1204},[1169,13732,13733],{"class":1175},"  # 50MB threshold\n",[1169,13735,13736,13738,13740,13742,13744,13746,13749,13751,13753,13755,13757,13759,13762,13764,13767,13769,13771,13773],{"class":1171,"line":6854},[1169,13737,4823],{"class":1186},[1169,13739,1269],{"class":1204},[1169,13741,10425],{"class":1272},[1169,13743,1276],{"class":1204},[1169,13745,3454],{"class":2398},[1169,13747,13748],{"class":1218},"\"High memory usage request: ",[1169,13750,2823],{"class":2822},[1169,13752,2408],{"class":1272},[1169,13754,1269],{"class":1204},[1169,13756,7263],{"class":2440},[1169,13758,2828],{"class":2822},[1169,13760,13761],{"class":1218}," used ",[1169,13763,2823],{"class":2822},[1169,13765,13766],{"class":1272},"memory_diff",[1169,13768,13112],{"class":2398},[1169,13770,2828],{"class":2822},[1169,13772,13139],{"class":1218},[1169,13774,2373],{"class":1204},[1169,13776,13777],{"class":1171,"line":6859},[1169,13778,3786],{"class":1186},[1169,13780,13781],{"class":1171,"line":6865},[1169,13782,13783],{"class":1175},"        # Add memory usage to response headers (for debugging)\n",[1169,13785,13786,13788,13790,13792,13794,13796,13798,13801,13803],{"class":1171,"line":6875},[1169,13787,3815],{"class":1182},[1169,13789,7589],{"class":2728},[1169,13791,1276],{"class":1204},[1169,13793,7594],{"class":1272},[1169,13795,1286],{"class":1204},[1169,13797,1243],{"class":1214},[1169,13799,13800],{"class":1218},"__setitem__",[1169,13802,1222],{"class":1214},[1169,13804,2411],{"class":1204},[1169,13806,13807,13810,13812,13814,13817,13819,13821,13823,13825,13827,13829,13831,13833,13835,13837,13839,13841,13843,13845],{"class":1171,"line":6899},[1169,13808,13809],{"class":1186},"            response",[1169,13811,1908],{"class":1204},[1169,13813,1222],{"class":1214},[1169,13815,13816],{"class":1218},"X-Memory-Usage",[1169,13818,1222],{"class":1214},[1169,13820,1918],{"class":1204},[1169,13822,1205],{"class":1204},[1169,13824,2816],{"class":2398},[1169,13826,2819],{"class":1218},[1169,13828,2823],{"class":2822},[1169,13830,13122],{"class":1186},[1169,13832,1908],{"class":1204},[1169,13834,1222],{"class":1214},[1169,13836,12867],{"class":1218},[1169,13838,1222],{"class":1214},[1169,13840,1918],{"class":1204},[1169,13842,13112],{"class":2398},[1169,13844,2828],{"class":2822},[1169,13846,13847],{"class":1218},"MB\"\n",[1169,13849,13850,13852,13854,13856,13859,13861,13863,13865,13867,13869,13871,13873,13875,13877],{"class":1171,"line":6935},[1169,13851,13809],{"class":1186},[1169,13853,1908],{"class":1204},[1169,13855,1222],{"class":1214},[1169,13857,13858],{"class":1218},"X-Memory-Delta",[1169,13860,1222],{"class":1214},[1169,13862,1918],{"class":1204},[1169,13864,1205],{"class":1204},[1169,13866,2816],{"class":2398},[1169,13868,2819],{"class":1218},[1169,13870,2823],{"class":2822},[1169,13872,13766],{"class":1186},[1169,13874,13112],{"class":2398},[1169,13876,2828],{"class":2822},[1169,13878,13847],{"class":1218},[1169,13880,13881],{"class":1171,"line":6959},[1169,13882,3786],{"class":1186},[1169,13884,13885,13887],{"class":1171,"line":6982},[1169,13886,2990],{"class":1182},[1169,13888,7689],{"class":1186},[1169,13890,13891],{"class":1171,"line":6992},[1169,13892,1194],{"emptyLinePlaceholder":1193},[1169,13894,13895],{"class":1171,"line":6997},[1169,13896,13897],{"class":1175},"# Management command for memory optimization\n",[1169,13899,13900,13902,13904,13906,13908],{"class":1171,"line":7002},[1169,13901,2595],{"class":2398},[1169,13903,5739],{"class":2598},[1169,13905,1276],{"class":1204},[1169,13907,5744],{"class":2604},[1169,13909,2411],{"class":1204},[1169,13911,13912,13914,13916,13918,13921],{"class":1171,"line":9503},[1169,13913,5751],{"class":2728},[1169,13915,1205],{"class":1204},[1169,13917,1243],{"class":1214},[1169,13919,13920],{"class":1218},"Optimize memory usage",[1169,13922,1834],{"class":1214},[1169,13924,13925],{"class":1171,"line":9509},[1169,13926,2936],{"class":1186},[1169,13928,13929,13931,13933,13935,13937,13939,13941,13943,13945,13947,13949],{"class":1171,"line":9521},[1169,13930,3725],{"class":2398},[1169,13932,5922],{"class":2335},[1169,13934,1276],{"class":1204},[1169,13936,3734],{"class":3733},[1169,13938,1286],{"class":1204},[1169,13940,2345],{"class":2344},[1169,13942,2672],{"class":2407},[1169,13944,1286],{"class":1204},[1169,13946,2677],{"class":2344},[1169,13948,5939],{"class":2407},[1169,13950,2411],{"class":1204},[1169,13952,13953,13956,13958,13960],{"class":1171,"line":9538},[1169,13954,13955],{"class":1186},"        monitor ",[1169,13957,2432],{"class":1204},[1169,13959,12760],{"class":1272},[1169,13961,2464],{"class":1204},[1169,13963,13964,13967,13969,13972,13974,13977],{"class":1171,"line":9549},[1169,13965,13966],{"class":1186},"        result ",[1169,13968,2432],{"class":1204},[1169,13970,13971],{"class":1186}," monitor",[1169,13973,1269],{"class":1204},[1169,13975,13976],{"class":1272},"optimize_memory",[1169,13978,2464],{"class":1204},[1169,13980,13981],{"class":1171,"line":9554},[1169,13982,3786],{"class":1186},[1169,13984,13985,13987,13989,13991,13993,13995],{"class":1171,"line":9559},[1169,13986,4680],{"class":1200},[1169,13988,1269],{"class":1204},[1169,13990,5995],{"class":2440},[1169,13992,1269],{"class":1204},[1169,13994,6000],{"class":1272},[1169,13996,3402],{"class":1204},[1169,13998,13999,14001,14003,14005,14007,14009],{"class":1171,"line":9571},[1169,14000,4932],{"class":1200},[1169,14002,1269],{"class":1204},[1169,14004,6114],{"class":2440},[1169,14006,1269],{"class":1204},[1169,14008,6119],{"class":1272},[1169,14010,3402],{"class":1204},[1169,14012,14013,14016],{"class":1171,"line":9587},[1169,14014,14015],{"class":2398},"                f",[1169,14017,14018],{"class":1218},"\"Memory optimization completed: \"\n",[1169,14020,14021,14023,14025,14027,14030,14032,14034,14036,14038,14040,14042],{"class":1171,"line":9597},[1169,14022,14015],{"class":2398},[1169,14024,2819],{"class":1218},[1169,14026,2823],{"class":2822},[1169,14028,14029],{"class":1272},"result",[1169,14031,1908],{"class":1204},[1169,14033,1222],{"class":1214},[1169,14035,13188],{"class":1218},[1169,14037,1222],{"class":1214},[1169,14039,1918],{"class":1204},[1169,14041,2828],{"class":2822},[1169,14043,14044],{"class":1218}," objects collected\"\n",[1169,14046,14047],{"class":1171,"line":9602},[1169,14048,14049],{"class":1204},"            )\n",[1169,14051,14052],{"class":1171,"line":9607},[1169,14053,5848],{"class":1204},[1030,14055,14057],{"id":14056},"advanced-caching-patterns","Advanced Caching Patterns",[1077,14059,14061],{"id":14060},"cache-aside-with-write-through","Cache-Aside with Write-Through",[1159,14063,14065],{"className":1161,"code":14064,"language":1163,"meta":1164,"style":1164},"# shared/cache_patterns.py\nfrom django.core.cache import cache\nfrom django.db import transaction\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass CacheAsidePattern:\n    \"\"\"Implement cache-aside pattern with write-through\"\"\"\n    \n    def __init__(self, model_class, cache_timeout=1800):\n        self.model_class = model_class\n        self.cache_timeout = cache_timeout\n    \n    def get(self, pk):\n        \"\"\"Get object with cache-aside pattern\"\"\"\n        cache_key = f\"{self.model_class._meta.label_lower}:{pk}\"\n        \n        # Try cache first\n        obj = cache.get(cache_key)\n        if obj is not None:\n            logger.debug(f\"Cache hit: {cache_key}\")\n            return obj\n        \n        # Get from database\n        try:\n            obj = self.model_class.objects.get(pk=pk)\n            # Cache the object\n            cache.set(cache_key, obj, self.cache_timeout)\n            logger.debug(f\"Cached object: {cache_key}\")\n            return obj\n        except self.model_class.DoesNotExist:\n            # Cache negative result\n            cache.set(cache_key, None, 60)  # Short timeout for negative results\n            return None\n    \n    def save(self, obj):\n        \"\"\"Save object with write-through caching\"\"\"\n        cache_key = f\"{self.model_class._meta.label_lower}:{obj.pk}\"\n        \n        with transaction.atomic():\n            # Save to database\n            obj.save()\n            \n            # Update cache\n            cache.set(cache_key, obj, self.cache_timeout)\n            logger.debug(f\"Write-through cache update: {cache_key}\")\n        \n        return obj\n    \n    def delete(self, obj):\n        \"\"\"Delete object and invalidate cache\"\"\"\n        cache_key = f\"{self.model_class._meta.label_lower}:{obj.pk}\"\n        \n        with transaction.atomic():\n            # Delete from database\n            obj.delete()\n            \n            # Remove from cache\n            cache.delete(cache_key)\n            logger.debug(f\"Cache invalidated: {cache_key}\")\n\n# Usage\nfrom user_service.models import User\n\nuser_cache = CacheAsidePattern(User, cache_timeout=3600)\n\ndef get_user_cached(user_id):\n    return user_cache.get(user_id)\n\ndef update_user_cached(user):\n    return user_cache.save(user)\n",[1166,14066,14067,14072,14090,14105,14111,14115,14133,14137,14146,14155,14159,14184,14198,14210,14214,14231,14240,14281,14285,14289,14308,14323,14348,14355,14359,14363,14369,14400,14405,14432,14457,14463,14479,14484,14509,14515,14519,14536,14545,14588,14592,14606,14611,14623,14627,14632,14658,14683,14687,14693,14697,14713,14722,14764,14768,14780,14785,14795,14799,14804,14818,14843,14847,14851,14865,14869,14893,14897,14910,14927,14931,14944],{"__ignoreMap":1164},[1169,14068,14069],{"class":1171,"line":1172},[1169,14070,14071],{"class":1175},"# shared/cache_patterns.py\n",[1169,14073,14074,14076,14078,14080,14082,14084,14086,14088],{"class":1171,"line":1179},[1169,14075,1879],{"class":1182},[1169,14077,2182],{"class":1186},[1169,14079,1269],{"class":1204},[1169,14081,2237],{"class":1186},[1169,14083,1269],{"class":1204},[1169,14085,2197],{"class":1186},[1169,14087,1183],{"class":1182},[1169,14089,3128],{"class":1186},[1169,14091,14092,14094,14096,14098,14100,14102],{"class":1171,"line":1190},[1169,14093,1879],{"class":1182},[1169,14095,2182],{"class":1186},[1169,14097,1269],{"class":1204},[1169,14099,3615],{"class":1186},[1169,14101,1183],{"class":1182},[1169,14103,14104],{"class":1186}," transaction\n",[1169,14106,14107,14109],{"class":1171,"line":1197},[1169,14108,1183],{"class":1182},[1169,14110,4569],{"class":1186},[1169,14112,14113],{"class":1171,"line":1211},[1169,14114,1194],{"emptyLinePlaceholder":1193},[1169,14116,14117,14119,14121,14123,14125,14127,14129,14131],{"class":1171,"line":1230},[1169,14118,4592],{"class":1186},[1169,14120,2432],{"class":1204},[1169,14122,4597],{"class":1186},[1169,14124,1269],{"class":1204},[1169,14126,4602],{"class":1272},[1169,14128,1276],{"class":1204},[1169,14130,4608],{"class":4607},[1169,14132,2373],{"class":1204},[1169,14134,14135],{"class":1171,"line":1254},[1169,14136,1194],{"emptyLinePlaceholder":1193},[1169,14138,14139,14141,14144],{"class":1171,"line":1299},[1169,14140,2595],{"class":2398},[1169,14142,14143],{"class":2598}," CacheAsidePattern",[1169,14145,2984],{"class":1204},[1169,14147,14148,14150,14153],{"class":1171,"line":1313},[1169,14149,2417],{"class":2416},[1169,14151,14152],{"class":2420},"Implement cache-aside pattern with write-through",[1169,14154,2424],{"class":2416},[1169,14156,14157],{"class":1171,"line":1335},[1169,14158,2936],{"class":1186},[1169,14160,14161,14163,14165,14167,14169,14171,14174,14176,14178,14180,14182],{"class":1171,"line":1349},[1169,14162,3725],{"class":2398},[1169,14164,4643],{"class":2728},[1169,14166,1276],{"class":1204},[1169,14168,3734],{"class":3733},[1169,14170,1286],{"class":1204},[1169,14172,14173],{"class":2407}," model_class",[1169,14175,1286],{"class":1204},[1169,14177,3225],{"class":2407},[1169,14179,2432],{"class":2344},[1169,14181,3749],{"class":1362},[1169,14183,2411],{"class":1204},[1169,14185,14186,14188,14190,14193,14195],{"class":1171,"line":1368},[1169,14187,4680],{"class":1200},[1169,14189,1269],{"class":1204},[1169,14191,14192],{"class":2440},"model_class",[1169,14194,1205],{"class":1204},[1169,14196,14197],{"class":1186}," model_class\n",[1169,14199,14200,14202,14204,14206,14208],{"class":1171,"line":1386},[1169,14201,4680],{"class":1200},[1169,14203,1269],{"class":1204},[1169,14205,5978],{"class":2440},[1169,14207,1205],{"class":1204},[1169,14209,8121],{"class":1186},[1169,14211,14212],{"class":1171,"line":1392},[1169,14213,2936],{"class":1186},[1169,14215,14216,14218,14220,14222,14224,14226,14229],{"class":1171,"line":1413},[1169,14217,3725],{"class":2398},[1169,14219,4757],{"class":2335},[1169,14221,1276],{"class":1204},[1169,14223,3734],{"class":3733},[1169,14225,1286],{"class":1204},[1169,14227,14228],{"class":2407}," pk",[1169,14230,2411],{"class":1204},[1169,14232,14233,14235,14238],{"class":1171,"line":1434},[1169,14234,3756],{"class":2416},[1169,14236,14237],{"class":2420},"Get object with cache-aside pattern",[1169,14239,2424],{"class":2416},[1169,14241,14242,14244,14246,14248,14250,14252,14254,14256,14258,14260,14263,14265,14268,14270,14272,14274,14277,14279],{"class":1171,"line":1440},[1169,14243,3766],{"class":1186},[1169,14245,2432],{"class":1204},[1169,14247,2816],{"class":2398},[1169,14249,2819],{"class":1218},[1169,14251,2823],{"class":2822},[1169,14253,3734],{"class":1200},[1169,14255,1269],{"class":1204},[1169,14257,14192],{"class":2440},[1169,14259,1269],{"class":1204},[1169,14261,14262],{"class":2440},"_meta",[1169,14264,1269],{"class":1204},[1169,14266,14267],{"class":2440},"label_lower",[1169,14269,2828],{"class":2822},[1169,14271,1225],{"class":1218},[1169,14273,2823],{"class":2822},[1169,14275,14276],{"class":1186},"pk",[1169,14278,2828],{"class":2822},[1169,14280,2840],{"class":1218},[1169,14282,14283],{"class":1171,"line":1461},[1169,14284,3786],{"class":1186},[1169,14286,14287],{"class":1171,"line":1478},[1169,14288,3791],{"class":1175},[1169,14290,14291,14294,14296,14298,14300,14302,14304,14306],{"class":1171,"line":1498},[1169,14292,14293],{"class":1186},"        obj ",[1169,14295,2432],{"class":1204},[1169,14297,2246],{"class":1186},[1169,14299,1269],{"class":1204},[1169,14301,2554],{"class":1272},[1169,14303,1276],{"class":1204},[1169,14305,2961],{"class":1272},[1169,14307,2373],{"class":1204},[1169,14309,14310,14312,14315,14317,14319,14321],{"class":1171,"line":1504},[1169,14311,3815],{"class":1182},[1169,14313,14314],{"class":1186}," obj ",[1169,14316,2975],{"class":2344},[1169,14318,2978],{"class":2344},[1169,14320,2981],{"class":1380},[1169,14322,2984],{"class":1204},[1169,14324,14325,14327,14329,14331,14333,14335,14338,14340,14342,14344,14346],{"class":1171,"line":1518},[1169,14326,4823],{"class":1186},[1169,14328,1269],{"class":1204},[1169,14330,4828],{"class":1272},[1169,14332,1276],{"class":1204},[1169,14334,3454],{"class":2398},[1169,14336,14337],{"class":1218},"\"Cache hit: ",[1169,14339,2823],{"class":2822},[1169,14341,2961],{"class":1272},[1169,14343,2828],{"class":2822},[1169,14345,2819],{"class":1218},[1169,14347,2373],{"class":1204},[1169,14349,14350,14352],{"class":1171,"line":1537},[1169,14351,3831],{"class":1182},[1169,14353,14354],{"class":1186}," obj\n",[1169,14356,14357],{"class":1171,"line":1573},[1169,14358,3786],{"class":1186},[1169,14360,14361],{"class":1171,"line":1586},[1169,14362,3843],{"class":1175},[1169,14364,14365,14367],{"class":1171,"line":1605},[1169,14366,3848],{"class":1182},[1169,14368,2984],{"class":1204},[1169,14370,14371,14374,14376,14378,14380,14382,14384,14386,14388,14390,14392,14394,14396,14398],{"class":1171,"line":1610},[1169,14372,14373],{"class":1186},"            obj ",[1169,14375,2432],{"class":1204},[1169,14377,3860],{"class":1200},[1169,14379,1269],{"class":1204},[1169,14381,14192],{"class":2440},[1169,14383,1269],{"class":1204},[1169,14385,2441],{"class":2440},[1169,14387,1269],{"class":1204},[1169,14389,2554],{"class":1272},[1169,14391,1276],{"class":1204},[1169,14393,14276],{"class":2484},[1169,14395,2432],{"class":1204},[1169,14397,14276],{"class":1272},[1169,14399,2373],{"class":1204},[1169,14401,14402],{"class":1171,"line":1629},[1169,14403,14404],{"class":1175},"            # Cache the object\n",[1169,14406,14407,14409,14411,14413,14415,14417,14419,14422,14424,14426,14428,14430],{"class":1171,"line":1648},[1169,14408,3891],{"class":1186},[1169,14410,1269],{"class":1204},[1169,14412,3049],{"class":1272},[1169,14414,1276],{"class":1204},[1169,14416,2961],{"class":1272},[1169,14418,1286],{"class":1204},[1169,14420,14421],{"class":1272}," obj",[1169,14423,1286],{"class":1204},[1169,14425,3860],{"class":1200},[1169,14427,1269],{"class":1204},[1169,14429,5978],{"class":2440},[1169,14431,2373],{"class":1204},[1169,14433,14434,14436,14438,14440,14442,14444,14447,14449,14451,14453,14455],{"class":1171,"line":1653},[1169,14435,4823],{"class":1186},[1169,14437,1269],{"class":1204},[1169,14439,4828],{"class":1272},[1169,14441,1276],{"class":1204},[1169,14443,3454],{"class":2398},[1169,14445,14446],{"class":1218},"\"Cached object: ",[1169,14448,2823],{"class":2822},[1169,14450,2961],{"class":1272},[1169,14452,2828],{"class":2822},[1169,14454,2819],{"class":1218},[1169,14456,2373],{"class":1204},[1169,14458,14459,14461],{"class":1171,"line":1667},[1169,14460,3831],{"class":1182},[1169,14462,14354],{"class":1186},[1169,14464,14465,14467,14469,14471,14473,14475,14477],{"class":1171,"line":1686},[1169,14466,3921],{"class":1182},[1169,14468,3860],{"class":1200},[1169,14470,1269],{"class":1204},[1169,14472,14192],{"class":2440},[1169,14474,1269],{"class":1204},[1169,14476,3933],{"class":2440},[1169,14478,2984],{"class":1204},[1169,14480,14481],{"class":1171,"line":1722},[1169,14482,14483],{"class":1175},"            # Cache negative result\n",[1169,14485,14486,14488,14490,14492,14494,14496,14498,14500,14502,14504,14506],{"class":1171,"line":1735},[1169,14487,3891],{"class":1186},[1169,14489,1269],{"class":1204},[1169,14491,3049],{"class":1272},[1169,14493,1276],{"class":1204},[1169,14495,2961],{"class":1272},[1169,14497,1286],{"class":1204},[1169,14499,2981],{"class":1380},[1169,14501,1286],{"class":1204},[1169,14503,3961],{"class":1362},[1169,14505,2351],{"class":1204},[1169,14507,14508],{"class":1175},"  # Short timeout for negative results\n",[1169,14510,14511,14513],{"class":1171,"line":1754},[1169,14512,3831],{"class":1182},[1169,14514,5001],{"class":1380},[1169,14516,14517],{"class":1171,"line":1759},[1169,14518,2936],{"class":1186},[1169,14520,14521,14523,14526,14528,14530,14532,14534],{"class":1171,"line":1779},[1169,14522,3725],{"class":2398},[1169,14524,14525],{"class":2335}," save",[1169,14527,1276],{"class":1204},[1169,14529,3734],{"class":3733},[1169,14531,1286],{"class":1204},[1169,14533,14421],{"class":2407},[1169,14535,2411],{"class":1204},[1169,14537,14538,14540,14543],{"class":1171,"line":1798},[1169,14539,3756],{"class":2416},[1169,14541,14542],{"class":2420},"Save object with write-through caching",[1169,14544,2424],{"class":2416},[1169,14546,14547,14549,14551,14553,14555,14557,14559,14561,14563,14565,14567,14569,14571,14573,14575,14577,14580,14582,14584,14586],{"class":1171,"line":1804},[1169,14548,3766],{"class":1186},[1169,14550,2432],{"class":1204},[1169,14552,2816],{"class":2398},[1169,14554,2819],{"class":1218},[1169,14556,2823],{"class":2822},[1169,14558,3734],{"class":1200},[1169,14560,1269],{"class":1204},[1169,14562,14192],{"class":2440},[1169,14564,1269],{"class":1204},[1169,14566,14262],{"class":2440},[1169,14568,1269],{"class":1204},[1169,14570,14267],{"class":2440},[1169,14572,2828],{"class":2822},[1169,14574,1225],{"class":1218},[1169,14576,2823],{"class":2822},[1169,14578,14579],{"class":1186},"obj",[1169,14581,1269],{"class":1204},[1169,14583,14276],{"class":2440},[1169,14585,2828],{"class":2822},[1169,14587,2840],{"class":1218},[1169,14589,14590],{"class":1171,"line":1810},[1169,14591,3786],{"class":1186},[1169,14593,14594,14596,14599,14601,14604],{"class":1171,"line":1815},[1169,14595,11042],{"class":1182},[1169,14597,14598],{"class":1186}," transaction",[1169,14600,1269],{"class":1204},[1169,14602,14603],{"class":1272},"atomic",[1169,14605,4170],{"class":1204},[1169,14607,14608],{"class":1171,"line":1821},[1169,14609,14610],{"class":1175},"            # Save to database\n",[1169,14612,14613,14616,14618,14621],{"class":1171,"line":1837},[1169,14614,14615],{"class":1186},"            obj",[1169,14617,1269],{"class":1204},[1169,14619,14620],{"class":1272},"save",[1169,14622,2464],{"class":1204},[1169,14624,14625],{"class":1171,"line":1851},[1169,14626,6316],{"class":1186},[1169,14628,14629],{"class":1171,"line":2939},[1169,14630,14631],{"class":1175},"            # Update cache\n",[1169,14633,14634,14636,14638,14640,14642,14644,14646,14648,14650,14652,14654,14656],{"class":1171,"line":2945},[1169,14635,3891],{"class":1186},[1169,14637,1269],{"class":1204},[1169,14639,3049],{"class":1272},[1169,14641,1276],{"class":1204},[1169,14643,2961],{"class":1272},[1169,14645,1286],{"class":1204},[1169,14647,14421],{"class":1272},[1169,14649,1286],{"class":1204},[1169,14651,3860],{"class":1200},[1169,14653,1269],{"class":1204},[1169,14655,5978],{"class":2440},[1169,14657,2373],{"class":1204},[1169,14659,14660,14662,14664,14666,14668,14670,14673,14675,14677,14679,14681],{"class":1171,"line":2966},[1169,14661,4823],{"class":1186},[1169,14663,1269],{"class":1204},[1169,14665,4828],{"class":1272},[1169,14667,1276],{"class":1204},[1169,14669,3454],{"class":2398},[1169,14671,14672],{"class":1218},"\"Write-through cache update: ",[1169,14674,2823],{"class":2822},[1169,14676,2961],{"class":1272},[1169,14678,2828],{"class":2822},[1169,14680,2819],{"class":1218},[1169,14682,2373],{"class":1204},[1169,14684,14685],{"class":1171,"line":2987},[1169,14686,3786],{"class":1186},[1169,14688,14689,14691],{"class":1171,"line":3002},[1169,14690,2990],{"class":1182},[1169,14692,14354],{"class":1186},[1169,14694,14695],{"class":1171,"line":3007},[1169,14696,2936],{"class":1186},[1169,14698,14699,14701,14703,14705,14707,14709,14711],{"class":1171,"line":3013},[1169,14700,3725],{"class":2398},[1169,14702,5164],{"class":2335},[1169,14704,1276],{"class":1204},[1169,14706,3734],{"class":3733},[1169,14708,1286],{"class":1204},[1169,14710,14421],{"class":2407},[1169,14712,2411],{"class":1204},[1169,14714,14715,14717,14720],{"class":1171,"line":3030},[1169,14716,3756],{"class":2416},[1169,14718,14719],{"class":2420},"Delete object and invalidate cache",[1169,14721,2424],{"class":2416},[1169,14723,14724,14726,14728,14730,14732,14734,14736,14738,14740,14742,14744,14746,14748,14750,14752,14754,14756,14758,14760,14762],{"class":1171,"line":3035},[1169,14725,3766],{"class":1186},[1169,14727,2432],{"class":1204},[1169,14729,2816],{"class":2398},[1169,14731,2819],{"class":1218},[1169,14733,2823],{"class":2822},[1169,14735,3734],{"class":1200},[1169,14737,1269],{"class":1204},[1169,14739,14192],{"class":2440},[1169,14741,1269],{"class":1204},[1169,14743,14262],{"class":2440},[1169,14745,1269],{"class":1204},[1169,14747,14267],{"class":2440},[1169,14749,2828],{"class":2822},[1169,14751,1225],{"class":1218},[1169,14753,2823],{"class":2822},[1169,14755,14579],{"class":1186},[1169,14757,1269],{"class":1204},[1169,14759,14276],{"class":2440},[1169,14761,2828],{"class":2822},[1169,14763,2840],{"class":1218},[1169,14765,14766],{"class":1171,"line":3041},[1169,14767,3786],{"class":1186},[1169,14769,14770,14772,14774,14776,14778],{"class":1171,"line":3068},[1169,14771,11042],{"class":1182},[1169,14773,14598],{"class":1186},[1169,14775,1269],{"class":1204},[1169,14777,14603],{"class":1272},[1169,14779,4170],{"class":1204},[1169,14781,14782],{"class":1171,"line":3073},[1169,14783,14784],{"class":1175},"            # Delete from database\n",[1169,14786,14787,14789,14791,14793],{"class":1171,"line":4397},[1169,14788,14615],{"class":1186},[1169,14790,1269],{"class":1204},[1169,14792,4520],{"class":1272},[1169,14794,2464],{"class":1204},[1169,14796,14797],{"class":1171,"line":4403},[1169,14798,6316],{"class":1186},[1169,14800,14801],{"class":1171,"line":4408},[1169,14802,14803],{"class":1175},"            # Remove from cache\n",[1169,14805,14806,14808,14810,14812,14814,14816],{"class":1171,"line":4414},[1169,14807,3891],{"class":1186},[1169,14809,1269],{"class":1204},[1169,14811,4520],{"class":1272},[1169,14813,1276],{"class":1204},[1169,14815,2961],{"class":1272},[1169,14817,2373],{"class":1204},[1169,14819,14820,14822,14824,14826,14828,14830,14833,14835,14837,14839,14841],{"class":1171,"line":4430},[1169,14821,4823],{"class":1186},[1169,14823,1269],{"class":1204},[1169,14825,4828],{"class":1272},[1169,14827,1276],{"class":1204},[1169,14829,3454],{"class":2398},[1169,14831,14832],{"class":1218},"\"Cache invalidated: ",[1169,14834,2823],{"class":2822},[1169,14836,2961],{"class":1272},[1169,14838,2828],{"class":2822},[1169,14840,2819],{"class":1218},[1169,14842,2373],{"class":1204},[1169,14844,14845],{"class":1171,"line":4450},[1169,14846,1194],{"emptyLinePlaceholder":1193},[1169,14848,14849],{"class":1171,"line":4456},[1169,14850,11301],{"class":1175},[1169,14852,14853,14855,14857,14859,14861,14863],{"class":1171,"line":4505},[1169,14854,1879],{"class":1182},[1169,14856,5690],{"class":1186},[1169,14858,1269],{"class":1204},[1169,14860,5678],{"class":1186},[1169,14862,1183],{"class":1182},[1169,14864,5683],{"class":1186},[1169,14866,14867],{"class":1171,"line":4513},[1169,14868,1194],{"emptyLinePlaceholder":1193},[1169,14870,14871,14874,14876,14878,14880,14883,14885,14887,14889,14891],{"class":1171,"line":5401},[1169,14872,14873],{"class":1186},"user_cache ",[1169,14875,2432],{"class":1204},[1169,14877,14143],{"class":1272},[1169,14879,1276],{"class":1204},[1169,14881,14882],{"class":1272},"User",[1169,14884,1286],{"class":1204},[1169,14886,3225],{"class":2484},[1169,14888,2432],{"class":1204},[1169,14890,5892],{"class":1362},[1169,14892,2373],{"class":1204},[1169,14894,14895],{"class":1171,"line":5420},[1169,14896,1194],{"emptyLinePlaceholder":1193},[1169,14898,14899,14901,14904,14906,14908],{"class":1171,"line":5440},[1169,14900,2399],{"class":2398},[1169,14902,14903],{"class":2335}," get_user_cached",[1169,14905,1276],{"class":1204},[1169,14907,3335],{"class":2407},[1169,14909,2411],{"class":1204},[1169,14911,14912,14914,14917,14919,14921,14923,14925],{"class":1171,"line":5460},[1169,14913,2497],{"class":1182},[1169,14915,14916],{"class":1186}," user_cache",[1169,14918,1269],{"class":1204},[1169,14920,2554],{"class":1272},[1169,14922,1276],{"class":1204},[1169,14924,3335],{"class":1272},[1169,14926,2373],{"class":1204},[1169,14928,14929],{"class":1171,"line":5473},[1169,14930,1194],{"emptyLinePlaceholder":1193},[1169,14932,14933,14935,14938,14940,14942],{"class":1171,"line":5497},[1169,14934,2399],{"class":2398},[1169,14936,14937],{"class":2335}," update_user_cached",[1169,14939,1276],{"class":1204},[1169,14941,3357],{"class":2407},[1169,14943,2411],{"class":1204},[1169,14945,14946,14948,14950,14952,14954,14956,14958],{"class":1171,"line":5521},[1169,14947,2497],{"class":1182},[1169,14949,14916],{"class":1186},[1169,14951,1269],{"class":1204},[1169,14953,14620],{"class":1272},[1169,14955,1276],{"class":1204},[1169,14957,3357],{"class":1272},[1169,14959,2373],{"class":1204},[1077,14961,14963],{"id":14962},"distributed-cache-invalidation","Distributed Cache Invalidation",[1159,14965,14967],{"className":1161,"code":14966,"language":1163,"meta":1164,"style":1164},"# shared/cache_invalidation.py\nfrom django.core.cache import cache\nfrom django.db.models.signals import post_save, post_delete\nfrom django.dispatch import receiver\nimport json\nimport logging\n\nlogger = logging.getLogger(__name__)\n\nclass CacheInvalidationManager:\n    \"\"\"Manage cache invalidation across services\"\"\"\n    \n    def __init__(self):\n        self.invalidation_patterns = {}\n    \n    def register_pattern(self, model_class, patterns):\n        \"\"\"Register cache invalidation patterns for a model\"\"\"\n        model_label = model_class._meta.label_lower\n        self.invalidation_patterns[model_label] = patterns\n    \n    def invalidate_for_instance(self, instance, action='update'):\n        \"\"\"Invalidate cache for a model instance\"\"\"\n        model_label = instance._meta.label_lower\n        patterns = self.invalidation_patterns.get(model_label, [])\n        \n        for pattern in patterns:\n            if callable(pattern):\n                keys_to_invalidate = pattern(instance, action)\n            else:\n                keys_to_invalidate = [pattern.format(instance=instance)]\n            \n            for key in keys_to_invalidate:\n                if '*' in key:\n                    # Pattern-based invalidation\n                    self.invalidate_pattern(key)\n                else:\n                    # Direct key invalidation\n                    cache.delete(key)\n                    logger.debug(f\"Invalidated cache key: {key}\")\n    \n    def invalidate_pattern(self, pattern):\n        \"\"\"Invalidate cache keys matching a pattern\"\"\"\n        try:\n            # Redis-specific pattern matching\n            from django_redis import get_redis_connection\n            redis_conn = get_redis_connection(\"default\")\n            \n            keys = redis_conn.keys(pattern)\n            if keys:\n                redis_conn.delete(*keys)\n                logger.debug(f\"Invalidated {len(keys)} keys matching pattern: {pattern}\")\n        \n        except Exception as e:\n            logger.error(f\"Failed to invalidate pattern {pattern}: {e}\")\n\n# Global invalidation manager\ncache_invalidation_manager = CacheInvalidationManager()\n\n# Register invalidation patterns\ndef user_invalidation_patterns(instance, action):\n    \"\"\"Generate cache keys to invalidate for user changes\"\"\"\n    patterns = [\n        f\"user:{instance.id}\",\n        f\"user_profile:{instance.id}\",\n        \"user_list:*\",\n        \"user_stats:*\",\n    ]\n    \n    # Add service-specific patterns\n    if hasattr(instance, 'email'):\n        patterns.append(f\"user_by_email:{instance.email}\")\n    \n    return patterns\n\n# Register patterns\nfrom user_service.models import User\ncache_invalidation_manager.register_pattern(User, [user_invalidation_patterns])\n\n# Signal handlers\n@receiver([post_save, post_delete], sender=User)\ndef invalidate_user_cache(sender, instance, **kwargs):\n    \"\"\"Invalidate user-related caches\"\"\"\n    action = 'delete' if kwargs.get('created') is False else 'update'\n    cache_invalidation_manager.invalidate_for_instance(instance, action)\n",[1166,14968,14969,14974,14992,15018,15032,15038,15044,15048,15066,15070,15079,15088,15092,15104,15117,15121,15142,15151,15169,15189,15193,15223,15232,15248,15274,15278,15290,15303,15323,15330,15356,15360,15373,15389,15394,15410,15417,15422,15437,15463,15467,15484,15493,15499,15504,15514,15532,15536,15554,15562,15578,15617,15621,15633,15667,15671,15676,15687,15691,15696,15713,15722,15731,15751,15771,15781,15792,15796,15800,15805,15825,15855,15859,15865,15869,15874,15888,15911,15915,15920,15944,15966,15975,16021],{"__ignoreMap":1164},[1169,14970,14971],{"class":1171,"line":1172},[1169,14972,14973],{"class":1175},"# shared/cache_invalidation.py\n",[1169,14975,14976,14978,14980,14982,14984,14986,14988,14990],{"class":1171,"line":1179},[1169,14977,1879],{"class":1182},[1169,14979,2182],{"class":1186},[1169,14981,1269],{"class":1204},[1169,14983,2237],{"class":1186},[1169,14985,1269],{"class":1204},[1169,14987,2197],{"class":1186},[1169,14989,1183],{"class":1182},[1169,14991,3128],{"class":1186},[1169,14993,14994,14996,14998,15000,15002,15004,15006,15008,15010,15012,15014,15016],{"class":1171,"line":1190},[1169,14995,1879],{"class":1182},[1169,14997,2182],{"class":1186},[1169,14999,1269],{"class":1204},[1169,15001,3649],{"class":1186},[1169,15003,1269],{"class":1204},[1169,15005,3654],{"class":1186},[1169,15007,1269],{"class":1204},[1169,15009,3659],{"class":1186},[1169,15011,1183],{"class":1182},[1169,15013,3664],{"class":1186},[1169,15015,1286],{"class":1204},[1169,15017,3669],{"class":1186},[1169,15019,15020,15022,15024,15026,15028,15030],{"class":1171,"line":1197},[1169,15021,1879],{"class":1182},[1169,15023,2182],{"class":1186},[1169,15025,1269],{"class":1204},[1169,15027,3680],{"class":1186},[1169,15029,1183],{"class":1182},[1169,15031,3685],{"class":1186},[1169,15033,15034,15036],{"class":1171,"line":1211},[1169,15035,1183],{"class":1182},[1169,15037,2318],{"class":1186},[1169,15039,15040,15042],{"class":1171,"line":1230},[1169,15041,1183],{"class":1182},[1169,15043,4569],{"class":1186},[1169,15045,15046],{"class":1171,"line":1254},[1169,15047,1194],{"emptyLinePlaceholder":1193},[1169,15049,15050,15052,15054,15056,15058,15060,15062,15064],{"class":1171,"line":1299},[1169,15051,4592],{"class":1186},[1169,15053,2432],{"class":1204},[1169,15055,4597],{"class":1186},[1169,15057,1269],{"class":1204},[1169,15059,4602],{"class":1272},[1169,15061,1276],{"class":1204},[1169,15063,4608],{"class":4607},[1169,15065,2373],{"class":1204},[1169,15067,15068],{"class":1171,"line":1313},[1169,15069,1194],{"emptyLinePlaceholder":1193},[1169,15071,15072,15074,15077],{"class":1171,"line":1335},[1169,15073,2595],{"class":2398},[1169,15075,15076],{"class":2598}," CacheInvalidationManager",[1169,15078,2984],{"class":1204},[1169,15080,15081,15083,15086],{"class":1171,"line":1349},[1169,15082,2417],{"class":2416},[1169,15084,15085],{"class":2420},"Manage cache invalidation across services",[1169,15087,2424],{"class":2416},[1169,15089,15090],{"class":1171,"line":1368},[1169,15091,2936],{"class":1186},[1169,15093,15094,15096,15098,15100,15102],{"class":1171,"line":1386},[1169,15095,3725],{"class":2398},[1169,15097,4643],{"class":2728},[1169,15099,1276],{"class":1204},[1169,15101,3734],{"class":3733},[1169,15103,2411],{"class":1204},[1169,15105,15106,15108,15110,15113,15115],{"class":1171,"line":1392},[1169,15107,4680],{"class":1200},[1169,15109,1269],{"class":1204},[1169,15111,15112],{"class":2440},"invalidation_patterns",[1169,15114,1205],{"class":1204},[1169,15116,4029],{"class":1204},[1169,15118,15119],{"class":1171,"line":1413},[1169,15120,2936],{"class":1186},[1169,15122,15123,15125,15128,15130,15132,15134,15136,15138,15140],{"class":1171,"line":1434},[1169,15124,3725],{"class":2398},[1169,15126,15127],{"class":2335}," register_pattern",[1169,15129,1276],{"class":1204},[1169,15131,3734],{"class":3733},[1169,15133,1286],{"class":1204},[1169,15135,14173],{"class":2407},[1169,15137,1286],{"class":1204},[1169,15139,9371],{"class":2407},[1169,15141,2411],{"class":1204},[1169,15143,15144,15146,15149],{"class":1171,"line":1440},[1169,15145,3756],{"class":2416},[1169,15147,15148],{"class":2420},"Register cache invalidation patterns for a model",[1169,15150,2424],{"class":2416},[1169,15152,15153,15156,15158,15160,15162,15164,15166],{"class":1171,"line":1461},[1169,15154,15155],{"class":1186},"        model_label ",[1169,15157,2432],{"class":1204},[1169,15159,14173],{"class":1186},[1169,15161,1269],{"class":1204},[1169,15163,14262],{"class":2440},[1169,15165,1269],{"class":1204},[1169,15167,15168],{"class":2440},"label_lower\n",[1169,15170,15171,15173,15175,15177,15179,15182,15184,15186],{"class":1171,"line":1478},[1169,15172,4680],{"class":1200},[1169,15174,1269],{"class":1204},[1169,15176,15112],{"class":2440},[1169,15178,1908],{"class":1204},[1169,15180,15181],{"class":2440},"model_label",[1169,15183,1918],{"class":1204},[1169,15185,1205],{"class":1204},[1169,15187,15188],{"class":1186}," patterns\n",[1169,15190,15191],{"class":1171,"line":1498},[1169,15192,2936],{"class":1186},[1169,15194,15195,15197,15200,15202,15204,15206,15208,15210,15213,15215,15217,15219,15221],{"class":1171,"line":1504},[1169,15196,3725],{"class":2398},[1169,15198,15199],{"class":2335}," invalidate_for_instance",[1169,15201,1276],{"class":1204},[1169,15203,3734],{"class":3733},[1169,15205,1286],{"class":1204},[1169,15207,4319],{"class":2407},[1169,15209,1286],{"class":1204},[1169,15211,15212],{"class":2407}," action",[1169,15214,2432],{"class":2344},[1169,15216,1222],{"class":1214},[1169,15218,8183],{"class":1218},[1169,15220,1222],{"class":1214},[1169,15222,2411],{"class":1204},[1169,15224,15225,15227,15230],{"class":1171,"line":1518},[1169,15226,3756],{"class":2416},[1169,15228,15229],{"class":2420},"Invalidate cache for a model instance",[1169,15231,2424],{"class":2416},[1169,15233,15234,15236,15238,15240,15242,15244,15246],{"class":1171,"line":1537},[1169,15235,15155],{"class":1186},[1169,15237,2432],{"class":1204},[1169,15239,4319],{"class":1186},[1169,15241,1269],{"class":1204},[1169,15243,14262],{"class":2440},[1169,15245,1269],{"class":1204},[1169,15247,15168],{"class":2440},[1169,15249,15250,15253,15255,15257,15259,15261,15263,15265,15267,15269,15271],{"class":1171,"line":1573},[1169,15251,15252],{"class":1186},"        patterns ",[1169,15254,2432],{"class":1204},[1169,15256,3860],{"class":1200},[1169,15258,1269],{"class":1204},[1169,15260,15112],{"class":2440},[1169,15262,1269],{"class":1204},[1169,15264,2554],{"class":1272},[1169,15266,1276],{"class":1204},[1169,15268,15181],{"class":1272},[1169,15270,1286],{"class":1204},[1169,15272,15273],{"class":1204}," [])\n",[1169,15275,15276],{"class":1171,"line":1586},[1169,15277,3786],{"class":1186},[1169,15279,15280,15282,15284,15286,15288],{"class":1171,"line":1605},[1169,15281,4151],{"class":1182},[1169,15283,9389],{"class":1186},[1169,15285,3318],{"class":1182},[1169,15287,9371],{"class":1186},[1169,15289,2984],{"class":1204},[1169,15291,15292,15294,15297,15299,15301],{"class":1171,"line":1610},[1169,15293,7320],{"class":1182},[1169,15295,15296],{"class":2728}," callable",[1169,15298,1276],{"class":1204},[1169,15300,9425],{"class":1272},[1169,15302,2411],{"class":1204},[1169,15304,15305,15308,15310,15313,15315,15317,15319,15321],{"class":1171,"line":1629},[1169,15306,15307],{"class":1186},"                keys_to_invalidate ",[1169,15309,2432],{"class":1204},[1169,15311,15312],{"class":1272}," pattern",[1169,15314,1276],{"class":1204},[1169,15316,4357],{"class":1272},[1169,15318,1286],{"class":1204},[1169,15320,15212],{"class":1272},[1169,15322,2373],{"class":1204},[1169,15324,15325,15328],{"class":1171,"line":1648},[1169,15326,15327],{"class":1182},"            else",[1169,15329,2984],{"class":1204},[1169,15331,15332,15334,15336,15338,15340,15342,15345,15347,15349,15351,15353],{"class":1171,"line":1653},[1169,15333,15307],{"class":1186},[1169,15335,2432],{"class":1204},[1169,15337,8854],{"class":1204},[1169,15339,9425],{"class":1186},[1169,15341,1269],{"class":1204},[1169,15343,15344],{"class":1272},"format",[1169,15346,1276],{"class":1204},[1169,15348,4357],{"class":2484},[1169,15350,2432],{"class":1204},[1169,15352,4357],{"class":1272},[1169,15354,15355],{"class":1204},")]\n",[1169,15357,15358],{"class":1171,"line":1667},[1169,15359,6316],{"class":1186},[1169,15361,15362,15364,15366,15368,15371],{"class":1171,"line":1686},[1169,15363,6321],{"class":1182},[1169,15365,4420],{"class":1186},[1169,15367,3318],{"class":1182},[1169,15369,15370],{"class":1186}," keys_to_invalidate",[1169,15372,2984],{"class":1204},[1169,15374,15375,15377,15379,15381,15383,15385,15387],{"class":1171,"line":1722},[1169,15376,13357],{"class":1182},[1169,15378,1243],{"class":1214},[1169,15380,4437],{"class":1218},[1169,15382,1222],{"class":1214},[1169,15384,4442],{"class":2344},[1169,15386,4445],{"class":1186},[1169,15388,2984],{"class":1204},[1169,15390,15391],{"class":1171,"line":1735},[1169,15392,15393],{"class":1175},"                    # Pattern-based invalidation\n",[1169,15395,15396,15399,15401,15404,15406,15408],{"class":1171,"line":1754},[1169,15397,15398],{"class":1200},"                    self",[1169,15400,1269],{"class":1204},[1169,15402,15403],{"class":1272},"invalidate_pattern",[1169,15405,1276],{"class":1204},[1169,15407,4478],{"class":1272},[1169,15409,2373],{"class":1204},[1169,15411,15412,15415],{"class":1171,"line":1759},[1169,15413,15414],{"class":1182},"                else",[1169,15416,2984],{"class":1204},[1169,15418,15419],{"class":1171,"line":1779},[1169,15420,15421],{"class":1175},"                    # Direct key invalidation\n",[1169,15423,15424,15427,15429,15431,15433,15435],{"class":1171,"line":1798},[1169,15425,15426],{"class":1186},"                    cache",[1169,15428,1269],{"class":1204},[1169,15430,4520],{"class":1272},[1169,15432,1276],{"class":1204},[1169,15434,4478],{"class":1272},[1169,15436,2373],{"class":1204},[1169,15438,15439,15442,15444,15446,15448,15450,15453,15455,15457,15459,15461],{"class":1171,"line":1804},[1169,15440,15441],{"class":1186},"                    logger",[1169,15443,1269],{"class":1204},[1169,15445,4828],{"class":1272},[1169,15447,1276],{"class":1204},[1169,15449,3454],{"class":2398},[1169,15451,15452],{"class":1218},"\"Invalidated cache key: ",[1169,15454,2823],{"class":2822},[1169,15456,4478],{"class":1272},[1169,15458,2828],{"class":2822},[1169,15460,2819],{"class":1218},[1169,15462,2373],{"class":1204},[1169,15464,15465],{"class":1171,"line":1810},[1169,15466,2936],{"class":1186},[1169,15468,15469,15471,15474,15476,15478,15480,15482],{"class":1171,"line":1815},[1169,15470,3725],{"class":2398},[1169,15472,15473],{"class":2335}," invalidate_pattern",[1169,15475,1276],{"class":1204},[1169,15477,3734],{"class":3733},[1169,15479,1286],{"class":1204},[1169,15481,15312],{"class":2407},[1169,15483,2411],{"class":1204},[1169,15485,15486,15488,15491],{"class":1171,"line":1821},[1169,15487,3756],{"class":2416},[1169,15489,15490],{"class":2420},"Invalidate cache keys matching a pattern",[1169,15492,2424],{"class":2416},[1169,15494,15495,15497],{"class":1171,"line":1837},[1169,15496,3848],{"class":1182},[1169,15498,2984],{"class":1204},[1169,15500,15501],{"class":1171,"line":1851},[1169,15502,15503],{"class":1175},"            # Redis-specific pattern matching\n",[1169,15505,15506,15508,15510,15512],{"class":1171,"line":2939},[1169,15507,13241],{"class":1182},[1169,15509,13244],{"class":1186},[1169,15511,1183],{"class":1182},[1169,15513,13249],{"class":1186},[1169,15515,15516,15518,15520,15522,15524,15526,15528,15530],{"class":1171,"line":2945},[1169,15517,13258],{"class":1186},[1169,15519,2432],{"class":1204},[1169,15521,13263],{"class":1272},[1169,15523,1276],{"class":1204},[1169,15525,2819],{"class":1214},[1169,15527,1219],{"class":1218},[1169,15529,2819],{"class":1214},[1169,15531,2373],{"class":1204},[1169,15533,15534],{"class":1171,"line":2966},[1169,15535,6316],{"class":1186},[1169,15537,15538,15540,15542,15544,15546,15548,15550,15552],{"class":1171,"line":2987},[1169,15539,13287],{"class":1186},[1169,15541,2432],{"class":1204},[1169,15543,13292],{"class":1186},[1169,15545,1269],{"class":1204},[1169,15547,4473],{"class":1272},[1169,15549,1276],{"class":1204},[1169,15551,9425],{"class":1272},[1169,15553,2373],{"class":1204},[1169,15555,15556,15558,15560],{"class":1171,"line":3002},[1169,15557,7320],{"class":1182},[1169,15559,13330],{"class":1186},[1169,15561,2984],{"class":1204},[1169,15563,15564,15566,15568,15570,15572,15574,15576],{"class":1171,"line":3007},[1169,15565,13427],{"class":1186},[1169,15567,1269],{"class":1204},[1169,15569,4520],{"class":1272},[1169,15571,1276],{"class":1204},[1169,15573,4437],{"class":2344},[1169,15575,4473],{"class":1272},[1169,15577,2373],{"class":1204},[1169,15579,15580,15582,15584,15586,15588,15590,15592,15594,15596,15598,15600,15602,15604,15607,15609,15611,15613,15615],{"class":1171,"line":3013},[1169,15581,7500],{"class":1186},[1169,15583,1269],{"class":1204},[1169,15585,4828],{"class":1272},[1169,15587,1276],{"class":1204},[1169,15589,3454],{"class":2398},[1169,15591,9470],{"class":1218},[1169,15593,2823],{"class":2822},[1169,15595,9475],{"class":2728},[1169,15597,1276],{"class":1204},[1169,15599,4473],{"class":1272},[1169,15601,2351],{"class":1204},[1169,15603,2828],{"class":2822},[1169,15605,15606],{"class":1218}," keys matching pattern: ",[1169,15608,2823],{"class":2822},[1169,15610,9425],{"class":1272},[1169,15612,2828],{"class":2822},[1169,15614,2819],{"class":1218},[1169,15616,2373],{"class":1204},[1169,15618,15619],{"class":1171,"line":3030},[1169,15620,3786],{"class":1186},[1169,15622,15623,15625,15627,15629,15631],{"class":1171,"line":3035},[1169,15624,3921],{"class":1182},[1169,15626,13483],{"class":3296},[1169,15628,9088],{"class":1182},[1169,15630,9091],{"class":1186},[1169,15632,2984],{"class":1204},[1169,15634,15635,15637,15639,15641,15643,15645,15648,15650,15652,15654,15657,15659,15661,15663,15665],{"class":1171,"line":3041},[1169,15636,4823],{"class":1186},[1169,15638,1269],{"class":1204},[1169,15640,9102],{"class":1272},[1169,15642,1276],{"class":1204},[1169,15644,3454],{"class":2398},[1169,15646,15647],{"class":1218},"\"Failed to invalidate pattern ",[1169,15649,2823],{"class":2822},[1169,15651,9425],{"class":1272},[1169,15653,2828],{"class":2822},[1169,15655,15656],{"class":1218},": ",[1169,15658,2823],{"class":2822},[1169,15660,9130],{"class":1272},[1169,15662,2828],{"class":2822},[1169,15664,2819],{"class":1218},[1169,15666,2373],{"class":1204},[1169,15668,15669],{"class":1171,"line":3068},[1169,15670,1194],{"emptyLinePlaceholder":1193},[1169,15672,15673],{"class":1171,"line":3073},[1169,15674,15675],{"class":1175},"# Global invalidation manager\n",[1169,15677,15678,15681,15683,15685],{"class":1171,"line":4397},[1169,15679,15680],{"class":1186},"cache_invalidation_manager ",[1169,15682,2432],{"class":1204},[1169,15684,15076],{"class":1272},[1169,15686,2464],{"class":1204},[1169,15688,15689],{"class":1171,"line":4403},[1169,15690,1194],{"emptyLinePlaceholder":1193},[1169,15692,15693],{"class":1171,"line":4408},[1169,15694,15695],{"class":1175},"# Register invalidation patterns\n",[1169,15697,15698,15700,15703,15705,15707,15709,15711],{"class":1171,"line":4414},[1169,15699,2399],{"class":2398},[1169,15701,15702],{"class":2335}," user_invalidation_patterns",[1169,15704,1276],{"class":1204},[1169,15706,4357],{"class":2407},[1169,15708,1286],{"class":1204},[1169,15710,15212],{"class":2407},[1169,15712,2411],{"class":1204},[1169,15714,15715,15717,15720],{"class":1171,"line":4430},[1169,15716,2417],{"class":2416},[1169,15718,15719],{"class":2420},"Generate cache keys to invalidate for user changes",[1169,15721,2424],{"class":2416},[1169,15723,15724,15727,15729],{"class":1171,"line":4450},[1169,15725,15726],{"class":1186},"    patterns ",[1169,15728,2432],{"class":1204},[1169,15730,2069],{"class":1204},[1169,15732,15733,15735,15737,15739,15741,15743,15745,15747,15749],{"class":1171,"line":4456},[1169,15734,4350],{"class":2398},[1169,15736,3773],{"class":1218},[1169,15738,2823],{"class":2822},[1169,15740,4357],{"class":1186},[1169,15742,1269],{"class":1204},[1169,15744,3366],{"class":2440},[1169,15746,2828],{"class":2822},[1169,15748,2819],{"class":1218},[1169,15750,1251],{"class":1204},[1169,15752,15753,15755,15757,15759,15761,15763,15765,15767,15769],{"class":1171,"line":4505},[1169,15754,4350],{"class":2398},[1169,15756,5276],{"class":1218},[1169,15758,2823],{"class":2822},[1169,15760,4357],{"class":1186},[1169,15762,1269],{"class":1204},[1169,15764,3366],{"class":2440},[1169,15766,2828],{"class":2822},[1169,15768,2819],{"class":1218},[1169,15770,1251],{"class":1204},[1169,15772,15773,15775,15777,15779],{"class":1171,"line":4513},[1169,15774,4372],{"class":1214},[1169,15776,4375],{"class":1218},[1169,15778,2819],{"class":1214},[1169,15780,1251],{"class":1204},[1169,15782,15783,15785,15788,15790],{"class":1171,"line":5401},[1169,15784,4372],{"class":1214},[1169,15786,15787],{"class":1218},"user_stats:*",[1169,15789,2819],{"class":1214},[1169,15791,1251],{"class":1204},[1169,15793,15794],{"class":1171,"line":5420},[1169,15795,4400],{"class":1204},[1169,15797,15798],{"class":1171,"line":5440},[1169,15799,2936],{"class":1186},[1169,15801,15802],{"class":1171,"line":5460},[1169,15803,15804],{"class":1175},"    # Add service-specific patterns\n",[1169,15806,15807,15809,15811,15813,15815,15817,15819,15821,15823],{"class":1171,"line":5473},[1169,15808,2969],{"class":1182},[1169,15810,7589],{"class":2728},[1169,15812,1276],{"class":1204},[1169,15814,4357],{"class":1272},[1169,15816,1286],{"class":1204},[1169,15818,1243],{"class":1214},[1169,15820,5445],{"class":1218},[1169,15822,1222],{"class":1214},[1169,15824,2411],{"class":1204},[1169,15826,15827,15830,15832,15834,15836,15838,15841,15843,15845,15847,15849,15851,15853],{"class":1171,"line":5497},[1169,15828,15829],{"class":1186},"        patterns",[1169,15831,1269],{"class":1204},[1169,15833,7348],{"class":1272},[1169,15835,1276],{"class":1204},[1169,15837,3454],{"class":2398},[1169,15839,15840],{"class":1218},"\"user_by_email:",[1169,15842,2823],{"class":2822},[1169,15844,4357],{"class":1272},[1169,15846,1269],{"class":1204},[1169,15848,5445],{"class":2440},[1169,15850,2828],{"class":2822},[1169,15852,2819],{"class":1218},[1169,15854,2373],{"class":1204},[1169,15856,15857],{"class":1171,"line":5521},[1169,15858,2936],{"class":1186},[1169,15860,15861,15863],{"class":1171,"line":5527},[1169,15862,2497],{"class":1182},[1169,15864,15188],{"class":1186},[1169,15866,15867],{"class":1171,"line":5533},[1169,15868,1194],{"emptyLinePlaceholder":1193},[1169,15870,15871],{"class":1171,"line":5538},[1169,15872,15873],{"class":1175},"# Register patterns\n",[1169,15875,15876,15878,15880,15882,15884,15886],{"class":1171,"line":5544},[1169,15877,1879],{"class":1182},[1169,15879,5690],{"class":1186},[1169,15881,1269],{"class":1204},[1169,15883,5678],{"class":1186},[1169,15885,1183],{"class":1182},[1169,15887,5683],{"class":1186},[1169,15889,15890,15893,15895,15898,15900,15902,15904,15906,15909],{"class":1171,"line":5569},[1169,15891,15892],{"class":1186},"cache_invalidation_manager",[1169,15894,1269],{"class":1204},[1169,15896,15897],{"class":1272},"register_pattern",[1169,15899,1276],{"class":1204},[1169,15901,14882],{"class":1272},[1169,15903,1286],{"class":1204},[1169,15905,8854],{"class":1204},[1169,15907,15908],{"class":1272},"user_invalidation_patterns",[1169,15910,2393],{"class":1204},[1169,15912,15913],{"class":1171,"line":5577},[1169,15914,1194],{"emptyLinePlaceholder":1193},[1169,15916,15917],{"class":1171,"line":5582},[1169,15918,15919],{"class":1175},"# Signal handlers\n",[1169,15921,15922,15924,15926,15928,15930,15932,15934,15936,15938,15940,15942],{"class":1171,"line":5596},[1169,15923,2332],{"class":1204},[1169,15925,4275],{"class":2335},[1169,15927,2383],{"class":1204},[1169,15929,4280],{"class":1272},[1169,15931,1286],{"class":1204},[1169,15933,4285],{"class":1272},[1169,15935,4288],{"class":1204},[1169,15937,4291],{"class":2484},[1169,15939,2432],{"class":1204},[1169,15941,14882],{"class":1272},[1169,15943,2373],{"class":1204},[1169,15945,15946,15948,15950,15952,15954,15956,15958,15960,15962,15964],{"class":1171,"line":6716},[1169,15947,2399],{"class":2398},[1169,15949,4309],{"class":2335},[1169,15951,1276],{"class":1204},[1169,15953,4314],{"class":2407},[1169,15955,1286],{"class":1204},[1169,15957,4319],{"class":2407},[1169,15959,1286],{"class":1204},[1169,15961,2677],{"class":2344},[1169,15963,2680],{"class":2407},[1169,15965,2411],{"class":1204},[1169,15967,15968,15970,15973],{"class":1171,"line":6726},[1169,15969,2417],{"class":2416},[1169,15971,15972],{"class":2420},"Invalidate user-related caches",[1169,15974,2424],{"class":2416},[1169,15976,15977,15980,15982,15984,15986,15988,15990,15992,15994,15996,15998,16000,16003,16005,16007,16010,16013,16015,16017,16019],{"class":1171,"line":6750},[1169,15978,15979],{"class":1186},"    action ",[1169,15981,2432],{"class":1204},[1169,15983,1243],{"class":1214},[1169,15985,4520],{"class":1218},[1169,15987,1222],{"class":1214},[1169,15989,9029],{"class":1182},[1169,15991,3321],{"class":1186},[1169,15993,1269],{"class":1204},[1169,15995,2554],{"class":1272},[1169,15997,1276],{"class":1204},[1169,15999,1222],{"class":1214},[1169,16001,16002],{"class":1218},"created",[1169,16004,1222],{"class":1214},[1169,16006,2351],{"class":1204},[1169,16008,16009],{"class":2344}," is",[1169,16011,16012],{"class":1380}," False",[1169,16014,9039],{"class":1182},[1169,16016,1243],{"class":1214},[1169,16018,8183],{"class":1218},[1169,16020,1834],{"class":1214},[1169,16022,16023,16026,16028,16031,16033,16035,16037,16039],{"class":1171,"line":6755},[1169,16024,16025],{"class":1186},"    cache_invalidation_manager",[1169,16027,1269],{"class":1204},[1169,16029,16030],{"class":1272},"invalidate_for_instance",[1169,16032,1276],{"class":1204},[1169,16034,4357],{"class":1272},[1169,16036,1286],{"class":1204},[1169,16038,15212],{"class":1272},[1169,16040,2373],{"class":1204},[1026,16042,16043],{},"This comprehensive caching guide provides strategies for optimizing performance across your Django microservices architecture. The techniques covered include application-level caching, distributed caching, performance monitoring, and advanced caching patterns that ensure both performance and data consistency.",[6114,16045,16046],{},"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 .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 .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 .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .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 .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}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 .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}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 .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1164,"searchDepth":1172,"depth":1179,"links":16048},[16049,16050,16054,16058,16063,16067,16071,16076],{"id":1032,"depth":1179,"text":1033},{"id":1074,"depth":1179,"text":1075,"children":16051},[16052,16053],{"id":1079,"depth":1190,"text":1080},{"id":1122,"depth":1190,"text":1123},{"id":1152,"depth":1179,"text":1153,"children":16055},[16056,16057],{"id":1156,"depth":1190,"text":1157},{"id":1863,"depth":1190,"text":1864},{"id":2160,"depth":1179,"text":2161,"children":16059},[16060,16061,16062],{"id":2164,"depth":1190,"text":2165},{"id":3087,"depth":1190,"text":695},{"id":3593,"depth":1190,"text":3594},{"id":4529,"depth":1179,"text":4530,"children":16064},[16065,16066],{"id":4533,"depth":1190,"text":4534},{"id":5603,"depth":1190,"text":5604},{"id":7031,"depth":1179,"text":7032,"children":16068},[16069,16070],{"id":7035,"depth":1190,"text":7036},{"id":7930,"depth":1190,"text":7931},{"id":9906,"depth":1179,"text":9907,"children":16072},[16073,16074,16075],{"id":9910,"depth":1190,"text":9911},{"id":11490,"depth":1190,"text":11491},{"id":12656,"depth":1190,"text":12657},{"id":14056,"depth":1179,"text":14057,"children":16077},[16078,16079],{"id":14060,"depth":1190,"text":14061},{"id":14962,"depth":1190,"text":14963},"md",null,{},{"title":917,"description":1028},"_I7ybCohZE8RMtfnBRrNKaIUH4ojkowsksrm5_GnrDE",[16086,16088],{"title":913,"path":914,"stem":915,"description":16087,"children":-1},"Security in microservices architecture requires a comprehensive approach covering authentication, authorization, network security, data protection, and monitoring. This section explores security best practices and implementation strategies for Django microservices.",{"title":921,"path":922,"stem":923,"description":16089,"children":-1},"This section consolidates essential best practices for developing, deploying, and maintaining Django microservices. Following these practices ensures scalable, maintainable, and reliable microservices architecture.",1772474965099]