redis
(四)双写一致性(mysql数据库与redis进行同步)
⭐前提:需要具体问题具体分析,是要求强一致性还是不要求,可使用不一样的方法进行。
定义:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。
读操作:缓存命中,直接返回;缓存未命中,查询数据库,写入缓存,设定超时时间。
写操作:延迟双删
含义:删除缓存->修改数据库->删除缓存【有脏数据的风险】
1.先删除缓存还是先修改数据库?无论是先删除缓存还是先删除数据库,都是有脏数据的风险。
2.为什么要删除两次缓存?降低脏数据风险的概率。
3.为什么要延时删除?因为DB是主从模式,读写分离的,我们需要等一会儿,让主节点同步到从节点,从而需要延时删除。但是,延时的时间不好设定,在延时的期间,会有脏数据出现的风险。
如果需要强一致性,那么需要使用分布式锁的模式(性能会差)。
如何稍微提升性能?(读写锁)
因为缓存中的数据读多写少,从而可以使用读写锁分开来:当一个线程读取数据时,给他加一个共享锁,其他线程也可以读取数据;当一个线程正在写入缓存时,添加排他锁,阻塞其他线程的读写操作。
如果不需要强一致性,那么可以有以下的解决方法。
1、异步通知保证数据的最终一致性
2、基于Canal(阿里产品)的异步通知
二进制日志(binlog)记录了所有DDL(数据定义语言)和DML(数据操纵语言),但不包括查询的语句。
面试相关: