-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
280 lines (245 loc) · 45.2 KB
/
index.html
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
<!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="jpc901"><meta name="copyright" content="jpc901"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="一个关于技术分享的博客!"><link rel="shortcut icon" href="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/031-perseus.png"><link rel="canonical" href="https://jpcly.cn/index.html"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><meta name="baidu-site-verification" content="code-jjsoouLcGZ"/><link rel="stylesheet" href="/css/index.css?v=4.13.0"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":false,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容:${query}","hits_stats":"共找到 ${hits} 篇文章"}},
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
infinitegrid: {
js: 'https://cdn.jsdelivr.net/npm/@egjs/[email protected]/dist/infinitegrid.min.js',
buttonText: '加载更多'
},
isPhotoFigcaption: true,
islazyload: false,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: '贾小白博客',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2024-08-24 00:37:37'
}</script><script>(win=>{
win.saveToLocal = {
set: (key, value, ttl) => {
if (ttl === 0) return
const now = Date.now()
const expiry = now + ttl * 86400000
const item = {
value,
expiry
}
localStorage.setItem(key, JSON.stringify(item))
},
get: key => {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = Date.now()
if (now > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = (url, attr = {}) => 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()
}
Object.keys(attr).forEach(key => {
script.setAttribute(key, attr[key])
})
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 = () => {
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 = () => {
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><link rel="stylesheet" href="/css/style.css"><meta name="generator" content="Hexo 6.3.0"></head><body><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/QQ图片20220119090729.jpg" 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">70</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">37</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">11</div></a></div><hr class="custom-hr"/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><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 class="menus_item"><a class="site-page group" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 链接</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></li><li><a class="site-page child" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></li></ul></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background-image: url('https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/thumb-1920-1092511.jpg')"><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);" rel="external nofollow noreferrer"><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="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><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 class="menus_item"><a class="site-page group" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="fa-fw fas fa-list"></i><span> 链接</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></li><li><a class="site-page child" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></li></ul></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><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 id="site_social_icons"><a class="social-icon" href="https://github.com/jpc901" rel="external nofollow noreferrer" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" rel="external nofollow noreferrer" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></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="/archives/282c52dc.html" title="分布式存储系统使用kubernetes部署"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="分布式存储系统使用kubernetes部署"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/282c52dc.html" title="分布式存储系统使用kubernetes部署">分布式存储系统使用kubernetes部署</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-08-08T10:02:11.000Z" title="发表于 2023-08-08 18:02:11">2023-08-08</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/Kubernetes/">Kubernetes</a></span></div><div class="content">环境搭建
快速搭建k3s环境
1234567891011121314151617# 关闭防火墙systemctl disable firewalld --now# 下载 k3s 安装脚本:curl -sfL https://get.k3s.io -o install.sh# 运行安装脚本:sudo sh install.sh# 等待安装完成后,通过以下命令检查 k3s 是否已成功安装:sudo systemctl status k3s# 若要将当前用户添加到 Kubernetes 集群的 kubeconfig 文件中,以便能够使用 kubectl 命令行工具连接到集群,运行以下命令:sudo cat /etc/rancher/k3s/k3s.yaml >> ~/.kube/config# 确认是否已成功添加到 kubeconfig 文件中,运行以下命令:kubectl get nodes
将其他节点加入到kubernetes集群中
12345# 查看 Kubernetes 集群主节点的 token cat /var/lib/rancher/k3s/server/node- ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/archives/14a387ba.html" title="力扣339场周赛(力扣题解)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s4..jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="力扣339场周赛(力扣题解)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/14a387ba.html" title="力扣339场周赛(力扣题解)">力扣339场周赛(力扣题解)</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-02T11:30:29.000Z" title="发表于 2023-04-02 19:30:29">2023-04-02</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%AE%97%E6%B3%95%E9%A2%98%E8%A7%A3/">算法题解</a></span></div><div class="content">T1题目链接
题目描述:给你一个仅由 0 和 1 组成的二进制字符串 s 。
如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。
返回 s 中最长的平衡子字符串长度。
子字符串是字符串中的一个连续字符序列。
题解思路:暴力遍历字符串数组,直接找连续的0和连续的1(01连续中0字符串和1字符串最小长度*2),并记录最大值即可
代码:123456789101112func findTheLongestBalancedSubstring(s string) int { res := 0 for i := 0; i < len(s);{ x, y := 0, 0 for i < len(s) && s[i] == '0' {x++; i++} for i < len(s) && s[i] == '1' ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/archives/1d059c01.html" title="力扣336场周赛(力扣题解)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s4..jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="力扣336场周赛(力扣题解)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/1d059c01.html" title="力扣336场周赛(力扣题解)">力扣336场周赛(力扣题解)</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-03-12T08:45:22.000Z" title="发表于 2023-03-12 16:45:22">2023-03-12</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%AE%97%E6%B3%95%E9%A2%98%E8%A7%A3/">算法题解</a></span></div><div class="content">T1题目链接
题目描述:给你一个下标从 0 开始的字符串数组 words 和两个整数:left 和 right 。
如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 'a'、'e'、'i'、'o'、'u' 。
返回 words[i] 是元音字符串的数目,其中 i 在闭区间 [left, right] 内。
题解思路:暴力遍历字符串数组,直接查看前后两个字母是否是元音字母。
代码:12345678910111213141516171819202122232425func vowelStrings(words []string, left int, right int) int { res := 0 mp := map[byte]bool{ 'a': true, 'e': true, 'i': true, 'o& ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/archives/47530237.html" title="146-LRU 缓存(力扣题解)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="146-LRU 缓存(力扣题解)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/47530237.html" title="146-LRU 缓存(力扣题解)">146-LRU 缓存(力扣题解)</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-03-03T14:14:32.000Z" title="发表于 2023-03-03 22:14:32">2023-03-03</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%AE%97%E6%B3%95%E9%A2%98%E8%A7%A3/">算法题解</a></span></div><div class="content">题目描述请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
输入输出12345输入["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", & ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/archives/fcbe13c3.html" title="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/1103346.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/fcbe13c3.html" title="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)">6-防止缓存击穿与protobuf通信(Go实现分布式缓存)</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-02-28T12:44:11.000Z" title="发表于 2023-02-28 20:44:11">2023-02-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/Golang/">Golang</a></span></div><div class="content">防止缓存击穿什么是缓存雪崩、击穿、穿透?缓存雪崩当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。
缓存击穿如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。
缓存穿透当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。
使用 singleflight 防止缓存击穿
定义请求对象
12345type call struct { wg sync.WaitGroup // 控制线程是否等待 val interface{} // 请求返回结果 er ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/archives/1cd762e8.html" title="5-多节点间的通信(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/1103346.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="5-多节点间的通信(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/1cd762e8.html" title="5-多节点间的通信(Go实现分布式缓存)">5-多节点间的通信(Go实现分布式缓存)</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-02-28T10:23:31.000Z" title="发表于 2023-02-28 18:23:31">2023-02-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/Golang/">Golang</a></span></div><div class="content">多节点间的通信远程访问流程
当 客户端 发送一个查询请求达到某个缓存节点时, 该节点会先判断 key 是否在本地, 不在的话, 再通过发送网络请求去访问其他 node 节点。
每个 node 既要处理来自客户端这样的外部请求, 也要处理来自其他远端节点的内部请求。
我们需要在 node 内部, 启动两个 http 服务, 一个处理客户端请求(APIServer), 一个处理节点的请求(CacheServer).
定义一个查询节点的方法
12345type PeerPicker interface { // PickPeer 于根据传入的 key 选择相应节点(选择相应的节点方法) PickPeer(key string) (peer PeerGetter, ok bool)}
通过网络请求帮我们拿到缓存结果
1234// 这个接口为我们提供需要的能力.type PeerGetter interface { Get(group string, key string) ([]byte, error)}
实现 PeerGetter# ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/archives/c950065c.html" title="4-一致性哈希(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="4-一致性哈希(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/c950065c.html" title="4-一致性哈希(Go实现分布式缓存)">4-一致性哈希(Go实现分布式缓存)</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-02-28T08:26:31.000Z" title="发表于 2023-02-28 16:26:31">2023-02-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/Golang/">Golang</a></span></div><div class="content">一致性哈希普通hash算法普通的hash算法在分布式应用中的不足
在分布式的存储系统中,要将数据存储到具体的节点上,如果我们采用普通的hash算法进行路由,将数据映射到具体的节点上,如key%N,key是数据的哈希值,N是服务器节点数。
如果有一个节点加入或退出这个集群,也就意味着几乎缓存值对应的节点都发生了改变。即几乎所有的缓存值都失效了。节点在接收到对应的请求时,均需要重新去数据源获取数据,容易引起 缓存雪崩。
一致性哈希一致性哈希原理哈希算法是对节点的数量进行取模运算,而一致性哈希是对2^32进行取模运算。一致性哈希将整个哈希值空间组成一个虚拟的圆环,也就是哈希环。
计算节点/机器(通常使用节点的名称、编号和 IP 地址)的哈希值,放置在环上。
计算 key 的哈希值,放置在环上,顺时针寻找到的第一个节点,就是应选取的节点/机器。
在一致性哈希算法中,如果某个节点宕机不可用了,那么受影响的数据仅仅是会寻址到此节点和前一节点之间的数据。
一致性哈希数据倾斜在一致性哈希算法中,如果节点太少,容易因为节点分布不均匀造成数据访问的冷热不均,也就是说大多数访问请求都会集中少量几个节点 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/archives/2ea663e2.html" title="3-基于HTTP的分布式缓存(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s4..jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="3-基于HTTP的分布式缓存(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/2ea663e2.html" title="3-基于HTTP的分布式缓存(Go实现分布式缓存)">3-基于HTTP的分布式缓存(Go实现分布式缓存)</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-02-28T05:28:09.000Z" title="发表于 2023-02-28 13:28:09">2023-02-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/Golang/">Golang</a></span></div><div class="content">基于HTTP的分布式缓存目的:通过main 函数启动 HTTP Server测试API
Cache HTTP 服务端分布式缓存需要实现节点间通信,建立基于 HTTP 的通信机制是比较常见和简单的做法。如果一个节点启动了 HTTP 服务,那么这个节点就可以被其他节点访问。
具体流程
默认通信地址前缀是defaultBasePath = "/_gocache/"。
首先判断url路径中是否包含 basePath。
把groupname/key字符截断为groupname和key。
通过groupname获取Group对象。
使用Group对象方法和key来获取key对应的缓存值。
将缓存值作为http body进行响应。
代码http.go123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package Cacheimport ( "net/http" "strings")const ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/archives/d05a0b6f.html" title="2-实现单机缓存并发控制(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="2-实现单机缓存并发控制(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/d05a0b6f.html" title="2-实现单机缓存并发控制(Go实现分布式缓存)">2-实现单机缓存并发控制(Go实现分布式缓存)</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-02-28T02:09:23.000Z" title="发表于 2023-02-28 10:09:23">2023-02-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/Golang/">Golang</a></span></div><div class="content">单机缓存并发控制通过互斥锁Mutex实现 LRU 缓存的并发控制封装一个只读数据结构
使用[]byte,支持各种数据类型。
封装一个ByteView结构体,并且在返回时,返回一个拷贝,防止缓存值被外部程序修改。
byteview.go
1234567891011121314151617181920212223242526272829303132package Cache/*缓存值的抽象与封装*/// ByteView 只读数据结构type ByteView struct { b []byte // 存储真实缓存值}// Len 返回其所占的内存大小。func (v ByteView) Len() int { return len(v.b)}// ByteSlice 返回一个拷贝,防止缓存值被外部程序修改func (v ByteView) ByteSlice() []byte { return cloneBytes(v.b)}// String 以字符串形式返回数据func (v ByteView) String() stri ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/archives/44ed92c8.html" title="1-实现LRU缓存淘汰策略(Go实现分布式缓存)"><img class="post-bg" src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/1103346.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="1-实现LRU缓存淘汰策略(Go实现分布式缓存)"></a></div><div class="recent-post-info"><a class="article-title" href="/archives/44ed92c8.html" title="1-实现LRU缓存淘汰策略(Go实现分布式缓存)">1-实现LRU缓存淘汰策略(Go实现分布式缓存)</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-02-27T15:23:11.000Z" title="发表于 2023-02-27 23:23:11">2023-02-27</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/Golang/">Golang</a></span></div><div class="content">简介为什么需要分布式缓存
减少数据库压力:缓存数据一般是在内存中,而数据库中的数据一般是在磁盘上,二者的存储速度有着非常大的差距,数据库的操作很耗时,对于一些热点数据,一般都会被暂存在分布式缓存服务器集群中,减轻数据库压力。
优化请求响应时间:如果请求命中缓存,就会直接返回,速度较快,不用再去请求数据库。
支持高可用:如果缓存时单点服务,那这台服务器宕机之后,就不能继续进行缓存服务。如果缓存服务器没有数据分片的能力,那么当某个热点key所在的服务器宕机后,容易出现缓存击穿问题。
项目介绍 这个项目模仿了 groupcache 的实现。
采用最近最少访问算法进行缓存淘汰。
实现了单机缓存和基于HTTP的分布式缓存。
使用Go锁机制防止缓存击穿。
使用一致性哈希选择节点,实现负载均衡。
使用protobuf优化节点之间二进制通信。
通过学习这个项目去了解分布式缓存如何设计,体会go语言的精巧,也感受一下设计之美。
实现LRU缓存淘汰策略淘汰策略一般常见的缓存淘汰策略有:FIFO,LFU 和 LRU。
FIFOFIFO是先进先出,淘汰缓存中最老的记录。
原因:最早添加 ...</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/7/#content-inner">7</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://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/QQ图片20220119090729.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">jpc901</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">70</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">37</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">11</div></a></div><a id="card-info-btn" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/jpc901"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/jpc901" rel="external nofollow noreferrer" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" rel="external nofollow noreferrer" target="_blank" title="Email"><i class="fas fa-envelope"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">This is my Blog</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/archives/282c52dc.html" title="分布式存储系统使用kubernetes部署"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="分布式存储系统使用kubernetes部署"/></a><div class="content"><a class="title" href="/archives/282c52dc.html" title="分布式存储系统使用kubernetes部署">分布式存储系统使用kubernetes部署</a><time datetime="2023-08-08T10:02:11.000Z" title="发表于 2023-08-08 18:02:11">2023-08-08</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/archives/14a387ba.html" title="力扣339场周赛(力扣题解)"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s4..jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="力扣339场周赛(力扣题解)"/></a><div class="content"><a class="title" href="/archives/14a387ba.html" title="力扣339场周赛(力扣题解)">力扣339场周赛(力扣题解)</a><time datetime="2023-04-02T11:30:29.000Z" title="发表于 2023-04-02 19:30:29">2023-04-02</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/archives/1d059c01.html" title="力扣336场周赛(力扣题解)"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s4..jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="力扣336场周赛(力扣题解)"/></a><div class="content"><a class="title" href="/archives/1d059c01.html" title="力扣336场周赛(力扣题解)">力扣336场周赛(力扣题解)</a><time datetime="2023-03-12T08:45:22.000Z" title="发表于 2023-03-12 16:45:22">2023-03-12</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/archives/47530237.html" title="146-LRU 缓存(力扣题解)"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/s2.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="146-LRU 缓存(力扣题解)"/></a><div class="content"><a class="title" href="/archives/47530237.html" title="146-LRU 缓存(力扣题解)">146-LRU 缓存(力扣题解)</a><time datetime="2023-03-03T14:14:32.000Z" title="发表于 2023-03-03 22:14:32">2023-03-03</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/archives/fcbe13c3.html" title="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)"><img src="https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/1103346.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)"/></a><div class="content"><a class="title" href="/archives/fcbe13c3.html" title="6-防止缓存击穿与protobuf通信(Go实现分布式缓存)">6-防止缓存击穿与protobuf通信(Go实现分布式缓存)</a><time datetime="2023-02-28T12:44:11.000Z" title="发表于 2023-02-28 20:44:11">2023-02-28</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
<i class="fas fa-folder-open"></i>
<span>分类</span>
<a class="card-more-btn" href="/categories/" title="查看更多">
<i class="fas fa-angle-right"></i></a>
</div>
<ul class="card-category-list" id="aside-cat-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Golang/"><span class="card-category-list-name">Golang</span><span class="card-category-list-count">34</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Golang%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86/"><span class="card-category-list-name">Golang底层原理</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/JavaWeb/"><span class="card-category-list-name">JavaWeb</span><span class="card-category-list-count">10</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Kubernetes/"><span class="card-category-list-name">Kubernetes</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/SpringBoot/"><span class="card-category-list-name">SpringBoot</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/mysql/"><span class="card-category-list-name">mysql</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/%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E6%84%9F%E6%83%B3/"><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/%E5%89%8D%E7%AB%AF%E6%8A%80%E6%9C%AF/"><span class="card-category-list-name">前端技术</span><span class="card-category-list-count">1</span></a></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/%E5%B9%B6%E6%9F%A5%E9%9B%86/" style="font-size: 1.1em; color: #999">并查集</a> <a href="/tags/Tomcat/" style="font-size: 1.1em; color: #999">Tomcat</a> <a href="/tags/Response/" style="font-size: 1.1em; color: #999">Response</a> <a href="/tags/test/" style="font-size: 1.1em; color: #999">test</a> <a href="/tags/operating-system/" style="font-size: 1.19em; color: #999da1">operating system</a> <a href="/tags/Golang%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86/" style="font-size: 1.23em; color: #999ea6">Golang底层原理</a> <a href="/tags/gin/" style="font-size: 1.23em; color: #999ea6">gin</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" style="font-size: 1.14em; color: #999b9d">数据结构</a> <a href="/tags/Computer-Networking/" style="font-size: 1.1em; color: #999">Computer Networking</a> <a href="/tags/GoWeb/" style="font-size: 1.32em; color: #99a2ae">GoWeb</a> <a href="/tags/Golang/" style="font-size: 1.5em; color: #99a9bf">Golang</a> <a href="/tags/JavaWeb/" style="font-size: 1.37em; color: #99a4b2">JavaWeb</a> <a href="/tags/JavaScript/" style="font-size: 1.1em; color: #999">JavaScript</a> <a href="/tags/Session/" style="font-size: 1.1em; color: #999">Session</a> <a href="/tags/Request/" style="font-size: 1.1em; color: #999">Request</a> <a href="/tags/SpringBoot/" style="font-size: 1.1em; color: #999">SpringBoot</a> <a href="/tags/Maven/" style="font-size: 1.1em; color: #999">Maven</a> <a href="/tags/gorm/" style="font-size: 1.1em; color: #999">gorm</a> <a href="/tags/Servlet/" style="font-size: 1.14em; color: #999b9d">Servlet</a> <a href="/tags/sqlx/" style="font-size: 1.1em; color: #999">sqlx</a> <a href="/tags/Go/" style="font-size: 1.46em; color: #99a7bb">Go</a> <a href="/tags/Algorithm/" style="font-size: 1.41em; color: #99a5b7">Algorithm</a> <a href="/tags/Cookie/" style="font-size: 1.1em; color: #999">Cookie</a> <a href="/tags/JDBC/" style="font-size: 1.1em; color: #999">JDBC</a> <a href="/tags/%E5%8A%9B%E6%89%A3/" style="font-size: 1.19em; color: #999da1">力扣</a> <a href="/tags/MySQL/" style="font-size: 1.1em; color: #999">MySQL</a> <a href="/tags/JSP/" style="font-size: 1.1em; color: #999">JSP</a> <a href="/tags/HTTP/" style="font-size: 1.1em; color: #999">HTTP</a> <a href="/tags/MyBatis/" style="font-size: 1.1em; color: #999">MyBatis</a> <a href="/tags/%E4%B8%AA%E4%BA%BA%E5%AD%A6%E4%B9%A0%E6%84%9F%E6%83%B3/" style="font-size: 1.1em; color: #999">个人学习感想</a> <a href="/tags/mysql/" style="font-size: 1.1em; color: #999">mysql</a> <a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size: 1.41em; color: #99a5b7">算法</a> <a href="/tags/Cache/" style="font-size: 1.28em; color: #99a0aa">Cache</a> <a href="/tags/Web%E6%9C%8D%E5%8A%A1%E5%99%A8/" style="font-size: 1.1em; color: #999">Web服务器</a> <a href="/tags/Kubernetes/" style="font-size: 1.1em; color: #999">Kubernetes</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/" style="font-size: 1.19em; color: #999da1">数据库</a> <a href="/tags/redis/" style="font-size: 1.1em; color: #999">redis</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多">
<i class="fas fa-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/08/"><span class="card-archive-list-date">八月 2023</span><span class="card-archive-list-count">1</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">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/03/"><span class="card-archive-list-date">三月 2023</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/02/"><span class="card-archive-list-date">二月 2023</span><span class="card-archive-list-count">6</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><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/12/"><span class="card-archive-list-date">十二月 2022</span><span class="card-archive-list-count">13</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/11/"><span class="card-archive-list-date">十一月 2022</span><span class="card-archive-list-count">31</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/10/"><span class="card-archive-list-date">十月 2022</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">70</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="2024-08-23T16:37:37.725Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer" style="background-image: url('https://jiapengcheng.obs.cn-north-4.myhuaweicloud.com/img/thumb-1920-1092511.jpg')"><div id="footer-wrap"><div class="copyright">©2020 - 2024 By jpc901</div><div class="footer_custom_text"><div><a target="_blank" rel="noopener external nofollow noreferrer" href="https://beian.miit.gov.cn/">鄂ICP备2022006987号-1</a></div></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?v=4.13.0"></script><script src="/js/main.js?v=4.13.0"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/[email protected]/dist/fancybox/fancybox.umd.min.js"></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,
}, null))
},
run: (subtitleType) => {
if (true) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('https://cdn.jsdelivr.net/npm/[email protected]/dist/typed.umd.min.js').then(subtitleType)
}
} else {
subtitleType()
}
}
}
</script><script>function subtitleType () {
fetch('https://v1.hitokoto.cn')
.then(response => response.json())
.then(data => {
if (true) {
const from = '出自 ' + data.from
const sub = ["欢乐多,欢乐多🤪","嘿嘿,亿宝,我的亿宝😻😻😻","亿宝,可以捏捏你的小脸蛋吗😺😺","亿宝,卡哇伊~~~"]
sub.unshift(data.hitokoto, from)
typedJSFn.init(sub)
} else {
document.getElementById('subtitle').textContent = data.hitokoto
}
})
}
typedJSFn.run(subtitleType)
</script></div><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 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?v=4.13.0"></script></div></div></body></html>