<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>LuckyDu - 数据库面试题</title>
<link>http://blog.anlucky.cn/index.php/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98/</link>
<atom:link href="http://blog.anlucky.cn/index.php/feed/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Sun, 28 May 2023 18:34:35 +0800</lastBuildDate>
<pubDate>Sun, 28 May 2023 18:34:35 +0800</pubDate>
<item>
<title>Redis持久化策略</title>
<link>http://blog.anlucky.cn/index.php/programming/database/168</link>
<guid>http://blog.anlucky.cn/index.php/programming/database/168</guid>
<pubDate>Sun, 28 May 2023 18:34:35 +0800</pubDate>
<dc:creator>都依凡</dc:creator>
<description><![CDATA[Redis持久化策略1. RDB持久化策略RDB是redis持久化数据到磁盘的策略将内存以快照形式保存Redis数据库中的数据的方式，就是某一时刻，将Redis内存中的数据全量备份到磁盘，RDB...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>Redis持久化策略</h1><h2>1. RDB持久化策略</h2><p>RDB是redis持久化数据到磁盘的策略</p><p><strong>将内存以快照形式保存Redis数据库中的数据的方式</strong>，就是某一时刻，将Redis内存中的数据全量备份到磁盘，RDB就是redis DataBase的缩写</p><h3>备份会不会阻塞主线程</h3><p>Redis是单线程数据处理，Redis提供了两个命令来生成RDB，一个是<code>save</code> 一个是<code>bgsave</code></p><ul><li>save 保存：会阻塞Redis主线程，直到RDB文件备份完成为止，在这个期间，Redis不能处理客户端的任何请求</li><li>bgSave 保存：不会阻塞主线程，会创建一个子线程，单独我负责RDB文件的数据备份，</li></ul><h3>RDB的优势和劣势</h3><ul><li>优势</li></ul><ol><li>RDB文件紧凑，全量备份，适合进行备份和灾难恢复</li><li>生成RDB文件的时候，Redis主进程会分叉一个子进程来处理保存数据，主进程不需要进程IO操作</li><li>RDB在恢复文件的时候要比AOP速度快</li></ol><h2>2. AOF持久化策略</h2><p>AOF持久化策略，以文件的形式存储Redis内存中的数据，他的文件格式是AOF，他存储的数据是客户端交给Redis执行的写命令</p><blockquote>因为AOF是在文件中追加写入，由于IO操作的阻塞性，会导致主线程挂起，在写入的时间中无法服务新的请求，因而吞吐量收到影响</blockquote><p>为了解决上述的问题，Redis并不会立即将数据写入到硬盘中，</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>http://blog.anlucky.cn/index.php/programming/database/168#comments</comments>
<wfw:commentRss>http://blog.anlucky.cn/index.php/feed/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98/</wfw:commentRss>
</item>
<item>
<title>Redis和Mysql如何保证数据一致性</title>
<link>http://blog.anlucky.cn/index.php/programming/database/166</link>
<guid>http://blog.anlucky.cn/index.php/programming/database/166</guid>
<pubDate>Sat, 27 May 2023 20:20:46 +0800</pubDate>
<dc:creator>都依凡</dc:creator>
<description><![CDATA[Redis和Mysql如何保证数据一致性1. 导致数据不一致的原因当数据发生变化的时候，需要同时去更新Redis和Mysql，更新数据是有先后顺序的，在极端情况下就会出现数据一致性的问题。1. ...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>Redis和Mysql如何保证数据一致性</h1><h2>1. 导致数据不一致的原因</h2><p>当数据发生变化的时候，需要同时去更新Redis和Mysql，更新数据是有先后顺序的，在极端情况下就会出现数据一致性的问题。</p><h3>1. 先更新数据库再更新缓存</h3><p>如果先更新数据库，若是缓存中的数据更新失败，就会出现数据库和redis中的数据不一致问题</p><h3>2. 先删除缓存，再更新数据库</h3><p>先删除缓存再更新数据库，在理想情况删除了缓存，更新了数据库，再第二次请求的时候会发现缓存是空的，会去读取数据库将数据缓存起来。</p><p>但是</p><p>删除缓存和更新数据库不是一个原子操作，若是缓存删除了，此时，第二条线程抢到CPU时间轮片，开始读取数据，发现没有缓存，查询数据库，并将数据缓存起来，此时第一条线程拿到CPU时间轮片，开始更新数据库，这个情况下会导致数据库和缓存不一致</p><h2>采用最终一致性的方案解决</h2><h3>1. 采用延迟双删除的策略</h3><p>具体步骤</p><ol><li>先删除缓存</li><li>写入数据库</li><li>休眠500毫秒（视情况而定）</li><li>再次删除缓存</li></ol><p>具体实现</p><pre><code class="lang-java">public void write(String key,Object data){
     redis.delKey(key); // 删除缓存
     db.updateData(data); // 更新数据库
     Thread.sleep(500); // 睡眠延迟
     redis.delKey(key);// 再次删除缓存
 }</code></pre><h3>2. 异步更新缓存（基于订阅Binlog）</h3><p>读取MysqlBinlog日志后分析，利用消息队列，推送更新到redis缓存中，这样一旦产生了新的写入，更新，删除等操作，就可以把相关的更新推送到redis中</p><blockquote>其实这种机制类似于Mysql的主从备份，Mysql的主从备份也是通过Binlog来实现数据一致性</blockquote><pre><code>这里的消息推送工具可以使用Kafka、rabbitMQ等消息队列来实现

结合使用canal(阿里的一款开源框架)，通过该框架可以对MySQL的binlog进行订阅</code></pre><p><strong>因为是最终一致性，所以业务如果无法接收短期不一致性的话就得更换策略</strong></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>http://blog.anlucky.cn/index.php/programming/database/166#comments</comments>
<wfw:commentRss>http://blog.anlucky.cn/index.php/feed/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98/</wfw:commentRss>
</item>
</channel>
</rss>