Redis高并发问题 三大经典问题

  • 三大经典问题

1. 缓存穿透

一旦缓存没有,直接到数据库去查找,如果缓存不大的情况下,无伤大雅,但是当高并发场景下,大量的请求直接穿透缓存直接查询数据库

  • 原因分析
  1.         在数据库中没有相对应的查询结果
  2.         查询结果为空时不对查询进行缓存(这里可以缓存个空值)
  • 如何解决
  1.         对非法请求进行限制
  2.         对结果为空的查询给出默认值

2. 缓存击穿

当一个热点数据的失效时间到了的时候,然后突然有大量的请求涌入,这些请求最终都发送到数据库导致数据库崩溃

  • 原因分析
  1.         热点数据突然失效
  • 如何解决
  1.         双重检测锁
   @Override
    public Double findTurnover() {
        // 获取Redis指定key的操作对象
        BoundValueOperations<Object, Object> ops = redisTemplate.boundValueOps("turnover");
        // 从缓存中读取指定key的value
        Object turnover = ops.get();
        if (turnover == null) {
            synchronized (this){
                System.out.println("redis里面不存在");
                turnover = ops.get();
                if(turnover==null){
                    // 获取当前日期,并格式化
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    turnover = dao.selectTurnover(sdf.format(date));

                    // 将查询结果写入到缓存
                    ops.set(turnover, 10, TimeUnit.SECONDS);
                }
            }
        }

        return (Double) turnover;
    }

使用双重检测锁机制预防缓存击穿 

若缓存中没有该数据,则先从DB中查询,然后再写入到缓存

上一把锁 其实就是把数据库的压力 直接锁到 代码层 

3. 缓存雪崩

对于缓存中的数据 很多都是存在过期时间的,如果大量的缓存的国企时间在同意很短的时间段内几乎同时到大,那么在高并发访问场景下可能会引发DBMS的高并发查询 这样可能会导致DBMS的崩溃,这种情况下称之为缓存雪崩。

  • 原因分析
  1.        大量热点数据突然失效
  • 如何解决
  1.         无法解决只能进行预防
  2.         也可以延长热点数据的过期时间
  3.         要不然可以把热点数据放在分布式系统当中,可以有效的进行缓冲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值