ArrayList扩容机制
ArrayList扩容机制ArrayList 有三种方式来初始化,构造方法源码如下(JDK8):/**
* 默认初始容量大小
*/
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 默认构造函数,使用初始容量10构造一个空列表(无参数构造)
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
/**
* 带初始容量参数的构造函数。(用户自己指定容量)
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {//初始容量大于0
//创建initialCapacity大小的数组
...
商品防止超卖
商品防止超卖1、商品秒杀超卖在Service里面加上@Transactional事务注解和Lock锁
控制层:Controller@ApiOperation(value="秒杀实现方式——Lock加锁")
@PostMapping("/start/lock")
public Result startLock(long skgId){
try {
log.info("开始秒杀方式一...");
final long userId = (int) (new Random().nextDouble() * (99999 - 10000 + 1)) + 10000;
Result result = secondKillService.startSecondKillByLock(skgId, userId);
if(result != null){
log.info("用户:{}- ...
单点登录
单点登录三种常见方式
使用session广播机制实现 session复制 会导致空间浪费(不在用)
使用cookie + redis实现
使用token实现
cookie + redis
在项目中任何一个模块进行登录,登录之后,把数据放到两个地方
1.1 redis:在key:生成唯一随机值,在value: 用户数据
1.2 cookie:把redis里面生成的key值放到cookie中
访问项目中其他模块时,发送请求带着cookie发送,获取cookie值,拿着cookie做事情
2.1 把cookie获取值,到redis进行查询,根据key进行查询,如果查询到数据就是登录
tokentoken:按照一定规制生成字符串,字符串可以包含用户信息
在项目的某个模块中进行登录,登录之后,按照规则生成字符串,把登录之后的用户包含到字符串里面,把字符串返回
1.1 可以把字符串通过cookie返回
1.2 把字符串通过地址栏返回
再去访问项目其他模块,每次访问都在地址栏带着生成字符串,在访问模块里面获取地址栏字符串,根据字符串获取用户信息,如果可以获取到就是登录 ...
Clash for windows 配置
Clash for windows 配置1、 去下载冲突软件最新版本,下载地址: https://github.com/Fndroid/clash_for_windows_pkg/releases
2、 下载下来直接安装
3、打开页面,默认是英文的
下载汉化包1、 下载汉化包下载汉化包: https://github.com/ender-zhao/Clash-for-Windows_Chinese/releases
2、关闭退出刚刚打开的clash软件,打开clash软件的文件夹,找到resources文件并打开,把刚刚下载的汉化包asar给拖进去替换掉
3、在次打开小猫咪clash软件,就是汉化版的了,对于英文不是很好的同学还是解决了一个不错的问题,当然也有出现汉化后打不开系统代理System Proxy这个按钮的情况,那这个时候只能把Clash文件夹里所有的文件删除,重新下载解压Clash软件,老老实实的用英文版。
内网穿透 frp
内网穿透 frp1、阿里云配置首先到frp的release界面下载适合自己电脑的程序https://github.com/fatedier/frp/releases 可以直接去这个页面下载
也可以通过wget命令下载
wget https://github.com/fatedier/frp/releases/download/v0.32.1/frp_0.32.1_linux_amd64.tar.gz
然后解压
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
然后进入cd到frp_0.32.1_linux_amd64目录,对于服务端的配置可以直接先将frpc和frpc.ini文件删除,之后配置frps.ini
[common]
bind_port = 7000 #与客户端绑定的进行通信的端口
保存后就可以启动服务端了
# 前台启动
./frps -c ./frps.ini
# 后台启动(正常使用后推荐后台启动)
nohup ./frps -c ./frps.ini &
2、frp客户端(实验室服务器)配置首先 ...
Dataway
DatawayDataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具,使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布,一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共享同一个 http 端口,应用无需单独为 Dataway 开辟新的管理端口。
这种内嵌集成方式模式的优点是,可以使得大部分老项目都可以在无侵入的情况下直接应用 Dataway。进而改进老项目的迭代效率,大大减少企业项目研发成本。
Dataway 工具化的提供 DataQL 配置能力。这种研发模式的变革使得,相当多的需求开发场景只需要配置即可完成交付。从而避免了从数据存取到前端接口之间的一系列开发任务,例如:Mapper、BO、VO、DO、DAO、Service、Controller 统统不在需要。
Dataway 是 Hasor 生态中的一员,因此在 Spring 中使用 Dataway 首先要做的就是打通两个生态。根据官方文档中推荐的方式我们将 Hasor 和 Spring Boot 整合起来。 ...
Redis
Redis一、使用场景1、缓存穿透查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,导致每次请求都会查询数据库
1.1 解决方法
缓存空数据,查询返回的数据为空,仍把这个数据缓存
1.1 缺点:消耗内存,可能会发生不一致的问题
布隆过滤器
主要是通过数组来判断的,但是会出现误判
2.1 缺点: 实现复杂,存在误判
2、缓存击穿当给某个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮
2.1 解决方法
互斥锁
强一致,性能差
逻辑过期
高可用,性能优,不能保证数据的绝对一致
3 缓存雪崩指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库,带来巨大的压力
3.1 解决方法
给不同的key的TTL添加随机值
利用Redis集群提高服务的可用性 如:哨兵模式,集群模式
给缓存业务添加降级限流策略 如:nigix或者springcloud gateway
给业务添加多级缓存
4 redis作为 ...
MySQL
MySQL1 优化1.1 在MySQL中,如何定位慢查询?方案一: 开源工具
调式工具:Arthas
运维工具: Prometheus , Skywalking
方案二:MySQL 自带慢日志
慢查询日志记录了所有的执行时间超过指定参数的所有SQL语句的日志
如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
#开启MySQL慢日志开关
slow_query_log = 1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time = 2
配置完成后,通过重启mysql
1.2 SQL语句执行很慢,如何分析?可以采用EXPLAIN或者DESC命令获取MySQL如何执行信息。
2 索引索引( index )是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外,数据库系统还维护着满足特定查找算法的数据结构( B+ 树),这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
mysql主要是是 ...
docker
一、基本操作1、查看镜像——docker images# 查看下载到本地的所有镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 9 days ago 133MB
--------------------------------------------------------------------------------
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像,经过md5方式加密过;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
2、查看所有状态容器——docker ps -adocker ps -a #-a 选项可以显示所有的容器
CONTAINER ID IMAGE COMMAND CREATED ...
热部署
热部署Devtools第一步 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
第二步 添加配置<build>
<finalName>你自己的工程名字</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin&l ...