Redis高性能策略以及各种缓存异常问题和解决方案

文章讨论了异步子线程在Redis性能优化中的应用,包括如何处理BigKey操作和AOF日志同步写操作,以及不同CPU架构对性能的影响。此外,还详细讲解了Redis缓存与后端MySQL数据一致性问题,如缓存雪崩、击穿和穿透的解决策略,以及布隆过滤器的工作原理。
摘要由CSDN通过智能技术生成

目录

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彻底沦为 “摆设”.

雪崩分类解决措施

  1. redis大量数据同时过期

    • 解决1:给过期时间设置随机值,避免同时.

    • 解决2:服务降级,只提供核心数据的访问服务,有点像限流,但是是按照数据的重要程度做的限制.

  2. redis实例发生宕机

    • 解决1:访问熔断 (暂停服务),对业务影响大,待redis实例恢复.

    • 解决2:访问限流,限制访问量,待redis实例恢复.

    • 解决3:高可用策略,设置redis实例集群,主从复制,容灾容错,自动切换.

击穿解决策略

  • 不给特别热点的数据设置过期时间.

穿透解决策略

  1. 针对不存在的数据设置空置缓存,缺省值缓存。直接返回空值.

  2. 使用布隆过滤器判断数据是否存在.

  3. 前端进行请求合法性检测,避免恶意攻击.

布隆过滤器实现原理

描述:创建阶段,就是一个hash函数族,算出这个不同的hash值,然后 hash_value % hash_table_len 映射到不同的hash槽位上,并且将这个bite位设置为1。若后续数据再次来临。依次检验hash_value对应槽位是否全为1. 若非,则数据不存在,若全1则可能存在。

作用:过滤去除一定不存在的数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杰312

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值