zoukankan      html  css  js  c++  java
  • 缓存击穿的解决方法

    摘抄自:https://www.jianshu.com/p/87896241343c

    在平常高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。

    解决办法
    上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。

    其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。

        static Lock reenLock = new ReentrantLock();
        public List<String> getData04() throws InterruptedException {
            List<String> result = new ArrayList<String>();
            // 从缓存读取数据
            result = getDataFromCache();
            if (result.isEmpty()) {
                if (reenLock.tryLock()) {
                    try {
                        System.out.println("我拿到锁了,从DB获取数据库后写入缓存");
                        // 从数据库查询数据
                        result = getDataFromDB();
                        // 将查询到的数据写入缓存
                        setDataToCache(result);
                    } finally {
                        reenLock.unlock();// 释放锁
                    }
    
                } else {
                    result = getDataFromCache();// 先查一下缓存
                    if (result.isEmpty()) {
                        System.out.println("我没拿到锁,缓存也没数据,先小憩一下");
                        Thread.sleep(100);// 小憩一会儿
                        return getData04();// 重试
                    }
                }
            }
            return result;
        }
    
     
     
    2人点赞
     
    redis
     
     
    更多精彩内容下载简书A



    作者:小陈阿飞
    链接:https://www.jianshu.com/p/87896241343c
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    解决安装postgresql安装报An error occurred executing the Microsoft C++ runtime installer.问题
    使用U盘为龙芯笔记本安装操作系统
    年终复盘与展望(2017年)
    年终复盘与展望(2016年)
    Spark log4j 配置
    R语言码农的Scala学习心得
    在集群上运行Spark应用
    通过 Spark R 操作 Hive
    CentOS 6.7 hadoop free版本Spark 1.6安装与使用
    OS X Maven 安装与使用简介
  • 原文地址:https://www.cnblogs.com/shujiying/p/14255146.html
Copyright © 2011-2022 走看看