专栏首页技术人生缓存穿透、缓存击穿、缓存雪崩区别和解决方案【php】

缓存穿透、缓存击穿、缓存雪崩区别和解决方案【php】

一、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

  1. 接口层增加校验,如用户鉴权校验,timestamp的时间差判断,IP和用户ID的禁用逻辑等
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

二、缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:

  1. 设置热点数据永远不过期。
  2. 加互斥锁,互斥锁参考代码如下:(逻辑代码,不可运行)
    protected function getData()
    {   
    ¦   $ret = $this->getRedis($key);
    ¦   if ($ret == null) {
    ¦   ¦   try {
    ¦   ¦   ¦   if (lock.get) {
    ¦   ¦   ¦   ¦   $ret = $this->getMysql($key);
    ¦   ¦   ¦   ¦   if ($ret != null) {
    ¦   ¦   ¦   ¦   ¦   $this->setRedis($key, $ret);
    ¦   ¦   ¦   ¦   }   
    ¦   ¦   ¦   }   
    ¦   ¦   } catch {
    ¦   ¦   ¦   lock.unlock;
    ¦   ¦   }   
    ¦   }   
    ¦   return $ret;
    }

三、缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设置PHP的环境变量,区分PHP的测试环境和正式环境【php】

    env 查看全局环境变量 set 查看所有环境变量 echo $SHLVL 查看单个环境变量 unset name 删除环境变量 针对本次会话有效

    sinnoo
  • GridView滚动列表的顶级用法【flutter20个实例之二】

    SliverGridDelegateWithFixedCrossAxisCount有属性介绍如下:

    sinnoo
  • Linux安装npm/node

    sinnoo
  • 后端服务慢成狗?试试这 7 招!

    优化代码实现是第一位的,特别是一些不合理的复杂实现。如果结合需求能从代码实现的角度,使用更高效的算法或方案实现,进而解决问题,那是最简单有效的。

    Java技术栈
  • 性能设计 - 缓存

    基本上来说,在分布式系统中最耗性能的地方就是最后端的数据库了。一般来说,只要小心维护好,数据库四种操作(select、update、insert 和 delet...

    JAVA日知录
  • Google 出的 Guava 是个什么鬼?

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    纯洁的微笑
  • Guava 源码分析(Cache 原理)

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    爱撸猫的杰
  • Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、...

    大数据技术与架构
  • redis缓存

    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询...

    挑战者
  • 缓存更新的套路

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载到缓存中。然而,这个是逻辑是错误的。

    周三不加班

扫码关注云+社区

领取腾讯云代金券