posts-go/docs/2023-07-30-cache-shenanigan...

113 lines
5.2 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.3.0/github-markdown.min.css"
/>
<title>haunt98 posts</title>
</head>
<style>
.markdown-body {
box-sizing: border-box;
min-width: 200px;
max-width: 980px;
margin: 0 auto;
padding: 45px;
}
@media (max-width: 767px) {
.markdown-body {
padding: 15px;
}
}
</style>
<body class="markdown-body">
<h2>
<a href="index.html"><code>~</code></a>
</h2>
<h1 id="user-content-cache-shenanigan">
<a class="heading-link" href="#cache-shenanigan"
>Cache shenanigan<span
aria-hidden="true"
class="octicon octicon-link"
></span
></a>
</h1>
<p>
My notes/mistakes/... when using cache (mainly Redis) from time to time
</p>
<p>My default strategy is:</p>
<ul>
<li>Write to database first then to cache second</li>
<li>
Read from cache first, if not found then read from database second, then
re-write to cache
</li>
</ul>
<div class="highlight highlight-source-mermaid">
<pre><span class="pl-k">sequenceDiagram</span>
<span class="pl-k">participant</span> <span class="pl-ent">other</span>
<span class="pl-k">participant</span> <span class="pl-ent">service</span>
<span class="pl-k">participant</span> <span class="pl-ent">cache</span>
<span class="pl-k">participant</span> <span class="pl-ent">db</span>
<span class="pl-ent">other </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">service</span><span class="pl-k">:</span> <span class="pl-s">get data</span>
<span class="pl-k">activate</span> <span class="pl-ent">service</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">cache</span><span class="pl-k">:</span> <span class="pl-s">get data</span>
<span class="pl-k">alt</span> <span class="pl-s">exist in cache</span>
<span class="pl-ent">service </span><span class="pl-k">--&gt;&gt;</span> <span class="pl-ent">other</span><span class="pl-k">:</span> <span class="pl-s">return data</span>
<span class="pl-k">else</span> <span class="pl-s">not exist in cache</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">db</span><span class="pl-k">:</span> <span class="pl-s">get data</span>
<span class="pl-k">alt</span> <span class="pl-s">exist data in db</span>
<span class="pl-ent">service </span><span class="pl-k">--&gt;&gt;</span> <span class="pl-ent">other</span><span class="pl-k">:</span> <span class="pl-s">return data</span>
<span class="pl-k">else</span> <span class="pl-s">not exist data in db</span>
<span class="pl-ent">service </span><span class="pl-k">--&gt;&gt;</span> <span class="pl-ent">other</span><span class="pl-k">:</span> <span class="pl-s">return error not found</span>
<span class="pl-k">end</span>
<span class="pl-k">end</span>
<span class="pl-k">deactivate</span> <span class="pl-ent">service</span>
<span class="pl-ent">other </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">service</span><span class="pl-k">:</span> <span class="pl-s">set data</span>
<span class="pl-k">activate</span> <span class="pl-ent">service</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">db</span><span class="pl-k">:</span> <span class="pl-s">set data</span>
<span class="pl-ent">service </span><span class="pl-k">-&gt;&gt;</span> <span class="pl-ent">cache</span><span class="pl-k">:</span> <span class="pl-s">set data</span>
<span class="pl-k">deactivate</span> <span class="pl-ent">service</span></pre>
</div>
<p>It's good for general cases, for example with CRUD action.</p>
<p>
The bad things happen when cache and database are not consistent. For
example what happen if writing database OK then writing cache failed? Now
database has new value, but cache has old value Then when we read again,
we read cache first with old value, and that is disaster.
</p>
<h2 id="user-content-thanks">
<a class="heading-link" href="#thanks"
>Thanks<span aria-hidden="true" class="octicon octicon-link"></span
></a>
</h2>
<ul>
<li>
<a
href="https://danielw.cn/cache-consistency-with-database"
rel="nofollow"
>Cache Consistency with Database</a
>
</li>
</ul>
<div>
Feel free to ask me via
<a href="mailto:hauvipapro+posts@gmail.com">email</a> or
<a rel="me" href="https://hachyderm.io/@haunguyen">Mastodon</a>.
<br />Source code is available on
<a href="https://github.com/haunt98/posts-go">GitHub</a>
<a href="https://codeberg.org/yoshie/posts-go">Codeberg</a>
<a href="https://git.sr.ht/~youngyoshie/posts-go">sourcehut</a>
<a href="https://gitea.treehouse.systems/yoshie/posts-go">Treehouse</a>
<a href="https://gitlab.com/youngyoshie/posts-go">GitLab</a>
</div>
</body>
</html>