美文网首页
分布式锁的应用实例

分布式锁的应用实例

作者: 初心myp | 来源:发表于2019-08-20 14:59 被阅读0次

解决缓存击穿问题

当我们将数据放在缓存中,每次查询先访问缓存,如果缓存中有数据,就直接返回数据,如果没有,就去数据库里面查询,查询之后将数据添加到缓存中。但是每次缓存中的数据都会设置过期时间,如果刚刚好数据过期的数据,高并发情况发生了,假如这是有1W的并发量同时访问,那么就会发生这些请求直接访问数据库,给数据库造成一定的压力,甚至数据库服务崩掉,这就是缓存击穿的问题
在高并发下,多线程同时查询同一个资源,如果缓存中没有这个资源,那么这些线程都会去数据库查找,对数据库造成极大压力,缓存失去存在的意义

缓存穿透:在高并发下,多线程同时查询同一个不存在的资源,这个资源数据库里不存在,缓存里肯定也是不存在的,如果这样的话,也是缓存击穿问题

下面我们来写一些伪代码,演示一下:

正常逻辑:
public Object getOrder(Long id){
    //先查询redis
    Order order = redisClient.get(id);
    //redis命中
    if(order != null){
        return order;
    }
    try{
         //查询数据库
        Order order = orderService.getOrderById(id);
        if(order != null){
            //查询到的数据添加到redis
            redisClient.set(id,order);
            return order;
        }
    } catch (Exception e){
            e.printStackTrace();
    }
}

上述代码就有可能出现缓存击穿问题,接下来我们来预防一下,使用我之前写的文章中的redis分布式锁

修改后逻辑:
public Object getOrder(Long id){
    //先查询redis缓存
    Order order = redisClient.get(id);
    //redis命中
    if(order != null){
        return order;
    }
    try{
        //添加redis分布式锁
        redisLock.lock(id);
        //先查询redis缓存
        Order order = redisClient.get(id);
        //redis命中
        if(order != null){
            return order;
        }
         //查询数据库
        Order order = orderService.getOrderById(id);
        if(order != null){
            //查询到的数据添加到redis
            redisClient.set(id,order);
            return order;
        }
    } catch (Exception e){
            e.printStackTrace();
    } finally {
          redisLock.unlock(id);
    }
}

上面的代码就是改造过的,添加了分布式锁。
当缓存中的数据失效之后,如果这是出现大量的并发情况,就可以使用redis分布式锁解决了。因为当缓存数据失效后,多线程并发过来时,第一个请求会获取锁,然后只有一个请求去查询数据库,查询结束后,将数据添加到缓存,这时候释放锁,其他请求获取锁之后,先查询缓存,这是缓存中已经有数据了,就避免了去查询数据库了。这时无论多少的并发量都没关系啦,因为这时就可以从缓存中查询数据了。。。

解决缓存击穿问题可以参考文章
缓存穿透、缓存雪崩、缓存击穿

相关文章

  • 分布式锁的应用实例

    解决缓存击穿问题 当我们将数据放在缓存中,每次查询先访问缓存,如果缓存中有数据,就直接返回数据,如果没有,就去数据...

  • 分布式锁的实例应用

    前篇:Redis+Lua实现分布式锁 场景描述: 更新一个页面信息,首先更新页面在导航中的信息,然后删除页面下所有...

  • 分布式锁实现

    在多实例部署中,当我们需要对实例间作并发控制,那么就涉及分布式锁问题,我们常用的分布式锁实现有基于 Redis /...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • Redisson分布式锁使用即源码解读

    Redisson 提供的分布式锁 使用实例 如果拿到分布式锁的节点宕机,且这个锁正好处于锁住的状态时,会出现锁死的...

  • 锁(2)-- 分布式锁

    前言: 锁分3种:java锁、分布式锁、DB锁 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署...

  • Redis分布式锁使用总结

    Redis分布式锁使用总结 前言 最近因为项目需要进行多实例的协调,使用到了分布式锁,所以对分布式锁的原理、使用等...

  • 分布式锁

    章节 应用场景 分布式锁 分布式锁类型 1 应用场景 分布式系统对共享资源的写操作(update) 需要保证数据的...

  • 分布式锁

    redis 实现分布式锁 redis 是单实例 实现分布式锁需要的很早期命令SETNX,这个命令表示 SET If...

  • 分布式锁

    一、为什么要使用分布式锁 在多实例,负载均衡的情景下,需要使用分布式锁来保证业务不会重复处理 二、分布式锁应该具备...

网友评论

      本文标题:分布式锁的应用实例

      本文链接:https://www.haomeiwen.com/subject/exbwdctx.html