<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>缓存 on Elastic Code</title><link>https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/</link><description>Recent content in 缓存 on Elastic Code</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 Elastic Code</copyright><atom:link href="https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/index.xml" rel="self" type="application/rss+xml"/><item><title>一致性保证</title><link>https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/%E4%B8%80%E8%87%B4%E6%80%A7%E4%BF%9D%E8%AF%81/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/%E4%B8%80%E8%87%B4%E6%80%A7%E4%BF%9D%E8%AF%81/</guid><description>&lt;p&gt;以旁路缓存为基础，探讨以下方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; **更新MySQL后，不管Redis，以过期时间兜底**：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **特点**：只更新数据库，不立即处理缓存，依赖缓存的过期时间来自动刷新缓存。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **优点**：实现简单，避免了并发问题。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **缺点**：在缓存未过期期间，读取到的仍然是旧数据。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; **更新MySQL之后，操作Redis**：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **特点**：在更新数据库后立即更新或删除缓存，以确保缓存中的数据与数据库中的数据一致。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **具体操作**：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **更新缓存**：直接将新的数据写入缓存。这种方法可能会有并发问题，导致缓存和数据库不一致（写库+写缓存，双写在并发时导致脏写）。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **删除缓存**：删除缓存中的数据，确保下次读取时从数据库中获取最新的数据，并将其写入缓存。这是推荐的方法，能有效避免并发问题。在**缓存击穿**情况下，可考虑使用**乐观锁**的方式写入缓存（不存在则写入）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **优点**：缓存与数据库数据一致性高。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **缺点**：实现复杂度较高，尤其在高并发场景下。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; **异步将MySQL的更新同步到Redis**：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **特点**：在更新数据库后，将更新操作记录下来，通过异步任务将数据同步到缓存中。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **优点**：降低了数据库操作和缓存操作之间的耦合度，提高系统的异步处理能力。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; • **缺点**：实现复杂度高，需要处理异步任务的可靠性和数据一致性问题。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中，方式 3 可用 阿里巴巴开源组件 canal&lt;/p&gt;</description></item><item><title>缓存异常场景</title><link>https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/%E7%BC%93%E5%AD%98%E5%BC%82%E5%B8%B8%E5%9C%BA%E6%99%AF/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://my.elastic-code.com/zh/docs/redis/%E9%AB%98%E7%BA%A7/%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF/%E7%BC%93%E5%AD%98/%E7%BC%93%E5%AD%98%E5%BC%82%E5%B8%B8%E5%9C%BA%E6%99%AF/</guid><description>&lt;h2 class="relative group"&gt;缓存穿透
 &lt;div id="缓存穿透" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%bc%93%e5%ad%98%e7%a9%bf%e9%80%8f" aria-label="锚点"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;缓存穿透是指查询一个在缓存和数据库中都不存在的数据。&lt;/p&gt;
&lt;p&gt;可能有恶意用户故意请求一个不存在的数据&lt;/p&gt;

&lt;h4 class="relative group"&gt;&lt;strong&gt;解决方案&lt;/strong&gt;
 &lt;div id="解决方案" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" aria-label="锚点"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h4&gt;
&lt;p&gt;基本思路就是提前校验拦住&lt;/p&gt;</description></item></channel></rss>