hexo butterfly 实验室
分栏写作功能Tabs
移植於next主題
预设标签页,默认序号命名
{% tabs 标签前缀名, 2 %}
<!-- tab -->
**This is Tab 1 的内容.**
<!-- endtab -->
<!-- tab -->
**This is Tab 2 的内容.**
<!-- endtab -->
<!-- tab -->
**This is Tab 3.**
<!-- endtab -->
{% endtabs %}
标签前缀名 1标签前缀名 2标签前缀名 3This is Tab 1 的内容.This is Tab 2 的内容.This is Tab 3.
非预设,自定义标签名 可以是fafa符号!(不使用前缀名)
{% tabs 前缀名失效 %}
<!-- tab 第一个Tab -->
**tab名字为第一个Tab**
<!-- endtab -->
<!-- tab @fab fa-apple-pay -->
**只有图标 没有Tab名字** ...
HTTP TCP UDP IP 协议 数据头格式
TCP/UDP IP HTTP报文格式TCP (重点)
1、 端口到端口之间的映射 (2字节 0-65535)
2、 收发的应答:SEQ ACK(ACK一般为收到的SEQ+1)
3、 部首长度((0-15) 4字节 也即 *20-60字节)!!
4、 窗口大小 主要用于接收方ACK时告诉发送方自己的缓冲区的大小,避免溢出
https://blog.csdn.net/challenglistic/article/details/126448803
UDP
1、 端口到端口 2字节 0-65535
2、 部首固定8字节
常用端口表:
0-65535(2字节)
SSH
22
DNS
53
HTTP
80
MySQL
3306
Redis
6379
Apache Tomcat web server默认服务端口
8080
IP(IPv4)数据报格式
1、 IP到IP 2字节 0-42亿
2、部首 长度 (0-15)4 *20-60 字节 (和TCP一样)
HTTP 重点!
(注:SP代表空格,CR代表回车,LF代表换行)
请求行(r ...
leetcode 字符串 回文串专题(持续更新)
409. 最长回文串给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
注意读清楚题,是构造而不是寻找
那么这道题就简单了,统计字符串各个字符出现的次数,偶数的都要上(放两边),奇数的选一个/ 大于2的取偶数部分,现在剩下的都是 奇数剩下的1个那部分,随机选一个就可
有点笨重的答案
class Solution {
public int longestPalindrome(String s) {
Map<Character,Integer> map = new HashMap<>();
for(int i =0 ;i<s.length(); i++){
map.put(s.charAt(i),map.getOrDefault(s.charAt ...
leetcode刷题
leetcode 142. 环形链表 II给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例1
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
示例2
解法1
hashmap,
缺点,占内存
解法2 双指针找规律
先设置一个快慢指针(快指针1次跑2个节点慢指针一次1个节点)从头开始跑,第一次相遇时,必然因为环的原因相遇,(不然怎么相遇?)
之所以相遇是因为 快指针 在环内把把慢指针套了圈,也即
f=s+2nb
又因为 快指针 移动距离是慢指针两倍
f=2s联立得:
s=nb ; f=2 ...
跨域问题解决方案及原理
参考 B站 从原理上解答跨域解决方案,不要错过哦,真的挺简单【有代码实战】
参考 学成在线
解决跨域问题跨域限制是浏览器行为,不是服务器行为。但是服务器可以辅助允许跨域请求。
浏览器有个同源策略,对于不同源的站点之间的相互请求会做限制。如果非同源,共有三种行为受到限制:
Cookie、LocalStorage 和 IndexDB 无法读取。
DOM 无法获得。
AJAX 请求不能发送。(最常见)
跨域限制仅仅是浏览器的行为,通过代理服务器,或者其他工具发送请求就能轻松绕过
问题出现时机: 前后端联调
问题描述:
我的前端工程的接口是:http://localhost:8601
但是 前端中有一个资源,需要在 系统微服务中http://localhost:63110 获取
即:http://localhost:8601访问http://localhost:63110/system/dictionary/all被CORS policy阻止
这就触发了浏览器自带的一种保护策略即CORS协议,这种协议默认你不能跨域(非同源是指协议、主机、端口号有任意一个不同的都叫跨域)我们这里端口 ...
Redis集群
redis有三种集群方式: 主从复制 , 哨兵模式 和 集群 。
一、主从复制主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave)
原理(工作机制)
slave启动后,向master发送 sync 命令
master接收到 sync 命令后通过 bgsave 保存快照(RDB持久化)并使用缓冲区记录保存快照这段时间内执行的写命令
master将保存的快照文件发送给slave,并继续记录执行的写命令
slave接收到快照文件后,加载快照文件,载入数据
master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化
此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性
优点
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
为了分载Master的操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master S ...
Redis基础知识2
Redis 事务如何使用 Redis 事务?Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能。
> MULTI
OK
> SET PROJECT "JavaGuide"
QUEUED
> GET PROJECT
QUEUED
> EXEC
1) OK
2) "JavaGuide"
MULTI命令后可以输入多个命令,Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 EXEC命令后,再执行所有的命令。
这个过程是这样的:
开始事务(MULTI);
命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行);
执行事务(EXEC)。
可以通过 DISCARD命令取消一个事务,它会清空事务队列中保存的所有命令。
你可以通过WATCH命令监听指定的 Key,当调用 EXEC 命令执行事务时,如果一个被 WATCH 命令监视的 Key 被 其他客户端/Session 修改的话,整个事务都不会被执行。
不过,如果 WATCH 与 事务 在同一个 Session 里,并且被 WATCH 监视的 K ...
Redis基础知识1
Redis基础为什么要用 Redis/为什么要用缓存?高性能:高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。读快
高并发:使用 Redis 缓存之后QPS(Query Per Second:服务器每秒可以执行的查询次数)很容易达到 10w+提升10倍以上
Redis 为什么这么快?
Redis 基于内存,内存的访问速度是磁盘的上千倍;
Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用(Redis 线程模式后面会详细介绍到);
Redis 内置了多种优化过后的数据结构实现,性能非常高
按照这张图说即可
Redis 应用Redis 除了做缓存,还能做什么?
分布式锁 (重点): 通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。关于 Redis 实现分布式锁的详细介绍,看这篇文章:分布式锁详解open in new window 。
限流 :一般是通过 Redis + Lua 脚本的方式来实现限流。相关阅读:《我司用了 6 年 ...
MySQL MVCC实现原理
参考自波波烤鸭:MySQL数据库的核心MVCC详解
一、前置内容1.事务的ACID
2.MySQL的核心日志在MySQL数据库中有三个非常重要的日志binlog,undolog,redolog.
3.隔离级别
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据**
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
MySQL事务隔离级别
事务隔离级别
脏读
不可重复读
幻读
读未提交(read-uncommitted) RU
是
是
是
不可重复读(read-com ...
MySQL explain 参数解读
explain 的全部字段
需要重点关注的字段
id、type、key、rows、Extra
id字段select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序三种情况:
1、id相同:执行顺序由上至下,
首先查t3表 得到了所有 t3表的id ,然后查t1表,所有得到所有与t3表id相同的id(交集)以及name字段等于 ‘ ‘的id 再查t2表 ,得到所有与t2表id相同的id
2、id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
先查 t3 再查 t1 在查 t2
3、id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
先查 t3
select_type查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询
1、SIMPLE:简单的select查询,查询中不包含子查询或者union (简单查询)2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary (最外面的一层查询)3、SUBQUERY:在selec ...