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

120 lines
4.8 KiB
HTML
Raw Normal View History

2023-07-30 04:42:20 +00:00
<!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.5.1/github-markdown.min.css"
2023-07-30 04:42:20 +00:00
/>
<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">
2023-08-09 07:22:58 +00:00
<h2>
<a href="index.html"><code>~</code></a>
</h2>
2023-11-19 15:59:21 +00:00
<h1>
<a
id="user-content-cache-shenanigan"
class="anchor"
aria-hidden="true"
tabindex="-1"
href="#cache-shenanigan"
><span aria-hidden="true" class="octicon octicon-link"></span></a
>Cache shenanigan
2023-07-30 04:42:20 +00:00
</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>
2023-09-23 17:04:02 +00:00
<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>
2023-07-30 05:16:18 +00:00
2023-09-23 17:04:02 +00:00
<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>
2023-12-16 07:19:10 +00:00
<span class="pl-s">service --&gt;&gt; other: return data</span>
else not exist in cache
<span class="pl-s">service -&gt;&gt; db: get data</span>
<span class="pl-s">alt exist data in db</span>
<span class="pl-s">service --&gt;&gt; other: return data</span>
else not exist data in db
<span class="pl-s">service --&gt;&gt; other: return error not found</span>
2023-09-23 17:04:02 +00:00
<span class="pl-k">end</span>
2023-12-16 07:19:10 +00:00
<span class="pl-ent">end</span>
2023-09-23 17:04:02 +00:00
<span class="pl-k">deactivate</span> <span class="pl-ent">service</span>
2023-07-30 05:16:18 +00:00
2023-09-23 17:04:02 +00:00
<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>
2023-07-30 04:42:20 +00:00
<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>
2023-11-19 15:59:21 +00:00
<h2>
<a
id="user-content-thanks"
class="anchor"
aria-hidden="true"
tabindex="-1"
href="#thanks"
><span aria-hidden="true" class="octicon octicon-link"></span></a
>Thanks
2023-07-30 04:42:20 +00:00
</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
2023-08-20 17:29:13 +00:00
<a rel="me" href="https://hachyderm.io/@haunguyen">Mastodon</a>.
<br />Source code is available on
2023-07-30 04:42:20 +00:00
<a href="https://github.com/haunt98/posts-go">GitHub</a>
2023-08-20 17:29:13 +00:00
<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>
2023-07-30 04:42:20 +00:00
</div>
</body>
</html>