沈阳哪家网站制作公司比较好,傻瓜使用模板建网站,国家公示企业信息查询,影响网站alexa排名的主要因素有一、缓存穿透指的是查询一个不存在的数据#xff0c;由于缓存中没有对应的值#xff0c;每次请求都要查询数据库#xff0c;容易导致数据库压力过大。 解决方法#xff1a;
使用布隆过滤器等手段可以在请求到达后台处理之前就过滤掉这些不存在的请求#xff0c;避免了对数… 一、缓存穿透指的是查询一个不存在的数据由于缓存中没有对应的值每次请求都要查询数据库容易导致数据库压力过大。 解决方法
使用布隆过滤器等手段可以在请求到达后台处理之前就过滤掉这些不存在的请求避免了对数据库的访问。例如在给定的场景中布隆过滤器用于检查数据是否存在如果不存在则直接返回错误信息而不需要在访问数据库。将查询为空的 key 也缓存起来但是设置一个较短的过期时间防止缓存层被大量无效请求填满。在应用层对请求参数进行校验过滤掉无效的请求。 二、缓存击穿指的是一个热点数据失效后大量并发请求同时访问数据库导致数据库压力过大。 解决方法
在缓存失效时使用互斥锁或分布式锁来保护后端系统的访问只允许一个线程去查询数据库其他线程等待查询结果避免了大量并发请求穿透到后端系统。可以使用热点数据预加载或预热缓存在即将过期的缓存数据失效前提前重新加载避免热点数据因缓存失效而引发击穿问题。
例如redis在高并发下为了避免请求直接打到数据库可以使用双重检查锁的方式进行数据库查询。不设置双重检查的话那在第一个获取锁的线程同步数据库到Redis期间堆积的所有线程都会在获取锁后查询数据库并设置缓存。具体步骤如下
先查 redis 中是否有数据如果 redis 中没有数据使用 synchronized 进行加锁再次查询 redis 中是否有数据如果第3步查询还是没有数据此时再查数据库查询到数据库中的数据后将数据写入到redis中。
代码示例
public String getDataFromDatabase(String key) {// 先查 Redis 中是否有数据String data jedis.get(key);// 第一重检查如果 Redis 中有数据直接返回if (data ! null) {return data;}// 使用双重检查锁的方式避免多线程同时查询数据库if (lock.tryLock()) {try {// 第二重检查再次查询 Redis 中是否有数据data jedis.get(key);if (data ! null) {return data;}// 模拟从数据库中查询数据data fetchDataFromDatabase(key);// 将查询到的数据写入 Redis 中jedis.set(key, data);} finally {// 释放锁lock.unlock();}}return data;}三、缓存雪崩指的是缓存中的大量数据同时失效导致大量请求直接访问数据库造成数据库瞬时压力过大。 解决方法
给缓存数据设置随机的过期时间避免大量缓存同时失效。使用多级缓存架构如主从复制、分布式缓存等减少单点故障风险。引入熔断机制或限流策略当缓存层面发生雪崩时限制对后端系统的请求保护后端系统免受过载。