Redis八股文
Redis为什么这么快? 基于内存 io 多路复用:一个线程可以管理多个IO网络请求,内置多个API可以监听多个IO请求 单线程架构 为什么是单线程而不是多线程? Redis是内存数据库,性能瓶颈是在内存与网络IO延迟 用单线程极大减少了多线程的上下文切换和锁的竞争 持久化机制 数据结构优化 Redis穿透&击穿&雪崩 穿透 当客户端请求的 key 在 缓存里找不到,而且 数据库里也没有,就会导致每次请求都绕过 Redis 直击数据库 出现的场景: 恶意/异常请求:爬虫、攻击脚本随机构造ID = 99999,但是Redis缓存中没有,导致数据库被频繁打醒 用户传参异常:用户手滑将Id = -1传入,没有击中缓存和数据库 防护措施: 布隆过滤器把所有合法 ID 的集合(或 hash)先“塞”进布隆过滤器;当请求进来先问布隆:“这个 key 可能存在吗?” 优点:大幅削减不可能存在的请求 缺点:有极小误判率,需要定期同步全量数据 缓存空值/占位符 数据库里也没有?那就把 “没有” 这个事实也缓存起来 1234// 查库后发现nullred...
MySQL八股文
存储引擎及架构 数据库的三大范式 第一范式:字段必须是原子性,不能再分 第二范式:每个非主属性必须完全依赖于主键,消除部分依赖 第三范式:非主键之间不能有依赖关系,消除传递依赖 关系型数据库区别 关系型数据库:复杂的数据结构归结为简单二维表格形式 MySQL、Oracle 非关系型数据库:将数据存储为键值对集合,其中键作为唯一标识符 Redis、MongoDB 内部架构及作用 连接器:不同语言与数据库进行交互,如java,php 系统管理和控制工具:涵盖:运维监控、数据维护、性能优化、安全管控四大核心场景 连接层 连接时会优先加载全局权限和数据库级权限 连接过程是一个TCP长连接,MySQL服务器和客户端通讯是“半双工”,只能单方面发送请求,不能同时发送 TCP长连接带来的问题 :占用内存,内存涨的特别快;如何解决? 定期断开长连接 使用Druid会定期检测空闲连接,超过设定时间的连接会被释放 SQL接口:接收用户的SQL命令,并返回用户查询的结果 解析器 在执行语句之前,会解析查询的语言,在过程中会判断语法,将查询字段、表、条件封装到内部的...
RocketMQ八股文
为什么要用MQ? 应用解耦 假设有支付、订单、短信三个服务,当有一笔订单需要调用这三个服务时,需要在代码中写死这三个服务的调用接口,如果需要新增一个新的服务积分服务,又要在代码中新增调用接口,耦合度太高,不利于管理 此时引入RocketMQ,通过发布不同的topic,需要的服务只需要订阅它就可以了,这样一来,生产者不需要知道我需要调用哪些接口,只管发送消息即可。未来再需要新增服务的时候,只需要在这个服务中订阅消息就可以了。扩展性提高,维护成本降低 异步提速 假设生产者向RocketMQ中发送一条用户下单的消息需要 50ms,生产者向数据库中发送一条消息需要 50ms,支付、订单、短信三个服务接收消息后处理需要 200ms 那么用户得到反馈的时间是多少呢? 50ms + 50ms = 100ms ,前端只需要将消息发送成功,数据库消息写入成功后就可以返回了,后端服务异步处理消息就行了,减少用户等待的时间 削峰填谷 在订单高峰期可能达到 10万/s 的qps,使用RocketMQ可以将这些消息存入消息队列中,再通过后端服务依次处理,将高峰期挤压的消息按照匀给其他时间处理,...
SpringBoot八股文
SpringBoot八股文 SpringBoot的项目结构是怎么样的? 说一说Spring框架核心特性有哪些? / 好处有哪些? IOC容器:Spring通过控制反转实现了对象的创建和对象间的依赖关系管理,开发者只需要定义好Bean及其依赖关系,Spring容器就会负责创建和组装这些对象 AOP:面向切面编程,允许开发者横切关注点,例如事务管理、安全控制、日志记录等,可以提高代码的可维护度和可重用性 事务管理:Spring提供了一致的事务管理接口,支持声明式和编程式事务。开发者可以轻松地进行事务管理,而无需关心具体的事务API MVC框架:Spring MVC是一种Web框架,采用了模型-视图-控制器(MVC)框架,它支持灵活的URL到页面控制器的映射 非侵入式设计:它可以使应用程序对框架的依赖最小化 介绍一下IOC 简介:IoC即控制反转的意思,它是一种创建和获取对象的技术思想,依赖注入(DI)是实现这种技术的一种方式。在传统开发过程中,我们需要通过new关键字来创建对象。使用IoC思想开发方式的话,就可以不用new关键字来创建对象,而是...
JVM八股文
JVM模型 JDK:Java Development Kit:Java开发工具包 JRE:Java Runtime Environment:Java运行环境 JVM:Java Virtual Machine Java虚拟机 为什么要引入JVM? JVM是Java虚拟机,支持跨平台运行,一次编译,处处运行,它能识别.class后缀文件,解析它的指令,完成想要的操作 内置GC回收垃圾,不需要手动管理内存 JVM运行时内存共分为 Java虚拟机栈 每个线程都有自己独立的java虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧。可能会抛出StackOverflowError和OutOfMemoryError异常 本地方法栈 使用Native方法服务,可以调用其他语言,比如C++;本地方法执行时也会创建栈帧 程序计数器 用于存储当前线程正在执行的java方法JVM指令地址;如果执行Native,计数器为null 程序计数器的作用,为什么是私有的? Java程序支持多线程一起运行,多个线程一起运行时,cpu会有一个调度器组件给它们分配时间片。比如给线...
JUC八股文
【要图】 线程 并发编程存在的三大问题? 原子性 同一时刻只能有一个线程对数据进行操作。在java中使用了atomic包和synchronized关键字来确保原子性 可见性 一个线程对主内存进行修改,其他线程可以看到。在java中使用synchronized和volatile两个关键字实现 有序性 一个线程观察其他线程的执行顺序,一般无序。在java中用happens-before原则来确保有序性 happens-before:如果 A happens-before B,那么 A 的结果(内存写入)对 B 可见,并且 A 的执行顺序在 B 之前(逻辑上有序)。 线程创建的方式有哪些? 继承Thread类 继承Thread类,重写run()方法; 创建该类实例后,调用start()方法启动线程 优点:编写简单,若需要访问当前线程,无需使用Thread.currentThread()方法,使用this关键字即可获取当前线程;缺点:不能继承其他父类 实现Runnable接口 实现Runnable接口需要重写run()方法,将Runnable对象作为参数传递给Thre...
货柜项目总结
一、参与设计 介绍:我之前做的是一个智能货柜的项目,部署在在商场、小区等场所。该货柜使用的流程是,用户通过扫码确认免密支付后,货柜打开,用户拿完东西后关闭货柜,自动扣减钱 二、核心流程梳理 具体购买流程 用户扫码,后端会对参数进行校验,判断用户是不是在黑名单中;校验成功后,通过加分布式锁将订单落库,再请求到支付宝/微信做一个预约下单,授权预约下单后会给前端发送一个签约的package包,用户同意后,我们会收到支付宝/微信的回调,之后会调用设备服务开门,在开门之前会记录所有货仓的重量,用户卖完东西后,再次记录所有货仓的重量,用这两个做差值得出用户买了什么商品;通过MQ发送消息调用账户服务结算,释放掉分布式锁,在账户服务中会涉及到优惠券、积分、余额的处理,同时这个消息会发送给一个触发补货的服务,这个服务会去查看设备是否需要补货,如果需要,通知调度人员去补货 更具体地流程 数据库表 设备上线 设备服务收到设备登陆服务器的请求,会查看是否有该设备: 如果有该设备:修改设备表的设备状态为在线,更新设备缓存状态,更新设备服务中设备通信信息,更新通信服务中设备、Channel信息 ...
test
$jason = \frac{1}{2}$
食谱
时间 餐次 食材 备注 07:30 早餐 黑咖啡 1杯 香蕉 1根 包子 1个(约80g) 黑咖啡有助于加速新陈代谢,包子少油少盐。 10:30 上午加餐 苹果 1个 快速补充能量,增加纤维。 12:30 午餐 面条(全麦/细面)100g 小炒青菜(青菜100g+橄榄油5g) 空气炸锅去皮鸡腿肉100g 面条换全麦,增加纤维和蛋白。 15:30 下午加餐 无糖酸奶200g 巴旦木10g 提供蛋白和健康脂肪,控制血糖波动。 18:30 晚餐 外面的小炒(选择低油低盐的菜品,如清炒时蔬、豆腐类等) 外面吃时尽量控制油盐量,避免油腻食物。 21:00 夜宵 水果(如苹果或橙子)或一根香蕉 如果晚上饿,可以轻量水果作为夜宵。 喝水 & 运动 全天 ≥ 2 L 水。 训练前 1–2 h 加 ≈ 20 g 碳水(半根香蕉);训练后 30 min 内补 ≈ 20 g 蛋白(酸奶或乳清)。
Java基础
TIPS 数据类型 类型 字节数 范围 举例 byte 1 $-128\sim 127$ ($-2^7\sim 2^7 - 1$) 123 short 2 $-2^{15}\sim 2^{15} - 1$ 12345 int 4 $-2^{31}\sim 2^{31} - 1$ 12345678 long 8 $-2^{63}\sim 2^{63} - 1$ 1234567890123L float(高精度) 4 $-2^{31}\sim 2^{31} - 1$ 1.2F double(高精度) 8 $-2^{63}\sim 2^{63} - 1$ 1.3, 1.3D boolean 1 true/false char 2 ‘A’ 为什么byte的范围为$-2^7\sim 2^7 - 1$? Java中所有整数类型都是使用补码来表示有符号整数 1 byte = 8 bit 8 bit的表示方法:0000 0000,每一位只有0 1,也就是二进制 在字节数范围表示中规定: 第一位如果是0:表示正数 第一位如果是1:表示负数 ...









