- 博客(387)
- 收藏
- 关注
原创 ConcurrentHashMap简单了解
通过分段锁Segment实现,将锁一段一段存储,默认会分配16个segment,当一个线程占用一把锁segment访问其中一段数据的时候,位于其它segment的数据也能被其它线程同时访问,每个segment分配子数组,将hashmap数组逻辑上拆分成多个子数组,每个子数组配置一把锁,线程在获取到某把分段锁的时候才能操作该子数组,其它线程想要操作该子数组时只能被阻塞。ConcurrentHashMap比起Segment,锁拆的更细;CAS + synchronized使锁更细化;
2023-06-12 21:24:00
731
原创 hashmap的11连问
需要,否则就需要多次扩容,取2的幂次方,也就是128即可,因为2的幂次高位是1其余位置是0,当进行hash运算时,(n-1)&hash,n-1就是高位是0,低位都是1,这样&完之后,结果各个位置的取值取决于hash,如果不是2的整数次幂必然会有0位,0与任何&肯定为0,会造成更多的哈希冲突。红黑树是近似平衡的。0.75是为了触发扩容,减少冲突发生的概率,加载因子很大,扩容条件就会苛刻,hash碰撞概率变高,每个链表长度都很长,查询速度变慢,太小又会导致扩容频率变高,,内存消耗变大。
2023-06-12 16:06:24
665
原创 redis分布式锁
redis 触发故障转移,其中一个 slave 升级为新的 master,此时新上位的master并不包含线程1写入的键值对,因此线程 2 尝试获取锁也可以成功拿到锁,此时相当于有两个线程获取到了锁,可能会导致各种预期之外的情况发生,例如最常见的脏数据。可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。
2023-05-04 17:54:13
794
2
原创 理解什么是sql注入攻击 + xss攻击 + cors 攻击
SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,。SQL注入攻击实例:用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。这是为什么呢?分析上述SQL语句我们知道,username=‘ or 1=1 这个语句一定会成功;然后后面加两个 -,这意味着注释,它将后面的语句注释,让他们不起作用。这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
2023-04-14 15:46:40
3782
原创 Redis的哈希表是如何扩容的?
当元素数量比较少的时候就需要缩容以节约不必要的内存。为ht[1]分配空间,ht[0].used当前值为4,8恰好是第一个大于等于4的2的N次幂,那么当前就会将ht[1]哈希表大小设置为8。ht[2]:两个哈希表,字典使用的哈希表是ht[0],ht[1]则是当对ht[0]哈希表进行rehash时使用。迁移过程中,新增的数据只会存在ht[1]中,而不会存放到ht[0],ht[0]只会减少不会新增。不会,因为在迁移时,首先会从ht[0]读取数据,如果ht[0]读不到,则会去ht[1]读。
2023-04-14 13:32:49
2129
1
原创 关于Redis的BigKey
这个指令没有offset,limit参数,是要一次性吐出所有满足条件的key,由于redis是单线程的,其所有操作都是原子性的,而keys算法是遍历算法,时间复杂度是n,如果哦实例中有千万级别以上的key,这个指令就会导致redis服务卡顿,所有读写Redis的指令就会被延后甚至超时,可能引起缓存雪崩甚至数据库宕机。给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小,但是想查询大于10kb的所有key,–bigkeys参数就无能为力了。拒绝BigKey防止网卡流量,慢查询。
2023-04-13 22:53:40
881
原创 一台主机可以有多少个端口?为什么会有端口号的限制呢?与哪些因素有关
TCP/IP协议中的服务端口通过不同的逻辑端口来区分不同的服务。一个IP地址的端口通过16bit进行编号,最多可以有65535个端口。
2023-04-13 18:07:45
2151
原创 WebSocket和Socket编程
socket原理socket为啥要有端口:确定一个链路的是一个四元组Socket编程socket通信你做过socket编程吗,socket是怎么实现知道有连接过来的说说WebSocket与socket的区别。
2023-04-12 15:11:27
1139
原创 如何实现一个可靠的 UDP
市面上的基于UDP协议实现的可靠传输协议的成熟方案,应用在HTTP/3上。UDP报文头部和TCP报文头部夹着三层头部。
2023-04-11 17:13:42
792
1
原创 TCP三次握手和四次挥手
序列号:建立连接时计算机随机生成的随机数作为初始值,通过SYN包传给接收端主机,每发送一次数据就累加一次该数据字节数的大小。。确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答以后认为在这个序号以前的数据都已经被正常接受。。ACK:确认应答的字段变为有效,RST:表示TCP连接中出现异常必须强制断开连接SYN:表示希望建立连接,并在其序列号的字段进行序列号初始值的设定FIN:表示今后不会再有数据发送,希望断开连接。
2023-04-10 20:12:50
570
原创 流量控制和拥塞控制的原理和区别
重传机制的其中一个方式,就是发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文就会重发该数据。
2023-04-10 19:38:27
962
原创 TCP和UDP的区别以及应用场景
首先UDP协议非常简单,头部只有8个字节:校验和为了提供可靠的UDP首部和数据而设计,防止收到在网络传输中受损的UDP包。再对比下TCP协议:传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块。TCP传输数据前先要建立连接,UDP不需要。TCP是一对一两点服务,一条连接只有两个端点,UDP支持一对一,一对多,多对多。TCP是可靠交付数据的,数据可以是无差错,无丢失,无重复,按序可达。UDP尽可能最大努力交付,不保证可靠交付数据。
2023-04-10 15:36:04
444
原创 TCP为什么可靠,采用了什么方法
源端口和目的端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。首先对比IP层,IP层不可靠,不保证网络包的交付,不保证网络包的按序交付,也不保证网络包的数据完整性。源地址和目的地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。TCP无论网络链路出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端。而TCP在传输层进行可靠的数据传输服务,接受到的网络包无损坏,无间隔,非冗余按序。窗口大小:用来做流量控制。
2023-04-10 15:10:47
127
原创 IP层会分片,为什么TCP层还需要MSS?
MTU:一个网络包的最大长度,以太网一般为1500字节MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度如果一个IP分片丢失,整个IP报文的所有分片都得重传。IP层进行分片传输没有效率:IP层没有超时重传机制,由传输层的TCP来负责超时和重传,当某个IP分片丢失后,接收方的IP层无法组装成一个完整的TCP报文,也就无法将数据报文送到TCP层,所以接收方不会响应ACK给发送方,因为发送方迟迟收不到ACK确认报文,所以会触发超时重传机制,就会重发。为了达到最佳的传输效能,TC
2023-04-10 14:55:38
478
原创 为什么每次建立TCP连接时初始化的序列号都要求不一样
客户端和服务端建立了一个TCP连接,在客户端发送数据包被网络阻塞了然后超时重传了这个数据包,而此时服务端断电重启,之前与客户端建立的连接也消失了,于是收到客户端的数据包的时候就会发送RST报文。在新连接建立完成后,上一个连接中被网络阻塞的数据包正好抵达了服务端,刚好该数据包的序列号正好在服务端的接收窗口,所以。客户端和服务端的初始化序列号都是从0开始的。紧急着,客户端又与服务端建立了与上一个连接相同的四元组连接。
2023-04-10 14:32:00
205
原创 TCP为什么要三次握手,而不是两次或四次?
网络堵塞情况下,如果一个旧的SYN报文比新的SYN报文早到达了服务端,那么此时服务端就会回一个SYN+ACK报文给客户端,此时报文中的确认号是91(90+1).TCP建立连接,通过三次握手能防止历史连接的建立,减少双方不必要的资源开销,能帮助双方同步初始化序列号。两次握手,如果客户端发送的SYN报文在网络堵塞了,重复发送多次SYN报文,那么服务端在收到请求后就会。四次握手也能够可靠的同步双方的初始化序号,但第二步和第三步可以优化成异步,所以成了三次握手。后续最新的SYN抵达服务端后就完成正常的三次握手。
2023-04-10 13:51:30
3926
1
原创 讲一下dns过程:给一个网址www.google.com,dns服务器如何逐级解析的?
如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?就是我的域名我做主。根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
2023-04-08 22:13:16
1129
3
原创 Collection,List接口相关介绍
ArrayList中维护了一个Object类型的数组elementData。transient Object[] elementData(transient 表示瞬间,短暂的,该属性不会被序列化)Vector是线程同步的,即线程安全的,Vector类的操作方法带有synchronized,在开发中需要线程同步安全时,考虑使用Vector。此时LinkedList的属性first = null last = null。Vector底层也是一个对象数组。
2023-04-08 16:56:53
346
原创 一篇文章让你面试畅谈HashMap,Hashtable,TreeSet,TreeMap
k-v为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry对象就有k,v,EntrySetentrySet中,定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node,这是因为当把HashMap$Node对象存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要方法javautil。
2023-04-08 01:21:36
380
原创 https中传输会经过网关,为什么网关不能知道他们的密钥
HTTPS使用的是对称密钥加密和公钥加密相结合的方式进行加密传输。在HTTPS传输中,网关(如代理服务器)只是一个中间人,它将请求从客户端转发到服务器,并将响应从服务器转发回客户端。网关不能知道传输的密钥是因为。,该密钥用于加密和解密传输的数据,是对称加密的,这个密钥只有客户端和服务器知道,而网关只是一个中转站,它并不参与 SSL/TLS 协议的协商过程,也。因此,即使网关截取了HTTPS传输,也无法解密和读取传输的内容。,客户端和服务器会协商一个。,网关并不参与此过程。
2023-04-07 17:04:18
249
原创 http状态码
1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。3xx 类状态码表示,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。「301 Moved Permanently」表示,说明请求的资源已经不存在了,需改用新的 URL 再次访问。「302 Found」表示,说明请求的资源还在,但暂时需要用另一个 URL 来访问。301 和 302 都会在响应头里使用,指明,浏览器会。
2023-04-07 16:21:02
639
原创 HashSet和LinkedHashSet底层分析
它是HashSet的子类底层是一个LinkedHashMap(HashMap的子类),底层维护了一个数组+双向链表(有head和tail),每个节点都有before和after属性,这样可以形成双向链表根据元素的hashcode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的我们遍历LinkedHashSet也能确保插入顺序和遍历顺序一致不允许添重复元素添加第一次时,直接将数组table扩容到16,存放的结点类型时LinkedHashMapEn。
2023-04-07 00:34:00
439
原创 http请求报文和响应报文
HTTP报文大致可分为报文首部和报文主体两块,两者由最初出现的空行来划分。它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html?param1=value1¶m2=value2”的方式传递请求参数。
2023-04-06 14:59:32
863
原创 理解 arp以及大致的原理 + 存在的安全隐患
ARP协议是地址解析协议(Address Resolution Protocol)是通过解析IP地址得到MAC地址,所有ARP协议在网络层被应用,它是网络层与链路层连接的重要枢纽每台主机都会在自己的ARP缓冲区中建立一个ARP列表,ARP列表表示的是IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机的时候,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址,如果有的话直接讲数据包发送到该MAC地址,如果没有就向本地网络发送广播。在这里插入代码片。
2023-04-05 23:00:08
1296
原创 ping协议(ICMP)的原理
协议不可达 2:主机使用TCP协议访问对端主机时,能找到对端的主机了,但是对端主机防火墙禁止TCP协议访问,会通过ICMP协议以协议不可达的原因告知主机。主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。可以向对端主机发送回送请求的消息(8),也可以接收对端主机发送回来的回送应答(0)。
2023-04-05 22:18:10
3014
原创 浏览器输入一个 url 的解析过程
浏览器查询 DNS,获取域名对应的 IP 地址:具体过程包括和等。对于向本地 DNS 服务器进行查询,如果,则,完成域名解析(如果要,但该,则调用这个 IP 地址映射,完成域名解析(如果,那么将根据其设置发起或者;
2023-04-04 12:42:50
324
原创 DNS 的解析过程以及相关问题
浏览器首先看看自己浏览器缓存有没有对应的IP记录,同时还要查询一下主机本地文件里面有没有对应的记录,如果有记录就没必要进行后面的步骤了。浏览器为了进行域名解析,是需要调用解析器的,解析器可以帮助浏览器调用系统的网络功能,解析器就相当于DNS客户端,DNS客户端需要向DNS服务器查询IP地址。
2023-04-04 12:14:43
439
原创 只需这一篇博客就能完全弄懂LSM树
B+树是写入的时候就找好key的位置,读取的时候直接根据索引查找key的值LSM是写入是可能一个key存在不同层的树上,读取的时候,需要合并key不同树上的值。相当于B+树是写入时merge,LSM是读取时候merge。
2023-04-03 22:38:42
641
1
原创 Http和Https
对称加密:发送方和接受方用同样的规则(算法)来为数据进行加密解密,如果第三方知道它们使用的算法将数据拦截破解就会很危险。非对称加密:用两个密钥进行加密和解密,公开密钥是所有人都知道的密钥,私有密钥仅仅是持有方才有的密钥,一般来说私钥就放在服务器里,数据公钥加密就只能被私钥解密,数据经过私钥加密就只能被公钥解密。
2023-04-03 12:24:04
1540
原创 Redis经典五大类型源码以及底层实现
只有整数才会使用 int,如果是浮点数, Redis 内部其实先将浮点数转化为字符串值,然后再保存。embstr 与 raw 类型底层的数据结构其实都是 SDS (简单动态字符串,Redis 内部定义 sdshdr 一种结构)。Redis内部会根据用户给的不同键值而使用不同的编码格式自适应地选择较优化的内部编码格式,这一切对用户都是透明的。字符串int:8个字节的长整型。embstr:小于等于44个字节的字符串。raw:大于44个字节的字符串。
2023-04-02 21:48:36
633
原创 Redis为什么快?epoll和IO多路复用
IO:网络io多路:多个客户端连接,指的是多条TCP连接复用:用一个进程来处理多条的连接,使用单进程就能够实现同时处理多个客户端的连接实现了用一个进程来处理大量的用户连接,IO多路复用类似一个规范和接口,可以分select->poll->epoll三个阶段来描述。break;} }break;} }/**System . out . println("-----111 等待连接");
2023-03-31 14:20:13
429
原创 Redis主从复制
主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其它的slave数据库。
2023-03-30 13:05:15
846
原创 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
2023-03-15 20:20:05
81
原创 647. 回文子串 516. 最长回文子序列
动态规划:dp[i][j] 表示字符串下标从i到j是否是回文字符串时间空间复杂度都是n ^ 2为降低空间复杂度使用中心扩散法:分成两种扩散,一种是中心点是一个元素的扩散,奇数个数的回文字符串,另一种是中心点是两个元素的扩散,偶数个数的回文字符串。
2023-03-14 14:21:51
76
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人