缓存
缓存1.缓存击穿问题
question:热点Key过期/失效,众多请求涌进数据库怎么办
answer:
方案一,在缓存过期前主动更新一遍缓存
方案二,设计分布式锁,只允许一条获取到锁的请求进入数据库更新缓存,其他请求快速失败
方案三,永不过期,设置热点数据永不过期或者过期时间比较长。
2.缓存穿透问题
question:查询数据库和缓存都不存在的数据,对数据库造成压力,怎么解决
answer:
最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。
方案一,缓存无效key/查询请求
方案二,布隆过滤器
3.缓存雪崩解决方案
设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某 ...
慢查询优化
慢查询优化发现一篇有关慢查询优化的宝藏推文,在这里收藏记录起来,以免作者删除copy自程序员鱼皮–https://mp.weixin.qq.com/s/inf0SCxOcCMI2DOyrqfn2A
什么是慢 SQL?先解释一下,慢 SQL 指的是执行时间较长的 SQL 查询或操作。它不是一个固定的时间定义,而是根据具体的应用场景和性能要求来决定。
比如你要从几万条数据中查出某一条数据,超过几百毫秒就已经算是慢 SQL 了;但如果你要向数据库插入几万条数据,可能几十秒都不算是慢 SQL。慢是相对的,没有固定的标准。
某种情况下,也可以将消耗数据库资源过多的 SQL 归纳为慢 SQL,因为它们的危害是一样的:都会增加数据的负载、降低数据库的响应速度,有些慢 SQL 还可能导致数据库的锁被占用,从而影响到整个数据库的性能。
所以一般情况下,我们要定期检查数据库中的慢 SQL。
如何检测分析慢 SQL?“如何检测分析慢 SQL” 也是一道经典的面试题了,对于 MySQL 来说,可以分析 MySQL 自带的慢查询日志、通过 Explain 查看 SQL 的执行计划、通过 Profiling 分析 ...
reentrantlock和sychronized
reentrantlock和sychronized的区别synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁,二者的主要区别有以下 5 个:
用法不同:synchronized 可以用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用于代码块。
获取锁和释放锁的机制不同:synchronized 是自动加锁和释放锁的,而 ReentrantLock 需要手动加锁和释放锁。
锁类型不同:synchronized 是非公平锁,而 ReentrantLock 默认为非公平锁,也可以手动指定为公平锁。
响应中断不同:ReentrantLock 可以响应中断,解决死锁的问题,而 synchronized 不能响应中断。
底层实现不同:synchronized 是 JVM 层面通过监视器实现的,而 ReentrantLock 是基于 AQS 实现的。
什么是AQS
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如Reen ...
限流算法
限流算法首先我们先来看看什么是限流?限流是指在系统面临高并发、大流量请求的情况下,限制新的流量对系统的访问,从而保证系统服务的安全性。
另一种解释:在计算机网络中,限流就是控制网络接口发送或接收请求的速率,它可防止DoS攻击和限制Web爬虫。
那么我们为什么会限流?日常的业务上有类似秒杀活动、双十一大促或者突发新闻等场景,用户的流量突增,后端服务的处理能力是有限的,如果不能处理好突发流量,后端服务很容易就被打垮,导致整个系统崩溃!
亦或是爬虫等不正常流量,我们对外暴露的服务都要以最大恶意去防备我们的调用者。我们不清楚调用者会如何调用我们的服务。假设某个调用者开几十个线程一天二十四小时疯狂调用你的服务,不做啥处理咱服务也算完了。更胜的还有DDos攻击。
接下来一起来看看有哪些限流算法计数限流最简单的限流算法就是计数限流了,例如系统能同时处理100个请求,保存一个计数器,处理了一个请求,计数器加一,一个请求处理完毕之后计数器减一。
每次请求来的时候看看计数器的值,如果超过阈值要么拒绝。
非常的简单粗暴,计数器的值要是存内存中就算单机限流算法。存中心存储里,例如 Redis 中,集群机器访问 ...
JVM内存模型
什么是jvm1.jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。2.jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。3.JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节 码),就可以在多种平台上不加修改地运行。 JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
jdk、jre、jvm是什么关系?1.JRE(Java Runtime Environment),也就是java平台。所有的java程序都要在JRE环境下才能运行。2.JDK(Java Development Kit),是开发者用来编译、调试程序用的开发包。JDK也是JAVA程序需要在JRE上运 行。3.JVM(Java Virtual Machine),是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模 拟各种计算机功能来实现的。 JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。 Java语 ...
ClassLoader+双亲委派模式
ClassLoader+双亲委派模式ClassLoad类加载器概述 ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。
jvm启动的时候,并不会一次性加载所有的class文件,而是在程序的运行中动态的去加载。
通常Java中的.class文件会在以下两种情况被ClassLoader加载到内存中:
调用类构造器
调用类中的静态变量或静态方法
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果 ...
阿里一面
阿里一面round 1:自我介绍大概用了一分钟左右,主要介绍了掌握的技术栈以及自己的大学期间工作室经历
round2:项目经历问了简历上的其中两个项目,做了什么以及有什么亮点(难点),有什么突破(学到了什么)
round3:八股文部分1.知道Java的list、map、set吗?分别说说
2.细说一下list?ArrayList和InkedList的区别?底层代码有没有了解过?
3.JVM内存模型?了解JVM垃圾回收机制吗?
4.了解Java中的线程池吗?为什么要用线程池?怎样实现多线程?
5.MQ消息队列用来干嘛?MQ怎么保证数据的一致性问题?为什么MQ的消息不会丢失?使用MQ的优点还有哪些?
6.Mysql的隔离级别有几种?分别说说。
7.Sentinel是怎么实现限流的?
8.Redis实现分布式锁
9.说说SpringBoot?使用SpringBoot的优点有哪些?
round 4:反问环节这个就不多说了。。
总结,面试官一般会从基础开始切入,答上来了之后会根据你的回答继续追问,这时候往往会问得比较细,有点偏底层。damn!还得继续加油啊。
redis持久化
为什么redis需要持久化
Redis是个基于内存的数据库。那服务一旦宕机,内存中的数据将全部丢失。通常的解决方案是从后端数据库恢复这些数据,但后端数据库有性能瓶颈,如果是大数据量的恢复,1、会对数据库带来巨大的压力,2、数据库的性能不如Redis。导致程序响应慢。所以对Redis来说,实现数据的持久化,避免从后端数据库中恢复数据,是至关重要的。
持久化方案:RDB和AOFRDBRDB 就是 Redis DataBase 的缩写,中文名为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。
手动执行12savebgsave
save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用
bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用b ...
Redis数据类型及基本操作
redis中有五种数据存储类型
string
hash
list
set
sorted_set
string
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
string 类型数据的基本操作
添加/修改数据
1set key value
获取数据
1get key
删除数据
1del key
添加/修改多个数据
1mset key1 value1 key2 value2 …
获取多个数据
1mget key1 key2 …
获取数据字符个数(字符串长度)
1strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
1append key value
string 类型数据的扩展操作
设置数值数据增加指定范围的值
123incr keyincrby key incrementincrbyfloat key increment
设置数值数据减少指定范围的值
...
Seata中四种解决分布式事务的模式
Seata的架构Seata事务管理中有三个重要的角色:
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
整体的架构如图:
Seata基于上述架构提供了四种不同的分布式事务解决方案:
XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
TCC模式:最终一致的分阶段事务模式,有业务侵入
AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
SAGA模式:长事务模式,有业务侵入
无论哪种方案,都离不开TC,也就是事务的协调者。
Seata的四种模式XA模式XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processi ...