如何把Bean塞到Spring容器
如何把Bean塞到Spring容器1. 定义接口12345public interface IUserDao { String queryUserInfo();}
先定义一个类似 DAO 的接口,基本这样的接口在使用 MyBatis 时还是非常常见的。后面我们会对这个接口做代理和注册。
2. 类代理实现12345678ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Class<?>[] classes = {IUserDao.class}; InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName();IUserDao userDao = (IUserDao) Proxy.newProxyInstance(classLoader, classes, handler); String res = u ...
docker使用与配置
Docker 环境配置
官网:https://www.docker.com - Mac、Windows、Linux
介绍:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。总之它加快构建、共享和运行现代应用程序的速度。
一、基础安装1. 查看系统的内核版本1uname -r
14.18.0-80.11.2.el8_0.x86_64
uname -r
x86 64位系统,如果是32位是不能安装 docker 的
2. yum 更新到最新版本1sudo yum update
1234Last metadata expiration check: 1:15:10 ago on Sat 27 Nov 2021 04:22:53 PM CST.Dependencies resolved.Nothing to do.Complete!
sudo yum update
看到显示 Complete 就 ...
如何安装和使用 Zsh
在命令行世界中,Zsh(Z Shell)是一个备受推崇的替代品,它提供了比默认的 Bash shell 更多的功能和定制选项。Zsh具有强大的自动补全、语法高亮、主题定制等特性,让命令行体验更加愉快和高效。本篇博客将介绍如何安装和使用 Zsh,以及一些常用的定制技巧。
安装 Zsh
在 macOS 上安装macOS 用户可以使用 Homebrew 进行安装:
1brew install zsh
在 Linux 上安装
大多数 Linux 发行版都提供了 Zsh 的包管理安装方式。以 Ubuntu 为例:
1sudo apt install zsh
切换默认 Shell安装完成后,你需要将 Zsh 设置为默认的 Shell。运行以下命令:
1chsh -s $(which zsh)
然后注销并重新登录,使更改生效。
配置 ZshZsh 的配置文件位于 ~/.zshrc。你可以编辑这个文件来定制 Zsh 的行为。
主题定制Zsh 提供了许多主题可以选择,你可以在 .zshrc 文件中设置 ZSH_THEME 变量来改变主题。一些流行的主题有:
agnoster: ...
gitclone指定文件夹
gitclone指定文件夹Git Sparse CheckoutGit Sparse Checkout 是一个允许你只检出部分仓库内容的功能。这在你需要仓库的某一部分时非常有用,比如一个大型仓库,但你只需要其中的一小部分。
用法
启用 Sparse Checkout:
1git config core.sparsecheckout true
定义要检出的文件/文件夹列表:
123Copy codeecho "path/to/directory/" >> .git/info/sparse-checkoutecho "path/to/file.txt" >> .git/info/sparse-checkout
你可以通过编辑 .git/info/sparse-checkout 文件来指定要检出的路径。每一行都是一个相对于仓库根目录的路径。
更新工作区:
12git checkout master这个命令将会根据 .git/info/sparse-checkout 文件中指定的路径,更新 ...
页面置换算法
页面置换算法最佳页面置换算法(OPT)置换在「未来」最长时间不访问的页面。该算法实现需要计算内存中每个逻辑页面的下次访问时间然后比较,选择未来最长时间不访问的页面
先进先出置换算法(FIFO)选择在内存驻留时间很长的页面进行中置换
最近最久未使用的置换算法(LRU)时钟页面置换算法(Lock)把所有页面都保存在一个类似钟面的环形链表中,表针指向最老的页面。当发生缺页中断时,算法首先检查表针指向的页面:
如果它的访问位是 0 就淘汰该页面并把新页插入这个位置,然后把表针前移一个位置
如果访问位是 1 就清除访问位,并把表针前移一个位置,重复这个过程直到找到了一个访问位为 0 的页面为止
最不常用置换算法(LFU)当发生缺页中断时,选择「访问次数」最少的那个页面并将其淘汰
X层网络模型
TCP/IP四层网络模型:应用HTTP/传输TCP UDP/网络IP/网络接口ARP RARP
ARP:通过IP找MAC地址
RARP:通过网关server的ARP表/缓存上请求IP地址
IP:将数据包从源设备传递到目标设备,建立网络连接
OSI七层:应用/表示/会话/传输/网络/数据链路/物理
假设客户端有多个网卡,就会有多个 IP 地址,那 IP 头的源地址应该选择哪个 IP ?
通过路由表(route -n命令),让目的IP地址和每一条目的子网掩码与,如果与Destination IP相同,就将该网卡的IP作为源地址IP。否则走默认网关发送给路由器,目的子网掩码就是路由器IP地址。
TCP重传、滑动窗口、流量控制、拥塞控制
TCP重传、滑动窗口、流量控制、拥塞控制TCP重传机制1、超时重传:数据包丢/ACK丢时就会触发超时重传。
2、快速重传:解决超时重发的时间等待。当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。(问题:重传时是重传一个还是重传所有)
3、SACK:选择性确认。在TCP头「选项」字段里加个 SACK ,它可以将已收到的数据信息发送给「发送方」,这样发送方就可以知道哪些数据收到哪些数据没收,只重传丢失的数据
4、D-SACK:用SACK告诉「发送方」有哪些数据被重复接收(可让发送方知道是发出去的包丢了还是接收方回应 ACK 丢了;可知道是不是发送方的包被网络延迟了;可知道网络中是不是把发送方的包给复制了)
滑动窗口发一次数据等一个ACK,包的往返时间越长通信效率越低。可通过指定窗口大小,在设置窗口大小内无需等待ACK而继续发送数据。
流量控制如果一直无脑发数据但对方处理不来,就导致触发重发机制从而导致网络流量的无端浪费。TCP 提供一种机制让「发送方」根据「接收方」的实际接收能力控制发送的数据量,通过让接收方指明希望从发送方接收的数据大小(窗口大小)来进行 ...
TCP故障场景
TCP故障场景TCP连接后一端断电和进程崩溃有什么区别客户端进程崩溃:内核会发送 FIN 与服务端进行四次挥手
客户端主机宕机:(服务端会发送数据)服务端触发超时重传,当重传总间隔时长达到一定阈值后断开 TCP 连接;(服务端不会发送数据)[开启TCP keepalive机制] 服务端在一段时间没有进行数据交互时触发 TCP keepalive 探测对方是否存在,对方已消亡则断开自身TCP连接 [没开] 服务端TCP连接会一直存在且一直保持在 ESTABLISHED已建立状态
拔网线后TCP连接是否存在?有数据传输:客户端拔网线后如果服务端发送数据报文,如果在服务端重传次数没有达到最大之前客户端就插回了网线,那么双方原本的 TCP 连接还能正常存在;否则服务端就会断开 TCP 连接,等客户端插回网线后向服务端发数据,因为服务端已断开与客户端相同四元组的 TCP 连接,所以就会回 RST 报文,客户端收到后就会断开TCP连接
无数据传输:如果双方都没开 TCP keepalive,那么客户端拔网线后如果客户端一直不插回网线,客户端和服务端的TCP连接状态将会一直保持存在;如果双方都开启了 ...
count性能
count性能counit(*) = count(1) > count(主键字段) > count(字段)
count(1)、 count(*)、 count(主键字段)执行时,如果表里存在二级索引,优化器就会选择二级索引进行扫描。
所以,如果要执行 count(1)、 count(*)、 count(主键字段) 时,尽量在数据表上建立二级索引,这样优化器会自动采用 key_len 最小的二级索引进行扫描,相比于扫描主键索引效率会高些。
不要使用 count(字段) 来统计记录个数:效率最差,会采用全表扫描的方式来统计。如果你非要统计表中该字段不为NULL的记录个数,建议给这个字段建一个二级索引。
MySQL执行一条update语句中间经历了什么
执行一条update语句中间经历了什么 UPDATE t_user SET name = 'xiaolin' WHERE id = 1;
执行器负责具体执行,调用存储引擎接口,通过主键索引树搜索获取id=1这一行记录:
如果 id=1 这一行所在的数据页本来就在 buffer pool 中,就直接返回给执行器更新;
如果记录不在 buffer pool,将数据页从磁盘读入到 buffer pool,返回记录给执行器。
执行器得到聚簇索引记录后,会看一下更新前记录和更新后记录是否一样:
如果一样的话就不进行后续更新流程;
如果不一样的话就把更新前的记录和更新后的记录都当作参数传给 InnoDB 层,让 InnoDB 真正的执行更新记录的操作;
开启事务, InnoDB层更新记录前,首先要记录相应的 undo log,因为这是更新操作,需要把被更新的列的旧值记下来,也就是要生成一条 undo log,undo log 会写入 Buffer Pool 中的 Undo 页面,不过在内存修改该 Undo 页面后,需要记录对应的 redo log。
...