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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    「CSP-S 2019」树的重心「重心」
    「SDOI2017」天才黑客「优化建图最短路」
    「NOI Online Round2」 题解
    Qt 自定义序列化
    Android 定制化apk生成
    gradle上传jar包到maven公共仓库
    JAVA 插入注解处理器
    使用docker安装gitlab
    数据库递归树形查询优化
    JDBCTemplate使用
  • 原文地址:https://www.cnblogs.com/shujiying/p/14255146.html
Copyright © 2011-2022 走看看