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

结合使用canal(阿里的一款开源框架)，通过该框架可以对MySQL的binlog进行订阅因为是最终一致性，所以业务如果无法接收短期不一致性的话就得更换策略</description>
</item>
</rdf:RDF>