庆阳网站建设报价,网上申请店铺开网店的流程,wordpress acf使用,wordpress altair目录 引出信号量Semaphore #xff1f;Redis冲冲冲——缓存三兄弟#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出
Java多线程——信号量Semaphore是啥 信号量Semaphore #xff1f;
Semaphore 通常我们叫它信号量#xff0c; 可以用来控制同时访问特… 目录 引出信号量Semaphore Redis冲冲冲——缓存三兄弟缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出
Java多线程——信号量Semaphore是啥 信号量Semaphore
Semaphore 通常我们叫它信号量 可以用来控制同时访问特定资源的线程数量通过协调各个线程以保证合理的使用资源。线程限流如连接池、停车场。
public class App11 {public static void main(String[] args) throws InterruptedException {//1. 创建信号量设置并发线程数允许最大并发线程数是3Semaphore semaphore new Semaphore(3);//2. 循环创建6个线程会看到每次执行3个线程for (int i 0; i 6; i) {new Thread(() - {try {//3. 获取许可在达到限制并发线程数之前将可以正常执行线程否则要等待其他线程释放许可semaphore.acquire();System.out.println(Thread.currentThread().getName() :进入停车场);TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName() :离开停车场);} catch (InterruptedException e) {e.printStackTrace();} finally {//4. 释放许可semaphore.release();}}, 车辆 i).start();}}
}在上述示例中Semaphore 用于限制同时可以获取许可的线程数量。每个线程在执行前通过 semaphore.acquire() 获取一个许可执行后通过 semaphore.release() 释放许可。这样最多只有指定数量的线程可以同时访问资源其他线程需要等待。
Redis冲冲冲——缓存三兄弟缓存击穿、穿透、雪崩
缓存击穿 缓存击穿redis中没有但是数据库有 顺序先查缓存判断缓存是否存在如果缓存存在直接返回数据如果缓存不存在則查询数据库将数据库的数据存入到缓存 解决方案将热点数据设置过期时间长一点针对数据库的热点访问方法上分布式锁
缓存穿透 缓存穿透redis中没有数据库也没有 解决方案
1将不存在的key在redis设置值为null
2使用布隆过滤器;
原理https://zhuanlan.zhihu.com/p/616911933 布隆过滤器
如果确认key不存在于redis中那么就一定不存在
它说key存在就有可能存在也可能不存在 误差 布隆过滤器 1、根据配置类中的 key的数量 误差率计算位图数组【二维数组】 2、通过布隆过滤器存放key的时候会计算出需要多少个hash函数由hash函数算出多少个位图位置需要设定为1 3、查询时根据对应的hash函数判断对应的位置值是否都为1如果有位置为0则表示key一定不存在于该redis服务器中如果全部位置都为1则表示key可能存在于redis服务器中 缓存雪崩 缓存雪崩 Redis的缓存雪崩是指当Redis中大量缓存数据同时失效或者被清空时大量的请求会直接打到数据库上导致数据库瞬时压力过大甚至宕机的情况。
造成缓存雪崩的原因主要有两个
1.相同的过期时间当Redis中大量的缓存数据设置相同的过期时间时这些数据很可能会在同一时间点同时失效导致大量请求直接打到数据库上。
2.缓存集中失效当服务器重启、网络故障等因素导致Redis服务不可用且缓存数据没有自动进行容错处理当服务恢复时大量的数据同时被重新加载到缓存中也会导致大量请求直接打到数据库上。
预防缓存雪崩的方法主要有以下几种
1.设置不同的过期时间可以将缓存数据的过期时间分散开避免大量缓存数据在同一时间点失效。
2.使用加锁可以将所有请求都先进行加锁操作当某个请求去查询数据库时如果还没有加载到缓存中则只让单个线程去执行加载操作其他线程等待该线程完成后再次进行判断避免瞬间都去访问数据库从而引起雪崩。
3.提前加载预热在系统低峰期可以提前将部分热点数据加载到缓存中这样可以避免在高峰期缓存数据失效时全部打到数据库上。
4.使用多级缓存可以在Redis缓存之上再使用一层缓存例如本地缓存等当Redis缓存失效时还能够从本地缓存中获取数据避免直接打到数据库上。 本地缓存ehcache oscache spring自带缓存 持久层框架的缓存 总结
Java多线程——信号量Semaphore是啥