读写一致 && MySQL&&Redis

存储一致性&& CPU存储 && L1L2Cache等等 

不懂CPU如何读写内存还敢说自己是程序员? - 知乎 (zhihu.com)

数据一致性的含义:

它目的不是说==》两个线程并发读写,然后某个线程获得的数据是旧数据

而目的是==》过了一小段时间,缓存数据和数据库中的数据是不是一致的。或者说主从数据库中的数据是不是一致的。

==》为啥会不一致,我觉得主要原因就是过期策略导致的。若热点数据长时间不过期,里面一直放着旧数据,这不出问题了么

1. 缓存雪崩:缓存雪崩的关键在于在同一时间大规模的key失效。

出现原因:①Redis宕机 ② Redis中的大量数据采用同一过期时间

解决措施:①熔断机制,当请求流量达到阈值,就提示一会再进入,保证一部分用户可用,另一部分多刷新几次也能用

                  ②提高数据库容灾能力,读写分离,分库分表,提高数据库可靠性可用性

                  ③将Redis变成集群

2. 缓存击穿:热点数据过期,大量请求直接访问数据库

解决措施:①业务允许热点数据不设置过期时间

                  ②当热点数据过期时,使用互斥锁,降低同一时间访问数据库的请求数量

3. 缓存穿透:恶意攻击,访问不存在于数据库中的请求,那Redis中没缓存。自然要访问MySQL

解决措施:布隆过滤器

常见的缓存读写策略:旁路缓存、读写穿透、异步缓存

(一)旁路缓存:适合读请求多的情况

读:

数据先从cache里面读,如果有,读走;

如果没有,从MySQL中获取,写入Redis再返回。

写:

先更新DB,然后删除Redis中的缓存

(二)读写穿透:==》把Redis视作主要的数据存储空间,读和写都在对Redis

读:数据先从cache里面读,有就直接读走

如果没有,从MySQL中读取,写入缓存,然后再返回。

==》和旁路缓存的区别在于:旁路缓存是全由用户去做的,数据不存在就自己写代码从MySQL中读,load到Redis中;但是读写穿透则是:用户就直接和缓存交互,缓存和数据库的交互有缓存自己处理,不用用户操心。

写:

先查看该更新写数据在Cache中是否存在,若不存在直接写入数据库

若存在,那么,先更新Cache,而后Cache自己

(三)

延时双删:==》解决Redis和MySQL数据一致性

删除两次:写库前后都进行 Redis 的删除操作

实现逻辑:

在修改MySQL前删一次cache;

修改MySQL(数据库数据);

延迟等待一小段时间(避免此时的读操作 正在把 之前读到的旧数据写回到Cache的路上,等这个读操作把旧数据写回到cache,然后在删除,这样就避免了,我这边刚删完,写操作就带着旧数据写回到Cache中了,这不白删除了嘛);

再次删除cache中的数据

再读一读这些在总结整理:

ref:Redis和Mysql如何保证数据一致?面试可以这样说自己的看法 - 知乎 (zhihu.com)

缓存与数据库一致性问题深度剖析 (修订) (qq.com) 

3种缓存读写策略都不了解?面试很难让你通过啊兄弟! (qq.com) 

你可能感兴趣的:(mysql,redis,数据库)