{"id":2149,"date":"2025-08-20T10:30:00","date_gmt":"2025-08-20T10:30:00","guid":{"rendered":"https:\/\/mugnos-it.com\/?p=2149"},"modified":"2025-08-05T11:34:18","modified_gmt":"2025-08-05T11:34:18","slug":"qual-estrategia-de-cache-escolher","status":"publish","type":"post","link":"https:\/\/mugnos-it.com\/pt\/qual-estrategia-de-cache-escolher\/","title":{"rendered":"Qual Estrat\u00e9gia de Cache Escolher?"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"2149\" class=\"elementor elementor-2149\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4503fc13 e-flex e-con-boxed e-con e-parent\" data-id=\"4503fc13\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2624acd8 elementor-widget elementor-widget-text-editor\" data-id=\"2624acd8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h1 class=\"wp-block-heading\">Cache Aside vs Read behind vs Write through vs Read though<\/h1>\n\n\n\n<p>Fala pessoal, tudo certo? \ud83d\udc4b<\/p>\n\n\n\n<p>Hoje a pauta \u00e9 simples, mas nem por isso f\u00e1cil: qual estrat\u00e9gia de cache faz sentido pro seu sistema?<\/p>\n\n\n\n<p>A gente adora jogar um Redis ali no meio da stack e achar que resolveu todos os problemas de performance da aplica\u00e7\u00e3o. Mas&#8230; cache mal usado mais atrapalha do que ajuda. E sim \u2014 \u00e9 aquele tipo de solu\u00e7\u00e3o que funciona bem&#8230; at\u00e9 parar de funcionar. (- Quem nunca falou de usar in-memory db s\u00f3 pra melhorar lat\u00eancia durante uma entrevista ?! ahahha)<\/p>\n\n\n\n<p>Uma vez, me chamaram pra ver um sistema que \u201ctava voando com cache\u201d.(voando pro buraco, isso sim). Era dado desatualizado, comportamento estranho, e ningu\u00e9m sabia quem atualizava o qu\u00ea. O cl\u00e1ssico: botei cache para melhorar lat\u00eancia e agora o problema n\u00e3o \u00e9 lentid\u00e3o e sim inconsist\u00eancia de dados.<\/p>\n\n\n\n<p>E \u00e9 a\u00ed que a coisa desanda. Cache n\u00e3o \u00e9 s\u00f3 performance \u2014 \u00e9 decis\u00e3o arquitetural. Por isso insisto tanto na CaD: esse \u00e9 o tipo de coisa que Senior de verdade, Especialista ou Staff precisa dominar pra guiar a empresa na dire\u00e7\u00e3o certa e evitar aquela \u201cenchadada que s\u00f3 traz minhoca\u201d.<\/p>\n\n\n\n<p>Ent\u00e3o, vamos nessa, deixa te explicar 4 estrat\u00e9gias de utilizar cache de dados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e3 Cache Aside (o \u201ct\u00f4 no controle\u201d\u2026 ou pelo menos acho que t\u00f4)<\/h2>\n\n\n\n<p>\u00c9 o modelo mais manual. A aplica\u00e7\u00e3o faz tudo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Primeiro, tenta buscar o dado no cache.<\/li>\n\n\n\n<li>Se encontrar, beleza, j\u00e1 responde.<\/li>\n\n\n\n<li>Se n\u00e3o encontrar, busca no banco de dados,<\/li>\n\n\n\n<li>Armazena esse resultado no cache,<\/li>\n\n\n\n<li>E s\u00f3 ent\u00e3o responde pro usu\u00e1rio.<\/li>\n<\/ol>\n\n\n\n<p>Ou seja: quem decide o que vai pro cache, quando vai e por quanto tempo\u2026 \u00e9 voc\u00ea (ou o dev que escreveu isso 2 anos atr\u00e1s).<\/p>\n\n\n\n<p>\ud83d\udd0e <strong>Vale quando:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea quer controle total sobre o cache e consegue gerenciar TTLs e invalida\u00e7\u00f5es.<\/li>\n\n\n\n<li>As leituras s\u00e3o bem mais frequentes que as escritas.<\/li>\n\n\n\n<li>Cada aplica\u00e7\u00e3o pode seguir sua pr\u00f3pria l\u00f3gica sem depender de um ponto central.<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f <strong>Cuidado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TTL infinito? Vai entregar dado velho sem perceber.<\/li>\n\n\n\n<li>Esqueceu de invalidar o cache depois de uma escrita? Vai dar inconsist\u00eancia.<\/li>\n\n\n\n<li>Em sistemas distribu\u00eddos, cada aplica\u00e7\u00e3o precisa implementar essa l\u00f3gica \u2014 se cada uma fizer diferente, j\u00e1 sabe o resultado.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2\ufe0f\u20e3 Write Through (o \u201cescreveu, j\u00e1 t\u00e1 quente\u201d)<\/h2>\n\n\n\n<p>Aqui o fluxo acontece no momento da escrita, n\u00e3o da leitura:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A aplica\u00e7\u00e3o recebe a requisi\u00e7\u00e3o para salvar ou atualizar um dado.<\/li>\n\n\n\n<li>Em vez de s\u00f3 mandar pro banco, ela salva ao mesmo tempo no banco e no cache.<\/li>\n\n\n\n<li>Pronto. A pr\u00f3xima leitura j\u00e1 encontra tudo no cache, bonitinho e atualizado.<\/li>\n<\/ol>\n\n\n\n<p>Esse modelo garante que o cache nunca fique desatualizado. Mas\u2026 voc\u00ea t\u00e1 escrevendo em dois lugares. Se um deles falhar, voc\u00ea precisa tratar.<\/p>\n\n\n\n<p>\ud83d\udd0e <strong>Vale quando:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Leitura precisa ser r\u00e1pida e sempre atualizada.<\/li>\n\n\n\n<li>Voc\u00ea tolera um pequeno impacto na performance de escrita.<\/li>\n\n\n\n<li>O volume de escrita \u00e9 controlado e voc\u00ea consegue garantir atomicidade entre cache e banco.<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f <strong>Cuidado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se o cache estiver fora do ar, sua escrita falha ou fica incompleta.<\/li>\n\n\n\n<li>Se der erro s\u00f3 em um dos lados (ex: banco foi, cache n\u00e3o), o dado pode ficar inconsistente.<\/li>\n\n\n\n<li>Sem bons mecanismos de retry\/rollback, esse modelo vira armadilha.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3\ufe0f\u20e3 Write Behind (o \u201cdeixa que depois eu salvo\u201d)<\/h2>\n\n\n\n<p>Aqui \u00e9 quase um &#8220;Write Through&#8221;, mas ass\u00edncrono. O fluxo muda assim:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A aplica\u00e7\u00e3o recebe a requisi\u00e7\u00e3o de escrita,<\/li>\n\n\n\n<li>Salva apenas no cache (ou numa fila, dependendo da implementa\u00e7\u00e3o),<\/li>\n\n\n\n<li>Retorna a resposta pro usu\u00e1rio rapid\u00e3o,<\/li>\n\n\n\n<li>E depois, um processo ass\u00edncrono grava esse dado no banco de dados.<\/li>\n<\/ol>\n\n\n\n<p>Ou seja, o cache vira a fonte tempor\u00e1ria da verdade, e a persist\u00eancia acontece por tr\u00e1s dos panos.<\/p>\n\n\n\n<p>\ud83d\udd0e <strong>Vale quando:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Performance de escrita \u00e9 crucial e voc\u00ea pode esperar um pouco pra persistir os dados.<\/li>\n\n\n\n<li>Seu sistema \u00e9 tolerante \u00e0 consist\u00eancia eventual.<\/li>\n\n\n\n<li>J\u00e1 tem algum job, worker ou fila confi\u00e1vel pra cuidar da grava\u00e7\u00e3o no banco.<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f <strong>Cuidado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cache \u00e9 vol\u00e1til. Se cair antes de gravar no banco, perdeu o dado.<\/li>\n\n\n\n<li>D\u00e1 pra mitigar com persist\u00eancia em disco, logs de altera\u00e7\u00e3o ou buffers \u2014 mas a\u00ed come\u00e7a a complicar.<\/li>\n\n\n\n<li>Voc\u00ea precisa garantir que o processo de flush pro banco esteja vivo, r\u00e1pido e confi\u00e1vel.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4\ufe0f\u20e3 Read Through (o \u201ccache com c\u00e9rebro\u201d)<\/h2>\n\n\n\n<p>Aqui o cache deixa de ser s\u00f3 um atalho e vira parte do fluxo de leitura. O que muda:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A aplica\u00e7\u00e3o sempre consulta o cache.<\/li>\n\n\n\n<li>Se o dado estiver l\u00e1, responde na hora.<\/li>\n\n\n\n<li>Se n\u00e3o estiver, o pr\u00f3prio cache se encarrega de ir no banco,<\/li>\n\n\n\n<li>Recupera o dado,<\/li>\n\n\n\n<li>Armazena no cache,<\/li>\n\n\n\n<li>E a\u00ed sim devolve pra aplica\u00e7\u00e3o.<\/li>\n<\/ol>\n\n\n\n<p>A grande diferen\u00e7a pro Cache Aside \u00e9 que a l\u00f3gica de fallback pro banco est\u00e1 no cache, n\u00e3o na aplica\u00e7\u00e3o. Mais limpo e mais desacoplado.<\/p>\n\n\n\n<p>\ud83d\udd0e <strong>Vale quando:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea quer simplificar o c\u00f3digo da aplica\u00e7\u00e3o e centralizar a l\u00f3gica de cache.<\/li>\n\n\n\n<li>Usa ferramentas que suportam esse modelo (ex: proxies, gateways, libs especializadas).<\/li>\n\n\n\n<li>Quer evitar que cada aplica\u00e7\u00e3o implemente sua pr\u00f3pria l\u00f3gica de \u201cfallback\u201d.<\/li>\n<\/ul>\n\n\n\n<p>\u26a0\ufe0f <strong>Cuidado:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adiciona uma lat\u00eancia extra nas primeiras leituras (<em>cache miss<\/em>).<\/li>\n\n\n\n<li>Se o cache falhar, sua aplica\u00e7\u00e3o pode travar junto \u2014 j\u00e1 que depende dele pra buscar no banco.<\/li>\n\n\n\n<li>Centralizar \u00e9 bom, mas tamb\u00e9m pode virar um <em>single point of failure<\/em> se n\u00e3o for bem arquitetado.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Conclus\u00e3o<\/h3>\n\n\n\n<p>A real \u00e9 que cache \u00e9 um dos maiores causadores de bugs silenciosos que existem. O sistema parece r\u00e1pido, os logs mostram 200ms de resposta, mas&#8230; t\u00e1 servindo dado de dois dias atr\u00e1s. E \u00e0s vezes nem \u00e9 s\u00f3 isso \u2014 cada servi\u00e7o acessando o mesmo cache come\u00e7a a enxergar vers\u00f5es diferentes da realidade. A\u00ed j\u00e1 era: debug imposs\u00edvel, comportamento aleat\u00f3rio, e ningu\u00e9m sabe mais o que \u00e9 verdade.<\/p>\n\n\n\n<p>Se voc\u00ea n\u00e3o sabe onde t\u00e1 o centro da verdade, quem atualiza o qu\u00ea e quando os dados vencem, ent\u00e3o n\u00e3o tem cache. Tem uma bomba-rel\u00f3gio \u2014 e ela vai estourar na hora mais inconveniente poss\u00edvel.<\/p>\n\n\n\n<p>\u00c9 exatamente por isso que esse tipo de tema volta e meia aparece no <strong>CaD<\/strong>. L\u00e1, a gente n\u00e3o fica s\u00f3 no conceito bonito pra postar no LinkedIn \u2014 a ideia \u00e9 entender os porqu\u00eas, fazer escolhas com crit\u00e9rio e montar ambientes modernos, resilientes e de alta qualidade.<\/p>\n\n\n\n<p>Se voc\u00ea quer se tornar um Senior ou especialista, t\u00e1 na hora de jogar no modo avan\u00e7ado!<\/p>\n\n\n\n<p>\ud83d\udc49 <a href=\"https:\/\/mugnos-it.com\/pt\/cad\/\">https:\/\/mugnos-it.com\/cad<\/a><\/p>\n\n\n\n<p>Nos vemos no pr\u00f3ximo!<\/p>\n\n\n\n<p>Douglas Mugnos.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1ee0bc7 e-flex e-con-boxed e-con e-parent\" data-id=\"1ee0bc7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Cache Aside vs Read behind vs Write through vs Read though Fala pessoal, tudo certo? \ud83d\udc4b Hoje a pauta \u00e9 simples, mas nem por isso f\u00e1cil: qual estrat\u00e9gia de cache faz sentido pro seu sistema? A gente adora jogar um Redis ali no meio da stack e achar que resolveu todos os problemas de performance [&hellip;]<\/p>","protected":false},"author":3,"featured_media":2150,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2149","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/08\/ChatGPT-Image-4-de-ago.-de-2025-09_06_17.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/comments?post=2149"}],"version-history":[{"count":4,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2149\/revisions"}],"predecessor-version":[{"id":2154,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2149\/revisions\/2154"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media\/2150"}],"wp:attachment":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media?parent=2149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/categories?post=2149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/tags?post=2149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}