我利用十二个周末手写了JAVA五大框架源码!喂饭氏教程免费分享,三天掌握SSM丨

缓存击穿
【问题描述】:
缓存里没数据,但是数据库里面有数据。大批量数据在同一时间时间,在数据过期后突然被大量请求,导致缓存被击穿,糟踏数据库。
【解决办法】:
对超时时间设置为随机,避免同一时间大量数据过期。
缓存穿透
【问题原因】:
假设在一个秒杀系统下,误删了数据库中某一个商品,大量请求在缓存中没有找到数据,这就会去数据库里面找,但是数据库里面也没有,最终导致数据库抗不住压力。这就是缓存穿透,缓存穿透会将所有后端所有存储层都穿透掉。影响:实际数据库中没有数据,却还有大量请求不断涌进来,透缓存,透数据库。
【解决办法】:
对无效的数据在缓存中设置一个空值。当首次请求来时,在数据库中查询到数据则在缓存中缓存真实的值,没有数据放一个空值。
突发性的热点缓存重建导致系统压力暴增问题
【问题原因】:
在电商直播环境下,大V直播间推荐某一款冷门商品,主播一上链接,大量用户访问这个商品,恰巧这个商品不在缓存中,那么就会导致大量数据击穿缓存,糟蹋数据库。
不确定某个商品、或微博热搜在什么时间下,数据量暴增
【解决办法】:
双重检测机制(DCL)。在第一次没有数据时,使用加锁处理重建。使用分布式锁对查询的数据做缓存重建。使用jedisson分布式锁。
并发重建锁优化: hotCacheCreateLock.tryLock(2,TimeUnit.SECONDS);
缓存与数据库双写不一致问题
【问题描述】:
两条线程依次执行数据库余额更新操作,正常情况下,线程要把余额更新成6,线程2再更新成5。但是在高并发复杂的环境下,线程1稍微晚一秒中执行,被线程2先执行完把数据更新成了5,此时线程1在执行跟新则会把5改成6。
【解决办法】:
使用分布式事务锁解决。针对获取数据时和更新时加锁处理,最后使用读写锁优化。针对读多写少的场景进行分离,使读操作可以并行,写操作进行互斥。
redis实现读写锁: redisson.getReadWriteLock();
雪崩问题
【问题描述】:
redis撑死处理十万+数据,在单节点下经受不住突如其来的几十或几百万条请求,即使集群也无法分担压力。由于缓存宕机,导致应用服务一个奔溃。
【解决办法】:
限流。多级缓存架构:jvm进程缓存(缺点1.无法放大量数据 2.数据不一致)。