侧边栏壁纸
博主头像
毕发胖博主等级

沉默会被理解为赞同

  • 累计撰写 8 篇文章
  • 累计创建 0 个标签
  • 累计收到 0 条评论

redis ——缓存雪崩

毕发胖
2022-03-20 / 0 评论 / 0 点赞 / 667 阅读 / 856 字
温馨提示:
本文最后更新于 2022-03-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

缓存雪崩

首先我们先了解一下什么是缓存雪崩:

就是在某一时刻出现大量缓存失效,新的缓存未到达的情况,那么客户端的所有请求都会直接发送到数据库上,因此导致数据库压力过大,如果是高并发场景下,可能会直接导致数据库绷不住了,直接宕机。
正常的请求流程是如下:
正常请求.jpg
缓存失效情况:
更新失效.jpg

解决方案:

1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。虽然能够在一定的程度上缓解了数据库的压力但是与此同时又降低了系统的吞吐量。

        public Users getByUsers(Long id) {
	    	// 1.先查询redis
            String key = this.getClass().getName() + "-" + Thread.currentThread().getStackTrace()
                    [1].getMethodName()
                    + "-id:" + id;
            String userJson = redisService.getString(key);
            if (!StringUtils.isEmpty(userJson)) {
                Users users = JSONObject.parseObject(userJson, Users.class);
                return users;
            }
            Users user = null;
            try {
                lock.lock();
			// 查询db
                user = userMapper.getUser(id);
                redisService.setSet(key, JSONObject.toJSONString(user));
            } catch (Exception e) {
            } finally {
                lock.unlock(); // 释放锁
            }
            return user;
        }

但是加锁排队只是为了减轻数据库的压力,但是治标不治本,如果在在高并发场景下,缓存重建期间,key是锁着的情况下如果让用户一个一个排队,会出现大量等待超时。
解决方案2:

分析用户的操作行为,设置不同的key,不同的过期时间,让缓存失效的时间点均匀一些

0

评论区