简单了解常用排序算法
冒泡排序时间复杂度: O(n ^ 2)
稳定性:稳定
每次把两个相邻数进行比较,大的那个换到后面
1234567891011121314151617public void bubbleSort(int[] arr) { int length = arr.length; for (int i = 0; i < length - 1; i++) { for (int j = 0; j < length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); } } }}// 元素交换private void swap(int[] arr, int i, int j) { int temp = arr[j]; arr[j] = arr[i]; arr[i] = t ...
简单了解分布式锁
对于分布式锁,我们希望有如下特点资源互斥:能在分布式条件下对资源占用进行限制
死锁:可重入,可超时释放,避免死锁
高性能、高可用:加锁、解锁效率高
安全性:锁只能被锁持有的客户端删除
分布式锁实现方式数据库分布式锁创建一个锁表,其中一个唯一字段存储需要锁的方法或者资源,比如卖票接口,锁住接口或者票的库存
通过唯一字段的insert、delete操作,实现加锁、释放锁
缺点:
锁没有失效时间,可能导致死锁(定时任务扫库)
锁无法重入,同一个线程释放锁之前无法再次获得锁(参考synchronized的偏向锁,加个字段判断是否是本线程)
访问数据库涉及I/O操作,效率较低(考虑使用缓存)
非阻塞操作失败后,需要轮询重试,占用cpu资源
ZooKeeper分布式锁暂时不了解,以后找时间再补充,性能没有Redis分布式锁好
Redis分布式锁主要关注超时释放的死锁问题、以及锁误删的安全性问题
12345加锁业务finally{ 解锁}
Redis单机环境使用redis原生
第一版:setnx
锁没有超时时间,可能会死锁
线程崩溃,可以在finally块 ...
简单了解静态代理和动态代理的区别
什么是代理?我们不直接访问某个对象,而是通过代理对象去访问某个对象,并且可以对功能进行拓展,有个设计模式就叫做代理模式
静态代理我们会有一个代理类来替代 Cook类 访问方法
静态代理可以在不修改目标对象的功能前提下, 能通过代理对象对目标功能扩展;静态代理的不足在于只能对某一个方法拓展,如果实体类增加了方法,需要修改代理类的代码。
组合方式:必须实现接口中的所有方法
继承方式:可以只重写需要增强的方法,但是只有单继承,需要父类不能被final修饰
组合方式1234567891011121314public class ProxyCook implements Cook{ Cook cook; public ProxyCook(Cook cook) { this.cook = cook; } @Override public void cookDinner() { System.out.println("厨师前置动作..."); cook.cookD ...
简单了解高并发、高性能、高可用
参考关于“高性能、高并发、高可用”的问题解决方案 - 知乎 (zhihu.com)
高并发QPS(每秒请求数)
对共享资源并发问题的解决
高可用系统的稳定性(避免服务宕机或者中间件宕机导致系统不可用)
高性能接口的响应时间
系统吞吐量
TPS(每秒事务数)
高可用的系统如何在高并发的条件下实现高性能?1.缓存什么是缓存?
缓存是一种用空间换时间的思想,由于计算机访问数据有局部性,数据被分为两部分,一部分我们称作热点数据、另一部分我们称作冷数据
我们根据需要一般会将热点数据存放在缓存中,减少对数据库的访问,访问内存是比访问磁盘快的
我们常见的缓存,比如redis这类的非关系数据库,CPU的多级缓存,数据库日志的buffer等
缓存分类
本地缓存
我们在单机进程中对数据缓存,适合简单的场景,不需要考虑数据一致性、过期时间、删除策略等问题
分布式缓存
分布式架构下,不同服务器进程代表一个数据分片,对于热点数据的存储我们根据一致性hash算法分配到不同的分片
适合缓存的场景
读多写少
计算量耗时大,实时性低(不需要经常更新)
不适合缓存的场景
写多读少
没有热点数据
对数据一致性 ...
Spring的bean的几种声明方式
组件声明@Component
@Controller
@Service
@Repository
配置类@Configuration + @Bean
@ConponentScan用来搜索配置了@Conponent的类,通常和@Configuration配合使用
RocketMQ整合SpringBoot快速使用
快速使用1.pom添加依赖
12345<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.3</version></dependency>
2.yml添加配置
version 2.2.0以上才是这么配置
1234rocketmq: name-server: ${serverip}:9876 producer: group: message-producer-group
3.编写Producer
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647@SpringBootTest(classes = RocketMQApplication ...
如何学习一个新东西
这个东西我们把它称作 x 吧
学东西切记走马观花,不是越快越好,在你学过一遍之后,一定要及时的输出(笔记或者是小demo),建议列一个思维导图,方便快速回忆起 x 的一些总体框架,具体细节可以看笔记
基本步骤
1.我们需要了解这个东西的概念,是用来干嘛的,有什么特性,有没有同类别的产品
2.快速上手,我们需要学习一些 x 的基本用法,可以做一些小 demo
3.深入了解当中的一些功能,它的底层源码是如何实现这个功能的,一般会涉及到一些设计模式
4.融会贯通,这一步是自然而然随时间的累计会达成的
最后,加油!!!
简单了解ArrayList和LinkedList
ListArrayList和LinkedList本质上的区别是数组和链表之间的增删改查的区别,ArrayList多一个扩容机制而已
ArrayList底层是数组
add()先判断是否需要扩容
再插入
grow()1.5倍扩容,如果初始为0,那么扩容到1;如果初始为1,那么扩容到2
new一个新的数组,Arrays.copyof() 将旧的数组copy过去
remove()检查位置是否合法,然后删除,需要调用native方法移动数组元素
get()根据下标直接返回元素
LinkedList底层是双向链表,一头头节点,一个尾节点
add()尾插法插入新的节点
remove()拿到待删除节点的前后节点,进行双向链表那样的删除
get()会用二分法先优化一下,索引位置和链表长度/2先比对一下,然后在左半边遍历还是右半边遍历
Nginx
Nginx是什么?
Nginx是一个轻量级/高性能的反向代理Web服务器,它的主要功能就是反向代理、负载均衡、配置SSL证书、防盗链、解决跨域问题、缓存、限流、动静资源分离等等。
区别正向代理和反向代理
正向代理:比如VPN,也就是翻墙(防火墙),比如Google限制了中国的ip的访问,我们就需要把请求发到代理客户端的服务器上,
再由代理服务器向真正的目标服务器转发请求
反向代理:比如我们访问www.baidu.com这个代理服务器的域名,再转发到真正工作的服务器(可能很多台)
总的来说,正向代理代理的是客户端,反向代理代理的是服务端
nginx配置文件的编写http有很多server
server有很多location
一个server可以理解为一个服务
1234567891011121314151617181920212223242526272829303132#1.全局配置------------------------------------------------------------------------... #events ...
cookie、session、token区别
参考:一文讲透Token与Cookie、Session的区别 - 知乎 (zhihu.com)
cookie由于 HTTP 的无状态,引入了 cookie,是通信双方用来传递信息的,保存在client
session对用户身份的认证机制
cookie是实现session的一种方式,保存在server
如果不能用cookie(比如跨域),那么sessionId无法用cookie传递
什么是跨域?
答:跨域就违反了同源策略,请求了不同的IP或者端口的资源,导致跨域
同源策略:浏览器只能请求 相同协议、IP、端口的资源
token对用户身份的认证机制
保存在client,和seesion的校验机制不一样
解决跨域不能共享 Cookie 的问题和 CSRF 攻击,不然用cookie包装sessionId也一样效果
JWT是token的一种实现方式
header:指定了签名算法
payload:可以指定用户 id,过期时间等非敏感数据
Signature: 签名,server 根据 header 知道它该用哪种签名算法,再用密钥根据此签名算法对 head + payload 生成签名,这样一个 ...