缓存相关(一)

缓存雪崩

缓存雪崩是指,缓存层出现了错误或大批量的key到期,而查询数据量巨大。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

解决方案:

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

缓存击穿

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞 。

解决方案:

1、设置热点数据永远不过期。

2、加互斥锁,互斥锁参考代码如下:

private static Lock lock = new ReentrantLock();

public static String getData(String key) throws InterruptedException{
    //读取缓存数据
    String value = getDataFromRedis(key);
    if(value == null){
        //先获取锁 再从数据库读取数据
        if(lock.tryLock()){
            value = getDataFromMySQL(key);
            if(value != null){
                setDataToRedis(key,value);
            }
            //释放锁
            lock.unlock();
        }else {
            //暂停100ms再去重新获取数据
            Thread.sleep(100);
            value = getData(key);
        }
    }
    return value;
}

缓存穿透

在查询数据时,发现redis中没有,缓存没有命中;于是向持久层数据库查询,发现也没有;于是本次查询失败。在用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

解决方案:

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value设置为key-null,缓存有效时间可以设置短一些。这样可以防止攻击用户反复用同一个id暴力攻击。

ReentrantLock相关

ReentrantLock常常对比着synchronized的区别:

(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。

(2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。

(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。

ReentrantLock一个最主要的就是可以实现公平锁机制。什么叫公平锁呢?也就是在锁上等待时间最长的线程将获得锁的使用权。通俗的理解就是谁排队时间最长谁先执行获取锁。

公平锁:在new一个ReentrantLock的时候参数为true,表明实现公平锁机制

private static Lock lock = new ReentrantLock(true);

非公平锁:随机的获取CPU时间片轮到哪个线程,哪个线程就能获取锁,在new一个ReentrantLock的时候参数为false (默认为false)

private static Lock lock = new ReentrantLock();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值