redis使用大概问题链
创始人
2025-05-31 11:32:09
0

雪崩:大量key同时失效 击穿:大量请求的某个key失效 穿透:缓存和数据库都不存在

  • 缓存没有过期时间资源耗尽
    –过期时间

  • 大量数据同时设置缓存,那么会同时失效,此时会击穿数据库 (缓存击穿(巧记:只打穿了缓存))
    –过期时间随机
    –失效后再被请求可在延时一段时间失效

  • 有个数据数据库也被干掉了,大量请求过来后,穿透缓存和数据库(缓存穿透巧记:缓存和数据库都被穿‘透’了)
    –数据库没查到,设置一个短时间过期的‘空的业务数据’到缓存中
    –布隆过滤器

  • 突发性热点缓存重建导致系统压力暴增(例如:冷门商品321上连接大量请求到缓存没有查到,同时去查数据库,又同时设置缓存(缓存重建))
    –提前缓存(但是要提前预知热点数据 难预知、例如热搜)
    –重建缓存时加锁(但是锁中要先查一遍缓存,DCL机制)

String cache = redisUtil.get("xxx:xxx:key");if(Objects.noNull(cache)) {if(EMPTY_CACHE.equals(cache)) {//空业务数据return null;}return JsonUtil.parse(cache);}synchronized(this) {//再次查询缓存,DCL机制String cache = redisUtil.get("xxx:xxx:key");if(Objects.noNull(cache)) {if(EMPTY_CACHE.equals(cache)) {//空业务数据return null;}return JsonUtil.parse(cache);}Object = dataDao.selectForDB(key);if(Objects.noNull(cache)) {redisUtil.set(key, json.tojsonstr(), );} else {//业务空数据redisUtil.set(key, json.tojsonstr(), );}}	
  • 加锁的对象有问题,this一般是对应Service的单例,性能极其低,所以应该以资源id为锁
    –Map对象资源池去做锁(内存泄露问题,jvm级别的)
    –分布式锁setnx

  • 缓存双写不一致
    –设置、更新 缓存数据时,也去加分布式锁(设置说明肯定是查询了没有才设置哦,所以这个就是让查询和更新串行了)

  • 串行性能低,咋搞(一般都是读多写少的)
    –分布式读写锁,不阻塞读线程

相关内容

热门资讯

开放“以债换房”政策,可直接置... “南京网络辟谣”微信公众号6月1日发文称,近日,有“南京二手房零首付李经理”“合肥瑶珺房地产代理有限...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
基于TDesign风格的Bla... 作为一名Web开发人员,开发前端少不了使用JavaScript,而Bla...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
《成都市体育发展条例》6月1日... 新华网成都6月1日电 6月1日,《成都市体育发展条例》(以下简称《条例》)开始实施。成都市体育局局长...
LCD1602液晶显示屏模块资... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
基于微信小程序的小区疫情防控小... 文末联系获取源码 开发语言:Java 框架:ssm JDK版本ÿ...
【AUTOSAR】【通信安全】... 目录 一、概述 二、约束和假设 三、依赖模块 四、功能描述 4.1 开发错误 4.1.1 运行时错误...
2023面试题汇总二 一、CSS面试题 1. 清除浮动的方式有哪些? 为什么要清除浮动?因为浮...