目录
Day 2.25
异步子线程机制
CPU架构类型,以及可能产生的影响
Day 2.26
redis 缓存与后端 MySQL 数据不一致问题
redis 缓存异常问题 (缓存雪崩,缓存击穿,缓存穿透)及 解决措施
布隆过滤器实现原理
Day 2.25
学习了导致redis高性能的原因,除去高效数据结构和内存数据库以外的原因。
-
异步子线程机制
-
CPU架构对redis性能的影响
异步子线程机制
针对阻塞点可能需要异步处理,避免阻塞主线程。
eg:BigKey (键值对) 删除操作、清空数据库操作、AOF日志同步写操作(AOF异步刷盘)、从库加载RDB文件、集合的全量查询和聚合操作 O(N)。
思考一个问题:AOF日志同步写操作我知道会阻塞,那读写缓存中的同步直写策略是否也会阻塞?会
两者阻塞之后的处理是否一致?不一致。 同步直写在redis主线程中完成,AOF刷盘是异步完成的。
哪些操作可以采取异步子线程处理的形式?
多数写操作、无需带回返回值的非关键路径操作
eg:BigKey 删除操作、数据库清空操作、AOF日志同步写操作、大文件关闭.
CPU架构类型,以及可能产生的影响
单CPU单核: 不存在由于程序在不同核上运行导致的 context switch 以及 缓存失效 问题
单CPU多核:存在 context switch 和 缓存失效问题,解决办法,bind_cpu_core.
多CPU多核:NUMA 架构(非统一内存访问架构)存在远程内存访问问题,不在一个CPU Socket(处理器)上面,解决办法,绑到一起,避免远程内存访问。
将Redis实例绑定核心的弊端:多程序资源竞争,措施,绑定物理核或者直接修改源码,将不同程序绑定到不同逻辑核上。
Day 2.26
-
redis 缓存与后端 MySQL 数据不一致问题
-
redis 缓存异常问题 (缓存雪崩,缓存击穿,缓存穿透)及 解决措施
redis 缓存与后端 MySQL 数据不一致问题
一致性描述:
-
缓存中有数据,且缓存中数据与后端MySQL数据一致.
-
缓存中无数据,且后端MySQL数据是最新值.
出现情况:
针对读写缓存,必须同步直写操作,才能保障数据一致.
采用异步写回策略,必然会出现这个数据不一致问题。写回前都是不一致的.
解决策略:用同步只写不就OK了.
针对只读缓存
eg1:在修改或者删除操作的时候,需要同时操作缓存和数据库,既要跟新数据库删除数据库中的数据、还要删除对应缓存。 两者操作如果只完成其一,自然会出现读取旧值的问题。
解决策略:用消息队列缓存重试 【重试机制】
eg2:两者操作均完成,但是无法保障原子性问题。大量的线程并发读取操作的时候,其他线程切入进来,读取到旧值并可能利用旧值做缓存跟新操作导致数据不一致。
解决策略:延迟双删。
redis 缓存异常问题 (缓存雪崩,缓存击穿,缓存穿透)及 解决措施
What? How?
雪崩:大量的请求无法在redis中进行处理,导致压力给到后端MySQL,可能导致MySQL崩溃.
击穿:在redis中的超级热点数据过期,redis中没有,大量请求压到MySQL上.
穿透:请求数据不在redis中,同时也不在MySQL上. redis彻底沦为 “摆设”.
雪崩分类解决措施
-
redis大量数据同时过期
-
解决1:给过期时间设置随机值,避免同时.
-
解决2:服务降级,只提供核心数据的访问服务,有点像限流,但是是按照数据的重要程度做的限制.
-
-
redis实例发生宕机
-
解决1:访问熔断 (暂停服务),对业务影响大,待redis实例恢复.
-
解决2:访问限流,限制访问量,待redis实例恢复.
-
解决3:高可用策略,设置redis实例集群,主从复制,容灾容错,自动切换.
-
击穿解决策略
-
不给特别热点的数据设置过期时间.
穿透解决策略
-
针对不存在的数据设置空置缓存,缺省值缓存。直接返回空值.
-
使用布隆过滤器判断数据是否存在.
-
前端进行请求合法性检测,避免恶意攻击.
布隆过滤器实现原理
描述:创建阶段,就是一个hash函数族,算出这个不同的hash值,然后 hash_value % hash_table_len 映射到不同的hash槽位上,并且将这个bite位设置为1。若后续数据再次来临。依次检验hash_value对应槽位是否全为1. 若非,则数据不存在,若全1则可能存在。
作用:过滤去除一定不存在的数据。