-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
386 lines (323 loc) · 52.3 KB
/
Copy pathindex.html
File metadata and controls
386 lines (323 loc) · 52.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>南山山</title><meta name="author" content="南山山"><meta name="copyright" content="南山山"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta property="og:type" content="website">
<meta property="og:title" content="南山山">
<meta property="og:url" content="http://example.com/index.html">
<meta property="og:site_name" content="南山山">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png">
<meta property="article:author" content="南山山">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="http://example.com/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":true,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容:${query}","hits_stats":"共找到 ${hits} 篇文章"}},
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":200},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: true,
post: true
},
runtime: '',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'mediumZoom',
Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"bottom-left"},
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false,
percent: {
toc: true,
rightside: true,
}
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: '南山山',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2023-06-07 19:18:15'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.getCSS = (url,id = false) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onerror = reject
link.onload = link.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
link.onload = link.onreadystatechange = null
resolve()
}
document.head.appendChild(link)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><meta name="generator" content="Hexo 5.4.2"></head><body><div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div class="spinner-box"><div class="configure-border-1"><div class="configure-core"></div></div><div class="configure-border-2"><div class="configure-core"></div></div><div class="loading-word">加载中...</div></div></div><script>const preloader = {
endLoading: () => {
document.body.style.overflow = '';
document.getElementById('loading-box').classList.add("loaded")
},
initLoading: () => {
document.body.style.overflow = 'hidden';
document.getElementById('loading-box').classList.remove("loaded")
}
}
preloader.initLoading()
window.addEventListener('load',()=> { preloader.endLoading() })
if (false) {
document.addEventListener('pjax:send', () => { preloader.initLoading() })
document.addEventListener('pjax:complete', () => { preloader.endLoading() })
}</script><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">169</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">38</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">38</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background: linear-gradient(20deg, #0062be, #925696, #cc426e, #fb0347)"><nav id="nav"><span id="blog-info"><a href="/" title="南山山"><span class="site-name">南山山</span></a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search" href="javascript:void(0);"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">南山山</h1><div id="site-subtitle"><span id="subtitle"></span></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left"><a href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/LVS/" title="负载均衡--LVS"><img class="post-bg" src="/img/image-20221212163331884.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="负载均衡--LVS"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/LVS/" title="负载均衡--LVS">负载均衡--LVS</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-05-27T16:00:00.000Z" title="发表于 2023-05-28 00:00:00">2023-05-28</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/">网络基础</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/">负载均衡</a></span></div><div class="content">简介
LVS(Linux Virtual Server)Linux虚拟服务,是一个开源的软件项目,在linux2.4版本中内置了LVS,可以看出LVS的影响力非常大
LVS可以实现高可伸缩的、高可用的网络服务,也就是说Linux集成它之后,所有基于Linux内核的服务器原生即可实现集群
优点:
性能强:一方面是集成到内核里面的,对硬件资源的调度非常直接,另外是4层本身只做分发,这活本身也够简单,所以速度快,稳定性强(不容易出bug)
低成本,没啥好说,典型的软件优化替代硬件
配置简单,支持多做算法,支持多种工作模型,另外由于是在4层工作所以基本可以对所有应用进行负载均衡
不足:不支持7层规则修改,也就是没有7层那么多的功能,机制过于庞大,不适合小规模应用,比如说DPVS(基于LVS)一台设备基本可以到达百万级别的CPS(每秒建立连接数),一般也没有这么大的需求,可以选择七层的负载均衡达到更灵活的功能配置;所以其实这里提到的不足都不是LVS的缺陷,只是某些场景不适合使用LVS而已
核心组件LVS的管理工具和内核模块ipvsadm/ipvs
ipvsadm:命令行工具,用于管理集群 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5/" title="负载均衡基础概念"><img class="post-bg" src="/img/1284.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="负载均衡基础概念"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5/" title="负载均衡基础概念">负载均衡基础概念</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-05-27T16:00:00.000Z" title="发表于 2023-05-28 00:00:00">2023-05-28</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/">网络基础</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/">负载均衡</a></span></div><div class="content">相关名词
VIP
RS:真实服务器,即真正提供服务的机器
硬件负载均衡产品:F5等,这个是比较贵的,听说农行用了F5
软件负载均衡:LVS、DPVS(基于LVS)、Haproxy、Nginx,通常都使用软件负载均衡方案
OSI网络层负载均衡
二层(mac)虚拟mac地址,对外使用虚拟mac地址,接收后再分配给后端实际的mac地址
三层(ip)虚拟ip
四层(tcp)在三层负载均衡基础上,使用IP+port方式做虚拟映射,对流量做NAT处理,转发到后台服务器,并记录流量是由哪台服务器处理的,后续这个连接的所有流量会被转发到同一台服务器
注意,Nginx和Haproxy也可以实现四层的负载均衡,后面详细介绍
五元组通过五元组来决定流量的转发目的地
来源IP、端口
目标IP、端口
协议
VIP的实现
通过keepalive实现
通过BGP协议实现,这种方式可以让流量轮询实现均分
七层(http)虚拟url或者ip,在四层负载均衡基础上,根据应用层的特征来转发流量,比如URL、浏览器类别、语言等。
以TCP为例,负载均衡设备要根据应用层的内容来进行转发,那么势必需要对客户请求 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B7%AF%E7%94%B1%E4%BA%A4%E6%8D%A2/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80/" title="路由交换--基础"><img class="post-bg" src="/img/image-20221212163331884.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="路由交换--基础"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/05/28/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B7%AF%E7%94%B1%E4%BA%A4%E6%8D%A2/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80/" title="路由交换--基础">路由交换--基础</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-05-27T16:00:00.000Z" title="发表于 2023-05-28 00:00:00">2023-05-28</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/">网络基础</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B7%AF%E7%94%B1%E4%BA%A4%E6%8D%A2/">路由交换</a></span></div><div class="content">路由的基本概念互联网上数据通过IP协议进行转发传输,基于路由器、交换机、防火墙、负载均衡器等设备进行转发,这些设备上都会维护自己的路由表,通过路由表来进行IP寻址
路由表
目的网络地址/掩码:路由指向的目的网段(注意是远端网段)
路由协议:Static是通过手工配置的静态路由,OSPF是一个路由协议自动学习路由信息
优先级:数值越小优先级越高,静态路由的默认优先级为60
度量值:只本条路由到达目的网段的代价值,直连路由和静态路由的默认代价值为0,不同的路由协议有自己的度量值计算方式
下一跳:下次转发到的路由器接口网段,可能要经过多次转发才能到达目的网段
出接口:数据转发出去的路由器接口
路由信息的来源
直连路由:路由器能自动获本设备直连接口的路由并写入路由表,加载到路由表的前提是该接口的物理状态和协议状态,也就是说即使物理接线也可以通过禁用协议来屏蔽该接口路由
静态路由:直连路由不能发现远端网络,可以手动配置,弊端是互联网结构复杂工作量太大且不能灵活变通
动态路由:通过动态路由设备间可以交互信息自动计算和发现网络中的路由
路由优先级
图中,R2可以通过R1或者R3到达1.1. ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/05/10/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/Redis%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/" title="Redis实现原理"><img class="post-bg" src="/img/redis1111.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Redis实现原理"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/05/10/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/Redis%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/" title="Redis实现原理">Redis实现原理</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-05-10T10:29:04.315Z" title="发表于 2023-05-10 18:29:04">2023-05-10</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/">Redis</a></span></div><div class="content">
SDS把SDS单独提一下,所有的用户数据在Redis中都是使用SDS进行存储的,之前内存模型中有详细说明过
Stringstring是Redis中最简单的键值对存储方式,使用字典进行实现,基于Hash表,当往Redis中添加一个键值对的时候,通过key计算出的hash值被映射到一个Hash表上(Hash居然是一个单向链表),由于是Hash值做的映射,会发生冲突,冲突的时候通过链表把数据(key)依次进行存储
123456789101112131415161718192021222324252627282930313233343536373839struct dict { dictType *type; // 记录类型,用于创建多类型的字典,不清楚具体作用 dictEntry **ht_table[2]; // Hash表,这里有两个Hash表,正常只使用第一个,当第一个需要重做Hash时临时使用第二个 unsigned long ht_used[2]; // 之前版本有个独立的dictht结构体用来存储Hash表的统计信息,估计现在存在这个地方了 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/05/04/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/Redis%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/" title="Redis内存模型"><img class="post-bg" src="/img/redis1111.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Redis内存模型"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/05/04/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/Redis%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/" title="Redis内存模型">Redis内存模型</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-05-04T07:04:51.379Z" title="发表于 2023-05-04 15:04:51">2023-05-04</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/">Redis</a></span></div><div class="content">
概述
内容测试基于Redis版本:7.0.10
参考博客:深入学习Redis(1):Redis内存模型
一、内存统计和分类1.1.1 内存统计命令注意info这个命令可以输出Redis服务相关的所有信息
12345678910127.0.0.1:6379> info memory# Memoryused_memory:1108392used_memory_human:1.06Mused_memory_rss:4489216used_memory_rss_human:4.28M...mem_fragmentation_ratio:4.13mem_allocator:jemalloc-5.2.1...
used_memory和used_memory_human是同一个数据表示Redis分配器的内存总量(包括虚拟内存),human只是便于人查看
used_memory_rss表示Redis服务从系统申请占用的真实内存(不包括虚拟内存),包括了服务自身的内存开销,而used_memory相当于业务占用内存
mem_fragmentation_ratio:内存碎片比率,该值是use ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%B8%80%E3%80%81%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" title="MongoDB -- 一、基础知识"><img class="post-bg" src="/img/Mongodb.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="MongoDB -- 一、基础知识"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%B8%80%E3%80%81%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/" title="MongoDB -- 一、基础知识">MongoDB -- 一、基础知识</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-04-25T16:00:00.000Z" title="发表于 2023-04-26 00:00:00">2023-04-26</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/">MongoDB</a></span></div><div class="content">
基础知识
文档是mongo中数据的基础单元,类似于mysql中的行
集合类似于表
每个文档都有一个特殊的唯一键_id
mongo自带一个JS shell,可用于管理
文档文档是键值对的一个有序集合,例如:{"greeting" : "Hello, world!"}
文档的键是字符串(\0不能使用,空字符用于表示键的结尾;.和$具有特殊意义是保留字符,尽量避免使用)
键值不仅区分类型,同样会区分大小写
文档不能有重复的键
集合是一组文档,类似于表的概念
动态模式集合是动态模式的,一个集合里面的文档可以是各式各样的
12{"greeting" : "Hello, world!"}{"foo" : 5}
以上两个文档可以存储在同一个集合里面,这就和mysql大不相同了,既然所有结构的文档都可以存储在同一个集合里面,那集合这个层级存在的意义是什么
方便管理,对开发者来说也是很好的数据隔离策略
分开存储在查询效率上会更高
相同 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%B8%89%E3%80%81%E7%B4%A2%E5%BC%95/" title="MongoDB -- 三、索引"><img class="post-bg" src="/img/Mongodb.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="MongoDB -- 三、索引"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%B8%89%E3%80%81%E7%B4%A2%E5%BC%95/" title="MongoDB -- 三、索引">MongoDB -- 三、索引</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-04-25T16:00:00.000Z" title="发表于 2023-04-26 00:00:00">2023-04-26</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/">MongoDB</a></span></div><div class="content">
索引简介索引的创建和分析
分析语句db.index_test.find({'name': 'yjvud'}).explain() 不是很靠谱,和文档里面展示的内容不同没看出什么信息
创建索引db.index_test.ensureIndex({'name': 1}) 创建后再进行分析查看,可以看到索引方案被使用了
创建复合索引db.index_test.ensureIndex({'age': 1, 'name': 1})
Mongo里面复合索引逆序不能生效,也就是说上面的索引只能通过年龄定位后顺序的拿出名称,要从z-a的获取名称的话效率就很低了,需要再创建一个索引db.index_test.ensureIndex({'age': 1, 'name': -1}),当然单个索引不需要,这个后面看具体的数据结构就知道原因了
覆盖索引,和mysql里面一样存在回表操作
隐式索引,复合索引同样存在前缀 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%BA%8C%E3%80%81%E6%93%8D%E4%BD%9C%E5%91%BD%E4%BB%A4/" title="MongoDB -- 二、操作命令"><img class="post-bg" src="/img/Mongodb.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="MongoDB -- 二、操作命令"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E4%BA%8C%E3%80%81%E6%93%8D%E4%BD%9C%E5%91%BD%E4%BB%A4/" title="MongoDB -- 二、操作命令">MongoDB -- 二、操作命令</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-04-25T16:00:00.000Z" title="发表于 2023-04-26 00:00:00">2023-04-26</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/">MongoDB</a></span></div><div class="content">
前瞻
进入命令行:到服务器上运行(当然前提是使用docker方式进行安装的)docker exec -it mongodb mongo admin
通过navicat连接:正常输入用户名密码即可(注意要将开放服务器对应端口的防火墙)
DDL
创建数据库
use db_name
mongo不需要使用类似create这样的关键字来显式的创建数据库
查看数据库show dbs,注意上面我们使用use命令创建的数据库必须要插入数据之后才会被展示到dbs的结果列表中
查看当前数据库db
DML插入123db.first_table.insert({'name': 'liuxulu'})db.first_table.find()# { "_id" : ObjectId("61c0386a55fe7a268eff2b6d"), "name" : "liuxulu" }
由于没有指定_id,这个时候mongo会给文档自动增加一 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E7%89%B9%E6%AE%8A%E9%9B%86%E5%90%88%E5%92%8C%E7%B4%A2%E5%BC%95/" title="MongoDB -- 特殊集合和索引"><img class="post-bg" src="/img/Mongodb.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="MongoDB -- 特殊集合和索引"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/04/26/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/%E7%89%B9%E6%AE%8A%E9%9B%86%E5%90%88%E5%92%8C%E7%B4%A2%E5%BC%95/" title="MongoDB -- 特殊集合和索引">MongoDB -- 特殊集合和索引</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-04-25T16:00:00.000Z" title="发表于 2023-04-26 00:00:00">2023-04-26</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/">数据持久化</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/">MongoDB</a></span></div><div class="content">
特殊集合和索引固定集合之前介绍的集合都是随着文档插入规模不断变大的,固定的集合是规模是固定的,结构和循环队列类似,如果没有空间了,就替换最老的文档
创建:和普通集合不同,固定集合需要显式的进行创建,创建后其属性就不能再被改变了
自然排序:固定集合可以按数据插入的顺序读取数据
循环游标:类似于tail -f,可以持续的从集合中获取数据,只适用于固定集合
没有_id索引的集合
允许一个集合不需要_id索引,可以提高数据插入效率
2.2版本以前固定集合默认是没有id索引的
TTL索引固定集合中内容会被自动覆盖,控制不是很灵活,TTL(time to live index)生命周期索引,允许为每一个文档设置一个超时时间
TTL是创建一个索引,对指定字段(时间类型)的数据进行比对,超过设置的过期时间之后该文档会被删除,这里清理的频率上每分钟,所以不能保证秒级别的过期时间
全文本索引类似于ES的索引,mongo中可能还不是很成熟,对性能的影响可能会很大,需要衡量好再使用
地理空间索引mongo支持几种地理空间索引,可以用来进行相关数据的存储和查询
GridFS存储文件是mongo ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/04/24/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/%E5%B8%A6%E5%AE%BD%E6%B5%8B%E8%AF%95-iperf3/" title="网络工具 -- 带宽测试工具iperf3"><img class="post-bg" src="/img/v2-df27fdb147b3cb02c6e37e2b207f8c81_1440w.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="网络工具 -- 带宽测试工具iperf3"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/04/24/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/%E5%B8%A6%E5%AE%BD%E6%B5%8B%E8%AF%95-iperf3/" title="网络工具 -- 带宽测试工具iperf3">网络工具 -- 带宽测试工具iperf3</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-04-24T07:05:58.508Z" title="发表于 2023-04-24 15:05:58">2023-04-24</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/">网络基础</a><i class="fas fa-angle-right article-meta-link"></i><a class="article-meta__categories" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/">网络工具</a></span></div><div class="content">
简述官方一点说是用来测量一个网络最大带宽的工具。
个人常用于跑流量、测带宽,以检测一些路由限速规则是否生效,以及线路流量监控是否准确。
iperf支持TCP、UDP协议,默认使用TCP。
安装Ubuntu
安装非常简单apt-get install iperf3
查看版本iperf3 -v
使用服务端一台公网服务A作为服务端,IP为:139.159.96.26
开启服务:
1234iperf3 -s -i 10 -p 5201# -s 作为服务端运行# -i 每10s生成一次报告# -p 端口,默认5201
客户端基础命令1-b # 指定带宽
指定测试时间123456789101112131415161718192021222324iperf3 -c 139.159.96.26 -p 5201 -t 5 -P 1 -R# -c client# 139.159.96.26服务端IP# -p 服务端端口# -t 传输时间,默认10s# -P 发送连接数# -R 表示测试为下载Connecting to host 139.159.96.26, port 5201Reverse ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><span class="space">…</span><a class="page-number" href="/page/17/#content-inner">17</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://i.loli.net/2021/02/24/5O1day2nriDzjSu.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">南山山</div><div class="author-info__description"></div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">169</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">38</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">38</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/fireflyso"><i class="fab fa-github"></i><span>Follow Me</span></a></div><div class="sticky_layout"><div class="card-widget card-categories"><div class="item-headline">
<i class="fas fa-folder-open"></i>
<span>分类</span>
</div>
<ul class="card-category-list" id="aside-cat-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/"><span class="card-category-list-name">java</span><span class="card-category-list-count">29</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/2019/"><span class="card-category-list-name">2019</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/Show-Me-The-Code/"><span class="card-category-list-name">Show Me The Code</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/%E5%8D%81%E5%B9%B4%E4%B8%80%E5%89%91/"><span class="card-category-list-name">十年一剑</span><span class="card-category-list-count">3</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/%E5%9F%BA%E7%A1%80/"><span class="card-category-list-name">基础</span><span class="card-category-list-count">13</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/java/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/"><span class="card-category-list-name">集合框架</span><span class="card-category-list-count">5</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/python/"><span class="card-category-list-name">python</span><span class="card-category-list-count">26</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/python/Django/"><span class="card-category-list-name">Django</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/python/python%E5%9F%BA%E7%A1%80/"><span class="card-category-list-name">python基础</span><span class="card-category-list-count">11</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/python/%E6%B5%81%E7%95%85%E7%9A%84Python/"><span class="card-category-list-name">流畅的Python</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/python/%E7%88%AC%E8%99%AB/"><span class="card-category-list-name">爬虫</span><span class="card-category-list-count">2</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/web%E6%A1%86%E6%9E%B6/"><span class="card-category-list-name">web框架</span><span class="card-category-list-count">18</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/web%E6%A1%86%E6%9E%B6/hibernate/"><span class="card-category-list-name">hibernate</span><span class="card-category-list-count">5</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/web%E6%A1%86%E6%9E%B6/mybatis/"><span class="card-category-list-name">mybatis</span><span class="card-category-list-count">2</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/web%E6%A1%86%E6%9E%B6/spring/"><span class="card-category-list-name">spring</span><span class="card-category-list-count">6</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/web%E6%A1%86%E6%9E%B6/springmvc/"><span class="card-category-list-name">springmvc</span><span class="card-category-list-count">5</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E5%89%8D%E7%AB%AF/"><span class="card-category-list-name">前端</span><span class="card-category-list-count">2</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/"><span class="card-category-list-name">安装教程</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/"><span class="card-category-list-name">数据持久化</span><span class="card-category-list-count">39</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/InnoDB/"><span class="card-category-list-name">InnoDB</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Kafka/"><span class="card-category-list-name">Kafka</span><span class="card-category-list-count">7</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MongoDB/"><span class="card-category-list-name">MongoDB</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/MySQL/"><span class="card-category-list-name">MySQL</span><span class="card-category-list-count">2</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/Redis/"><span class="card-category-list-name">Redis</span><span class="card-category-list-count">6</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/clickhouse/"><span class="card-category-list-name">clickhouse</span><span class="card-category-list-count">6</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/end/"><span class="card-category-list-name">end</span><span class="card-category-list-count">3</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-%E7%AE%97%E6%B3%95/"><span class="card-category-list-name">数据结构--算法</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/"><span class="card-category-list-name">网络基础</span><span class="card-category-list-count">16</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/"><span class="card-category-list-name">名词解释</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"><span class="card-category-list-name">网络工具</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%87%AA%E9%A1%B6%E5%90%91%E4%B8%8B%E6%96%B9%E6%B3%95/"><span class="card-category-list-name">自顶向下方法</span><span class="card-category-list-count">5</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/"><span class="card-category-list-name">负载均衡</span><span class="card-category-list-count">2</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/%E8%B7%AF%E7%94%B1%E4%BA%A4%E6%8D%A2/"><span class="card-category-list-name">路由交换</span><span class="card-category-list-count">1</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"><span class="card-category-list-name">计算机操作系统</span><span class="card-category-list-count">37</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/linux/"><span class="card-category-list-name">linux</span><span class="card-category-list-count">18</span></a><ul class="card-category-list child"><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/linux/%E6%AF%8F%E6%97%A5%E5%91%BD%E4%BB%A4/"><span class="card-category-list-name">每日命令</span><span class="card-category-list-count">10</span></a></li></ul></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/mac/"><span class="card-category-list-name">mac</span><span class="card-category-list-count">8</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/windows/"><span class="card-category-list-name">windows</span><span class="card-category-list-count">7</span></a></li></ul></li>
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/MongoDB/" style="font-size: 1.18em; color: #999ca0">MongoDB</a> <a href="/tags/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/" style="font-size: 1.1em; color: #999">网络工具</a> <a href="/tags/mybatis/" style="font-size: 1.13em; color: #999a9b">mybatis</a> <a href="/tags/%E7%88%AC%E8%99%AB/" style="font-size: 1.13em; color: #999a9b">爬虫</a> <a href="/tags/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/" style="font-size: 1.38em; color: #99a4b3">网络基础</a> <a href="/tags/%E8%B7%AF%E7%94%B1%E4%BA%A4%E6%8D%A2/" style="font-size: 1.1em; color: #999">路由交换</a> <a href="/tags/2019/" style="font-size: 1.18em; color: #999ca0">2019</a> <a href="/tags/web%E6%A1%86%E6%9E%B6/" style="font-size: 1.4em; color: #99a5b6">web框架</a> <a href="/tags/Kafka/" style="font-size: 1.25em; color: #999fa7">Kafka</a> <a href="/tags/end/" style="font-size: 1.15em; color: #999b9e">end</a> <a href="/tags/python%E5%9F%BA%E7%A1%80/" style="font-size: 1.32em; color: #99a2ae">python基础</a> <a href="/tags/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/" style="font-size: 1.13em; color: #999a9b">负载均衡</a> <a href="/tags/Show-Me-The-Code/" style="font-size: 1.18em; color: #999ca0">Show Me The Code</a> <a href="/tags/spring/" style="font-size: 1.23em; color: #999ea5">spring</a> <a href="/tags/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/" style="font-size: 1.1em; color: #999">名词解释</a> <a href="/tags/mac/" style="font-size: 1.28em; color: #99a0aa">mac</a> <a href="/tags/springmvc/" style="font-size: 1.2em; color: #999da3">springmvc</a> <a href="/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" style="font-size: 1.48em; color: #99a8bd">计算机操作系统</a> <a href="/tags/%E8%87%AA%E9%A1%B6%E5%90%91%E4%B8%8B%E6%96%B9%E6%B3%95/" style="font-size: 1.2em; color: #999da3">自顶向下方法</a> <a href="/tags/clickhouse/" style="font-size: 1.23em; color: #999ea5">clickhouse</a> <a href="/tags/%E5%89%8D%E7%AB%AF/" style="font-size: 1.13em; color: #999a9b">前端</a> <a href="/tags/%E5%9F%BA%E7%A1%80/" style="font-size: 1.35em; color: #99a3b1">基础</a> <a href="/tags/%E6%B5%81%E7%95%85%E7%9A%84Python/" style="font-size: 1.18em; color: #999ca0">流畅的Python</a> <a href="/tags/%E5%8D%81%E5%B9%B4%E4%B8%80%E5%89%91/" style="font-size: 1.15em; color: #999b9e">十年一剑</a> <a href="/tags/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/" style="font-size: 1.1em; color: #999">安装教程</a> <a href="/tags/hibernate/" style="font-size: 1.2em; color: #999da3">hibernate</a> <a href="/tags/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/" style="font-size: 1.2em; color: #999da3">集合框架</a> <a href="/tags/Django/" style="font-size: 1.1em; color: #999">Django</a> <a href="/tags/linux/" style="font-size: 1.4em; color: #99a5b6">linux</a> <a href="/tags/windows/" style="font-size: 1.25em; color: #999fa7">windows</a> <a href="/tags/%E6%AF%8F%E6%97%A5%E5%91%BD%E4%BB%A4/" style="font-size: 1.3em; color: #99a1ac">每日命令</a> <a href="/tags/java/" style="font-size: 1.45em; color: #99a7ba">java</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-%E7%AE%97%E6%B3%95/" style="font-size: 1.1em; color: #999">数据结构--算法</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96/" style="font-size: 1.5em; color: #99a9bf">数据持久化</a> <a href="/tags/MySQL/" style="font-size: 1.13em; color: #999a9b">MySQL</a> <a href="/tags/python/" style="font-size: 1.43em; color: #99a6b8">python</a> <a href="/tags/Redis/" style="font-size: 1.23em; color: #999ea5">Redis</a> <a href="/tags/InnoDB/" style="font-size: 1.18em; color: #999ca0">InnoDB</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/05/"><span class="card-archive-list-date">五月 2023</span><span class="card-archive-list-count">5</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/04/"><span class="card-archive-list-date">四月 2023</span><span class="card-archive-list-count">163</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/01/"><span class="card-archive-list-date">一月 2023</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">169</div></div><div class="webinfo-item"><div class="item-name">本站总字数 :</div><div class="item-count">158.9k</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2023-06-07T11:18:15.181Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer" style="background: linear-gradient(20deg, #0062be, #925696, #cc426e, #fb0347)"><div id="footer-wrap"><div class="copyright">©2020 - 2023 By 南山山</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><div class="footer_custom_text">咱是有底线的</div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/medium-zoom/dist/medium-zoom.min.js"></script><script src="https://cdn.jsdelivr.net/npm/instant.page/instantpage.min.js" type="module"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script>function panguFn () {
if (typeof pangu === 'object') pangu.autoSpacingPage()
else {
getScript('https://cdn.jsdelivr.net/npm/pangu/dist/browser/pangu.min.js')
.then(() => {
pangu.autoSpacingPage()
})
}
}
function panguInit () {
if (true){
GLOBAL_CONFIG_SITE.isPost && panguFn()
} else {
panguFn()
}
}
document.addEventListener('DOMContentLoaded', panguInit)</script><div class="js-pjax"><script>window.typedJSFn = {
init: (str) => {
window.typed = new Typed('#subtitle', Object.assign({
strings: str,
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50,
}, ))
},
run: (subtitleType) => {
if (true) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('https://cdn.jsdelivr.net/npm/typed.js/dist/typed.umd.min.js').then(subtitleType)
}
} else {
subtitleType()
}
}
}
</script><script>function subtitleType () {
if (true) {
typedJSFn.init(["梅花落满了南山"])
} else {
document.getElementById("subtitle").innerHTML = '梅花落满了南山'
}
}
typedJSFn.run(subtitleType)</script></div><script defer="defer" id="fluttering_ribbon" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/dist/canvas-fluttering-ribbon.min.js"></script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span> 数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div class="no-result" id="local-search-results"></div><div id="local-search-stats-wrap"></div></div></div><div id="search-mask"></div><script src="/js/search/local-search.js"></script></div></div></body></html>