杂项8

简介: 缓存三剑客(穿透、击穿、雪崩)解析及解决方案:穿透指请求数据在Redis和数据库均不存在,可通过校验、空值缓存、布隆过滤器应对;击穿针对热点数据失效,可用互斥锁或永不过期策略;雪崩因大量缓存同时失效,可采用随机过期、集群部署、降级机制缓解。

缓存三剑客:本质:导致大量请求直达数据库,数据库压力骤增(可理解为:redis:货架,数据库:仓库)

穿透:redis和数据库中都不存在(货架和仓库都没有),(有点类似攻击,请求查询不存在的信息,等于忙碌之后没有结果)

解决方案:

校验(先校验,在访问,在redis之前加一层过滤网)针对“格式 / 规则错误的请求”(驴头不对马嘴)

空值缓存(第一次发现没有,就设置空值(下次直接redis返回空值),并设置有效期(避免后续真的增加相应的数据)),

布隆过滤器(类似一个白名单,先查询白名单,有去访问redis)拦截:数据本身不存在的请求(合规)

击穿:主要针对热点数据,redis中没有,数据库中有(货架没有仓库有)

解决方案:锁(只放一个线程进行访问),永不过期(不设置过期时间)

雪崩:过期时间一致,或者redis宕机,

解决方案:随即过期(避免同时过期),集群(就是把redis在细分,解决的是rdis宕机),降级(丟车保帅,维持核心)

id自增实现

  • 单库单表:优先用数据库自增(MySQL AUTO_INCREMENT),简单高效。
  • 分布式系统:推荐雪花算法(性能好)或 Redis INCR(实现简单)。
  • 特殊需求:若需自定义规则(如包含业务标识),可在自增基础上拼接前缀(如 ORDER_1001)。

private RedisTemplate<Object, Object> redisTemplate;与private RedisTemplate redisTemplate;没有区别只是一个规定了泛型一个没有规定

spring事务和底层数据库的关系

spring事务相当于是个管理者,底层数据库更相当于是一个执行者

spring一般有

传播行为

事务失效

mysql有:

特性:ACID(原子性,持久性,隔离性,一致性)

事务的隔离机制:

读未提交

读已提交

可重复读

串行化

Spring 事务本身不直接实现 ACID,但它通过有效管理支持 ACID 的数据库事务,让开发者在使用时 “感知到 ACID 特性的存在”。ACID 的核心实现者始终是数据库。

针对配置类中的一些信息(yml)

  • Spring Boot 会自动读取 yml 配置,无需手动加载。
  • 简单配置用 @Value 更方便;复杂配置用配置类更规范。
  • 配置类的核心作用是 “结构化管理配置”,而非 “让配置被读取”(读取本身是 Spring 自动完成的)。
@Service
public class MyService {
    // 直接用@Value读取yml中的配置
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.port}")
    private Integer port;
    
    // 使用这些配置...
}
方式二:
yml文中的配置信息:
user:
    name: "张三"
    age: 20
配置类
@Data
@Configuration
@ConfigurationProperties(prefix = "baidu")
public class BaiduAIProperties {
    private String apikey;
    private String qianfanModel;
}
通过配置类调用yml中的配置信息

定时任务有点类似于aop,单独调用(放在单独的job任务中)

@Component("contractJob")
@Slf4j 
public class ContractJob {
    @Autowired private IContractService contractService;
    public void updateContractStatusJob() { 
        contractService.updateContractStatus(); //需要设置定时任务的方法
        log.info("定时更新合同状态成功!"); } }

建造者模式:

使用@build(lombok的注解),首先@NoArgsConstructor@AllArgsConstructor(只能生成全参和无参构造器,少参数的必须用空值替代

import lombok.Builder;
// @Builder: 自动生成建造者模式相关代码
@Builder
public class User {
    // @NonNull: 标记为必选参数,会自动生成非空校验  可有可无
    @NonNull
    private String id;          // 必选:用户ID
    @NonNull
    private String username;    // 必选:用户名
    private int age;            // 可选:年龄,默认0
    private String email;       // 可选:邮箱,默认null
    private String address;     // 可选:地址,默认null
}
public class Main {
    public static void main(String[] args) {
        // 1. 创建包含所有属性的 User 对象
        User user1 = User.builder()
                .id("1001")
                .username("张三")
                .age(25)
                .email("zhangsan@example.com")
                .address("北京市海淀区")
                .build();
        // 2. 创建只包含必选属性的 User 对象(可选属性用默认值)
        User user2 = User.builder()
                .id("1002")
                .username("李四")
                // 不设置 age、email、address,使用默认值
                .build();
    }
}
使用@NoArgsConstructor 和 @AllArgsConstructor则是要么全参要么是无参

JSONObject jsonObject = JSONUtil.parseObj(shadow.get(0).getReported().getProperties());理解下,一般在不知类型的话,可以使用转化为JSONObject,可以调用相应的方法进行操作,JSONObject是增强版map

相关文章
|
16天前
|
存储 SQL 缓存
spring基础2
本文介绍了 MyBatis 动态 SQL 的执行原理及常用标签,AOP 的实现原理与应用场景,Spring 的三级缓存机制及其在解决循环依赖中的作用,以及事务传播行为及其使用场景,帮助理解 Java 开发中的核心概念与实现机制。
|
17天前
|
SQL XML JSON
在了解三层架构
该文档详细介绍了在Java开发中,如何使用注解定义Mapper接口并实现数据库操作,包括SQL语句的编写与字段映射处理。同时涵盖了Service层的接口与实现类的结构,以及Controller层的请求处理方式,涉及RESTful API设计、参数绑定、数据传递与响应封装等内容,适用于基于Spring框架的Web应用开发。
|
16天前
|
存储 JavaScript 前端开发
初始前端1
本文介绍了 Vue 组合式开发中使用 `ref` 实现响应式数据的方法,强调不依赖 `this`。内容包括创建 `.vue` 文件的模板结构、使用 `ref` 定义响应式变量(如 `count2.value`)与非响应式变量(如 `count3`)的区别,以及如何在模板中绑定数据。同时通过表格对比了 `ref` 在 JavaScript 和模板中的使用方式,指出在 JS 中需用 `.value` 操作数据,而在模板中可直接访问。最后以生活化的类比解释 `ref` 的作用,帮助开发者更好地理解响应式原理。
|
16天前
|
存储 安全 Java
java常识2
本内容介绍了并发编程中的核心概念与实现机制,包括悲观锁与乐观锁的原理及应用、Java中的synchronized与ReentrantLock的区别、线程池的参数配置、线程创建方式、Lambda表达式的特性、反射机制及其应用场景。内容涵盖了数据库锁、第三方中间件锁、JUC并发包中的常用工具类,以及BIO、NIO、AIO的基本原理和使用场景,适合对Java并发编程有深入学习需求的开发者参考。
|
15天前
|
消息中间件 存储 安全
初始kafka
Kafka因高吞吐量被广泛使用,适合处理大量用户行为数据,支持实时推荐和数据展示。其优势包括提升响应速度、故障隔离、低耦合、流量削峰等。但也有架构复杂、依赖Broker等缺点。为避免消息丢失,可通过同步/异步发送、重试机制、设置ACK确认级别、副本机制及手动提交offset等方式保障消息可靠性。
|
15天前
|
Java Nacos Sentinel
了解微服务
本文对比了微服务与单体架构的优缺点,指出单体架构适合小规模系统,开发部署简单,而微服务适合复杂系统,具备良好的扩展性和灵活性。同时介绍了Spring Cloud相关组件如Nacos、OpenFeign、Sentinel的原理与应用,以及微服务中的熔断、降级、限流机制和AT模式的工作原理。
|
10天前
|
存储 JSON 数据建模
数据建模怎么做?一文讲清数据建模全流程
本文深入解析了数据建模的全流程,聚焦如何将模糊的业务需求转化为可落地的数据模型,涵盖需求分析、模型设计、实施落地与迭代优化四大核心环节,帮助数据团队提升建模效率与模型实用性。
|
2月前
|
人工智能 Java 数据库连接
Mybatis执行流程
本文详细分析了 MyBatis 的执行流程,介绍了其核心组件如 SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession 的作用与实现原理,并通过源码解析了 SQL 语句的执行过程,包括动态代理、缓存机制及数据库查询的实现,帮助读者深入理解 MyBatis 的内部工作机制。
Mybatis执行流程
|
SQL 存储 缓存
Mybatis的一级缓存,二级缓存过期时间分析
Mybatis的一级缓存,二级缓存过期时间分析
825 0
|
19天前
|
SQL Java 数据库连接
Mybatis的批处理工具:MybatisBatchUtils功能全解
总而言之,MybatisBatchUtils 是 Mybatis 的一款强大工具,可以显著提高批量数据处理的效率,并确保事务的安全性。通过简化 API 的设计,使得开发者能够易于上手并利用 Mybatis 进行高效的数据库操作。正确使用 MybatisBatchUtils,必然能够在大数据量的场景下,给你的应用性能带来质的飞跃。
199 0