redis使用的那些坑

本文探讨了缓存一致性问题,包括缓存击穿、雪崩、穿透现象,介绍了相应的解决方案,如分布式锁、预热、多级缓存和淘汰策略,以降低对后端服务的压力并优化性能。
摘要由CSDN通过智能技术生成

缓存击穿(Cache Miss):

缓存击穿是指一个非常热门的或者经常被请求的缓存键在缓存中过期失效后,被大量的并发请求同时访问,导致这些请求直接击穿缓存,直接访问数据库或其他后端服务。这会导致数据库负载激增,可能引起性能问题。

解决方案:

  1. 使用分布式锁,确保只有一个线程可以重新生成缓存,其他线程需要等待。
  2. 在缓存过期前主动刷新缓存,避免同时过期的情况。
  3. 使用无效值(sentinel value)标记缓存正在被重新生成,其他请求检测到后等待或进行重试。

在实际开发中,通常是结合多种方案处理,比如定期生成,为了防止请求中服务等待,可以通过缓存版本号,在新的数据生成前,通过版本号获取旧的数据。

缓存雪崩(Cache Avalanche):

缓存雪崩是指缓存中的大量数据在同一时间内过期,导致大量的请求直接打到后端数据库或其他服务上。与缓存击穿不同的是,缓存雪崩是指多个缓存键同时失效,而不仅仅是一个。

解决方案:

  1. 设置不同的过期时间,避免缓存同时失效。
  2. 使用缓存预热,提前加载缓存数据,减缓缓存雪崩的影响。
  3. 使用多级缓存,将缓存分层,部分数据在一级缓存失效时可以从二级缓存中获取,以减轻后端负载。
  4. 引入缓存的自动刷新机制,避免在高负载时出现大量缓存同时失效的情况。

在实际系统设计中,通常需要综合考虑以上方案,选择适合当前场景的组合以减少缓存击穿和缓存雪崩的风险。

缓存穿透(Cache Penetration):

缓存穿透是指针对一个不存在于缓存中的键进行大量请求,导致这些请求都直接访问后端存储,从而浪费资源。

解决方案:

可以通过在缓存层增加对不存在键的判断,并设置缓存空值(如使用布隆过滤器)来缓解这个问题。

缓存膨胀(Cache Bloat):

缓存膨胀是指缓存中存储了大量不再使用的或者过期的数据,占用了过多的内存空间。

解决方案:

可以通过合理设置缓存过期时间、使用LRU等淘汰策略,以及定期清理过期数据来避免缓存膨胀。在实际的业务开发中,推荐缓存中的数据都是从数据库中读取的有时效的数据,这样缓存故障导致数据失效的时候,可以从数据库中重新读取数据,而且缓存中的数据大部分都是热点数据,可以有效的节省存储空间。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 Redis 的过期回调,你可能会遇到一些。以下是一些常见的问题和解决方法: 1. 过期回调不触发:如果设置了过期时间,并且配置了过期回调函数,但回调函数没有被触发,可能是由于以下原因: - Redis 的 keyspace notifications 没有开启。可以通过配置文件或者使用 `CONFIG SET notify-keyspace-events` 命令来进行设置。 - 过期键的回调事件被禁用。可以通过配置文件或者使用 `CONFIG SET notify-keyspace-events` 命令来进行设置。 2. 回调函数执行的时间限制:Redis 对于过期回调函数有一个执行时间限制,默认是 100 毫秒。如果回调函数执行时间超过此限制,可能会被断。为了避免此问题,可以将回调函数的逻辑简化,或者将复杂的处理逻辑转移到其他地方。 3. 回调函数的线程安全性:Redis 的过期回调函数是在主线程运行的,所以要确保回调函数是线程安全的。需要考虑多线程并发访问共享资源时可能出现的竞争条件和数据一致性问题。 4. 回调函数的执行顺序:当多个键同时过期时,无法保证回调函数的执行顺序。如果需要按照某种顺序执行回调函数,可以在回调函数添加额外的逻辑或者使用其他方法来进行控制。 5. 回调函数的效率:过期回调函数在 Redis 主线程执行,可能会影响 Redis 的响应速度。如果回调函数执行时间过长或者频繁触发回调导致性能问题,可以考虑优化回调函数的逻辑或者使用其他解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值