Skip to content

Commit 7025349

Browse files
committed
[docs update]更新星球链接
1 parent fa0c6ca commit 7025349

File tree

7 files changed

+130
-10
lines changed

7 files changed

+130
-10
lines changed

README.en.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Read in other languages: [Mandarin](https://github.com/Snailclimb/JavaGuide/blob
1212
> 2. **Contribution Guide** : You are welcome to participate in [the maintenance of JavaGuide](https://github.com/Snailclimb/JavaGuide/issues/1235), it's a very rewarding thing to do.
1313
> 3. **PDF Version** : [JavaGuide Interview Blitz Edition PDF Version](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100029614&idx=1&sn=62993c5cf10265cb7018db7f1ec67250&chksm=4ea1fb6579d67273499b7243641d4ef372decd08047bfbb6dfb5843ef81c7ccba209086cf345#rd)
1414
> 4. **Illustrated Computer Fundamentals** : [Illustrated Computer Fundamentals PDF Download](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100021725&idx=1&sn=2db9664ca25363139a81691043e9fd8f&chksm=4ea19a1679d61300d8990f7e43bfc7f476577a81b712cf0f9c6f6552a8b219bc081efddb5c54#rd)
15-
> 5. **Planet of Knowledge** : Resume guide/Java learning/Interview guide/Interview booklet. You are welcome to join [My Knowledge Planet](https://sourl.cn/e7ee87)
15+
> 5. **Planet of Knowledge** : Resume guide/Java learning/Interview guide/Interview booklet. You are welcome to join [My Knowledge Planet](https://sourl.cn/v9dbdC)
1616
> 6. **Interview Special Edition** : For those who are preparing for the interview, you can consider the interview special edition: [Java Interview Advanced Guide].(https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (Very high quality, built specifically for interviews, free for planet users)
1717
> 7. **Reprint Instructions**: All the following articles are my (Guide) original if not stated at the beginning of the text, reproduced at the beginning of the text to indicate the source, if found malicious plagiarism / transport, will use legal weapons to defend their rights. Let's maintain a good technical creation environment together! ⛽️
1818

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
> 2. **贡献指南** :欢迎参与 [JavaGuide的维护工作](https://github.com/Snailclimb/JavaGuide/issues/1235),这是一件非常有意义的事情。
1212
> 3. **PDF版本**[《JavaGuide 面试突击版》PDF 版本](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100029614&idx=1&sn=62993c5cf10265cb7018db7f1ec67250&chksm=4ea1fb6579d67273499b7243641d4ef372decd08047bfbb6dfb5843ef81c7ccba209086cf345#rd)
1313
> 4. **图解计算机基础**[图解计算机基础 PDF 下载](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100021725&idx=1&sn=2db9664ca25363139a81691043e9fd8f&chksm=4ea19a1679d61300d8990f7e43bfc7f476577a81b712cf0f9c6f6552a8b219bc081efddb5c54#rd)
14-
> 5. **知识星球** : 简历指导/Java学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/e7ee87)
14+
> 5. **知识星球** : 简历指导/Java学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/v9dbdC)
1515
> 6. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,星球用户免费)
1616
> 7. **转载须知** :以下所有文章如非文首说明皆为我(Guide哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️
1717
@@ -31,7 +31,7 @@
3131
<tbody>
3232
<tr>
3333
<td align="center" valign="middle">
34-
<a href="https://sourl.cn/e7ee87">
34+
<a href="https://sourl.cn/v9dbdC">
3535
<img src="./media/sponsor/知识星球.png" style="margin: 0 auto;width:850px" /></a>
3636
</td>
3737
</tr>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
---
2+
title: Redis 内存碎片
3+
category: 数据库
4+
tag:
5+
- Redis
6+
---
7+
8+
## 什么是内存碎片?
9+
10+
你可以将内存碎片简单地理解为那些不可用的空闲内存。
11+
12+
举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。
13+
14+
![内存碎片](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/memory-fragmentation.png)
15+
16+
Redis 内存碎片虽然不会影响 Redis 性能,但是会增加内存消耗。
17+
18+
## 为什么会有 Redis 内存碎片?
19+
20+
Redis 内存碎片产生比较常见的 2 个原因:
21+
22+
**1、Redis 存储存储数据的时候向操作系统申请的内存空间可能会大于数据实际需要的存储空间。**
23+
24+
以下是这段 Redis 官方的原话:
25+
26+
> To store user keys, Redis allocates at most as much memory as the `maxmemory` setting enables (however there are small extra allocations possible).
27+
28+
Redis 使用 `zmalloc` 方法(Redis 自己实现的内存分配方法)进行内存分配的时候,除了要分配 `size` 大小的内存之外,还会多分配 `PREFIX_SIZE` 大小的内存。
29+
30+
`zmalloc` 方法源码如下(源码地址:https://github.com/antirez/redis-tools/blob/master/zmalloc.c):
31+
32+
```java
33+
void *zmalloc(size_t size) {
34+
// 分配指定大小的内存
35+
void *ptr = malloc(size+PREFIX_SIZE);
36+
if (!ptr) zmalloc_oom_handler(size);
37+
#ifdef HAVE_MALLOC_SIZE
38+
update_zmalloc_stat_alloc(zmalloc_size(ptr));
39+
return ptr;
40+
#else
41+
*((size_t*)ptr) = size;
42+
update_zmalloc_stat_alloc(size+PREFIX_SIZE);
43+
return (char*)ptr+PREFIX_SIZE;
44+
#endif
45+
}
46+
```
47+
48+
另外,Redis 可以使用多种内存分配器来分配内存( libc、jemalloc、tcmalloc),默认使用 [jemalloc](https://github.com/jemalloc/jemalloc),而 jemalloc 按照一系列固定的大小(8 字节、16 字节、32 字节......)来分配内存的。jemalloc 划分的内存单元如下图所示:
49+
50+
![jemalloc 内存单元示意图](https://img-blog.csdnimg.cn/6803d3929e3e46c1b1c9d0bb9ee8e717.png)
51+
52+
当程序申请的内存最接近某个固定值时,jemalloc 会给它分配相应大小的空间,就比如说程序需要申请 17 字节的内存,jemalloc 会直接给它分配 32 字节的内存,这样会导致有 15 字节内存的浪费。不过,jemalloc 专门针对内存碎片问题做了优化,一般不会存在过度碎片化的问题。
53+
54+
**2、频繁修改 Redis 中的数据也会产生内存碎片。**
55+
56+
当 Redis 中的某个数据删除时,Redis 通常不会轻易释放内存给操作系统。
57+
58+
这个在 Redis 官方文档中也有对应的原话:
59+
60+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/redis-docs-memory-optimization.png)
61+
62+
文档地址:https://redis.io/topics/memory-optimization
63+
64+
## 如何查看 Redis 内存碎片的信息?
65+
66+
使用 `info memory` 命令即可查看 Redis 内存相关的信息。下图中每个参数具体的含义,Redis 官方文档有详细的介绍:https://redis.io/commands/INFO
67+
68+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/redis-info-memory.png)
69+
70+
Redis 内存碎片率的计算公式:`mem_fragmentation_ratio` (内存碎片率)= `used_memory_rss` (操作系统实际分配给 Redis 的物理内存空间大小)/ `used_memory`(Redis 内存分配器为了存储数据实际申请使用的内存空间大小)
71+
72+
也就是说,`mem_fragmentation_ratio` (内存碎片率)的值越大代表内存碎片率越严重。
73+
74+
一定不要误认为`used_memory_rss` 减去 `used_memory`值就是内存碎片的大小!!!这不仅包括内存碎片,还包括其他进程开销,以及共享库、堆栈等的开销。
75+
76+
很多小伙伴可能要问了:“多大的内存碎片率才是需要清理呢?”。
77+
78+
通常情况下,我们认为 `mem_fragmentation_ratio > 1.5` 的话才需要清理内存碎片。 `mem_fragmentation_ratio > 1.5` 意味着你使用 Redis 存储实际大小 2G 的数据需要使用大于 3G 的内存。
79+
80+
如果想要快速查看内存碎片率的话,你还可以通过下面这个命令:
81+
82+
```bash
83+
> redis-cli -p 6379 info | grep mem_fragmentation_ratio
84+
```
85+
86+
另外,内存碎片率可能存在小于 1 的情况。这种情况我在日常使用中还没有遇到过,感兴趣的小伙伴可以看看这篇文章 [故障分析 | Redis 内存碎片率太低该怎么办?- 爱可生开源社区](https://mp.weixin.qq.com/s/drlDvp7bfq5jt2M5pTqJCw)
87+
88+
## 如何清理 Redis 内存碎片?
89+
90+
Redis4.0-RC3 版本以后自带了内存整理,可以避免内存碎片率过大的问题。
91+
92+
直接通过 `config set` 命令将 `activedefrag` 配置项设置为 `yes` 即可。
93+
94+
```bash
95+
config set activedefrag yes
96+
```
97+
98+
具体什么时候清理需要通过下面两个参数控制:
99+
100+
```bash
101+
# 内存碎片占用空间达到 500mb 的时候开始清理
102+
config set active-defrag-ignore-bytes 500mb
103+
# 内存碎片率大于 1.5 的时候开始清理
104+
config set active-defrag-threshold-lower 50
105+
```
106+
107+
通过 Redis 自动内存碎片清理机制可能会对 Redis 的性能产生影响,我们可以通过下面两个参数来减少对 Redis 性能的影响:
108+
109+
```bash
110+
# 内存碎片清理所占用 CPU 时间的比例不低于 20%
111+
config set active-defrag-cycle-min 20
112+
# 内存碎片清理所占用 CPU 时间的比例不高于 50%
113+
config set active-defrag-cycle-max 50
114+
```
115+
116+
另外,重启节点可以做到内存碎片重新整理。如果你采用的是高可用架构的 Redis 集群的话,你可以将碎片率过高的主节点转换为从节点,以便进行安全重启。
117+
118+
## 参考
119+
120+
- Redis 官方文档:https://redis.io/topics/memory-optimization
121+
- Redis 核心技术与实战 - 极客时间 - 删除数据后,为什么内存占用率还是很高?:https://time.geekbang.org/column/article/289140
122+
- Redis 源码解析——内存分配:https://shinerio.cc/2020/05/17/redis/Redis%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E2%80%94%E2%80%94%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/

docs/distributed-system/distributed-transaction.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
这部分内容为我的星球专属,已经整理到了[《Java面试进阶指北 打造个人的技术竞争力》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7?# )中。
44

5-
欢迎加入我的星球,[一个纯 Java 面试交流圈子 !Ready!](https://sourl.cn/e7ee87) (点击链接了解星球详细信息,还有专属优惠款可以领取)。
5+
欢迎加入我的星球,[一个纯 Java 面试交流圈子 !Ready!](https://sourl.cn/v9dbdC) (点击链接了解星球详细信息,还有专属优惠款可以领取)。
66

77
![](https://img-blog.csdnimg.cn/57cedfa4d3d1425a8e4c6a6807d8f732.png)

docs/home.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ title: JavaGuide(Java学习&&面试指南)
66
<a href="https://t.1yb.co/GXLF"><img src="https://img-blog.csdnimg.cn/2f61f3e2d1f2427da977340919e41616.png" style="margin: 0 auto;width:850px" /></a>
77

88
> 1. **贡献指南** :欢迎参与 [JavaGuide 的维护工作](https://github.com/Snailclimb/JavaGuide/issues/1235),这是一件非常有意义的事情。
9-
> 2. **知识星球** : 简历指导/Java 学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/e7ee87)
9+
> 2. **知识星球** : 简历指导/Java 学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/v9dbdC)
1010
> 3. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造)
1111
> 4. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️
1212
@@ -23,13 +23,11 @@ title: JavaGuide(Java学习&&面试指南)
2323
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues" />
2424
</p>
2525
<p>
26-
<a href="https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247514565&idx=1&sn=02995b7591bef3361fd5be06d6bebdbc&chksm=cea1f60ef9d67f184057833b01ee7a820ffc6cc201bc2f6dae9f4c3d93fe7962bb3ab08adbfd&token=1069133552&lang=zh_CN#rd">
26+
<a href="https://sourl.cn/v9dbdC">
2727
<img src="../media/sponsor/知识星球.png" style="margin: 0 auto; width: 850px;" />
2828
</a>
2929
</p>
3030
</div>
31-
32-
3331
在大三准备面试的时候,我开源了 JavaGuide 。我把自己准备面试过程中的一些总结都毫不保留地通过 JavaGuide 分享了出来。
3432

3533
开源 JavaGuide 初始想法源于自己的个人那一段比较迷茫的学习经历。主要目的是为了通过这个开源平台来帮助一些在学习 Java 或者面试过程中遇到问题的小伙伴。

docs/readme.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ action:
1616
👉 **[我整理汇总了一些 Java 面试相关的 PDF 资料(质量很高!不要在看网上的哪些东拼西凑的垃圾面试题了!!!),希望对需要的小伙伴有帮助(点击下载)!](https://t.1yb.co/GXLF)**
1717

1818
> 1. **贡献指南** :欢迎参与 [JavaGuide 的维护工作](https://github.com/Snailclimb/JavaGuide/issues/1235),这是一件非常有意义的事情。
19-
> 2. **知识星球** : 简历指导/Java 学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/e7ee87)
19+
> 2. **知识星球** : 简历指导/Java 学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/v9dbdC)
2020
> 3. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造)
2121
> 4. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️
2222

docs/system-design/framework/netty.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
这部分内容为我的星球专属,已经整理到了[《Java面试进阶指北 打造个人的技术竞争力》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7?# )中。
44

5-
欢迎加入我的星球,[一个纯 Java 面试交流圈子 !Ready!](https://sourl.cn/e7ee87) (点击链接了解星球详细信息,还有专属优惠款可以领取)。
5+
欢迎加入我的星球,[一个纯 Java 面试交流圈子 !Ready!](https://sourl.cn/v9dbdC) (点击链接了解星球详细信息,还有专属优惠款可以领取)。
66

77
![](https://img-blog.csdnimg.cn/edc9fdecdfa644e98784a379f46c7a8b.png)

0 commit comments

Comments
 (0)