Redis常见问题(缓存穿透、热key)

23 篇文章 0 订阅
10 篇文章 0 订阅

Redis缓存击穿问题(热key问题)

场景

key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个key在一台Redis服务器上,一台Redis服务器扛不住这么多请求。需要考虑一个问题:缓存被“击穿”的问题。

实际场景

实际场景:大促时,访问量暴增,很多请求都需要请求一个服务开关的 key ,这个key本来在数据库里,但是为了保证速度,将这个 key 放在了Redis中。(这个 key 相当于是一个配置,如果有配置中心,应该放在配置中心,当时是把配置放在了数据库里)

因为有几十万的请求去一台redis服务器上的这个特定 key ,导致Redis 服务器挂掉,请求又打到数据库,之后数据库也挂掉。

这个key就是热key,最终解决的方式是:通过Zookeeper建立了一个统一的配置中心,将 key 的配置拉到本地缓存中,这样大促时,就不会同时有大量请求打到一台Redis服务器上。

解决办法

解决热key的方法:

  1. 二级缓存,就是将把热key加载到系统的JVM中,存在HashMap中,成为一个本地缓存。
  2. 备份热key,把这个key,在多个redis上都存一份,不要让key走到同一台redis上。

排查办法

排查热key的方法:

  1. 人为预测。
  2. 系统估算。

人为预测

凭借业务经验,进行预估哪些是热key。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。缺点很明显,并非所有业务都能预估出哪些key是热key。

系统估算

系统在操作redis之时,进行数据统计。可以加入一行代码,打日志来判断,或者是用Redis的命令。

Redis缓存穿透问题

场景

缓存穿透,就是如果从数据库中查出的是null,存入Redis的就也是null,然后如果有人不停的查,就相当于是不停的查数据库,(因为是null,所以跳过了或者是透过了Redis),请求的多了可能就把数据库弄崩了。

解决办法

解决的办法,就是在查询数据库后,判断一下,如果为null,也存进去,赋值空集合。(空集合不是null)
可以设置这个key的存活时间短一点。

List<Coupon> list = null;
//加缓存
String couponCacheKey = TIME_LIMIT_LIST_KEY_DAO ;
if (xzCacheUtil.getString(couponCacheKey) != null) {
    //获取list,并将str转换为对象
    list = JSON.parseArray(xzCacheUtil.getString(couponCacheKey), Coupon.class);
}
else{
    //如果不存在,重新查询并存入缓存
    lList = Dao.queryInfo();
    if(list == null){
        list = new ArrayList<>();
    }
    xzCacheUtil.setStringEx(couponCacheKey, JSON.toJSONString(list), 5L, TimeUnit.MINUTES);
}

Redis缓存雪崩问题

场景

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决办法

一般是采取不同分类 key,缓存不同周期。在同一分类中的 key,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门的key缓存时间长一些,冷门的key缓存时间短一些,也能节省缓存服务的资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 缓存击穿、穿透、雪崩是三个常见缓存问题: 1. 缓存击穿:指一个非常门的 key,在缓存过期的一刻同时有大量的并发请求,这些请求发现缓存过期一般会从后端数据库中加载数据并写入缓存,这时候大并发的请求可能会直接“穿透缓存层,直接请求到数据库,导致数据库压力过大,出现宕机等情况。 2. 缓存穿透:指查询一个不存在的 key,由于缓存中没有数据,所以每次请求都会穿透缓存层,请求到数据库,这同样会导致数据库压力过大,出现宕机等情况。 3. 缓存雪崩:指在缓存过期的一刻,大量的请求涌进来,这些请求发现缓存过期一般会从后端数据库中加载数据并写入缓存,如果此时缓存层和数据库层的压力过大,很可能导致缓存层和数据库层同时宕机,整个系统不可用。 为了避免这些问题,可以采取以下措施: 1. 对于缓存击穿,可以设置点数据永不过期或者加锁,以保证在缓存失效期间只有一个请求去查询数据库。 2. 对于缓存穿透,可以使用布隆过滤器过滤掉不存在的 key 请求,或者设置不存在的 key 对应的 value 为一个默认值,以避免频繁查询数据库。 3. 对于缓存雪崩,可以采用分布式缓存架构,将缓存层和数据库层分开部署在不同的服务器上,以避免单点故障。同时,可以设置缓存失效时间随机化,避免缓存同时失效,还可以设置熔断机制,当缓存层出现异常时,自动切换到数据库层查询数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值