Skip to content

Commit

Permalink
添加《项脊轩志》;面试题更新
Browse files Browse the repository at this point in the history
  • Loading branch information
971230 committed Oct 3, 2024
1 parent a985de3 commit 1f29a5b
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 36 deletions.
5 changes: 3 additions & 2 deletions docs/assets/css/extra.css
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ md-header__button md-logo {

:root {
/* 普通文字 */
--md-text-font: "PingFang-Bold";
--md-text-font: "PingFang";
/* 代码字体 */
--md-code-font: "Longjf Nerd Font";
}
Expand Down Expand Up @@ -210,5 +210,6 @@ blockquote {

code:not(.ex):not(.md-code__content) {
color: #b88b22;
font-family: "LXGWZhenKai";
font-weight: bold;
font-family: "Longjf Nerd Font";
}
159 changes: 125 additions & 34 deletions docs/开始阅读/面试题/遇到的面试题整理.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,72 @@ status: new

## 5.redis常见数据类型以及对应的应用场景?

**String(字符串)**:Redis中最基础的数据类型,<wavy>key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数)</wavy>,value的最大长度可达512MB.

!!! Note ""
应用场景:

- **缓存**:由于字符串类型的灵活性,它经常被用来<wavy>缓存各种数据,如用户信息、商品详情等</wavy>,以减少对后端数据库的访问压力。
- **计数器**:<wavy>利用`INC`R和`DECR`等命令可以实现计数器的功能</wavy>,如统计网站访问量、文章点赞数等。
- **分布式锁**:<wavy>使用`SET`命令的`NX`选项(只有当键不存在时才设置值)和`EX`选项(设置过期时间)</wavy>,可以实现简单的分布式锁功能。

**Hash(哈希)**:是键值对(key - value)集合,形式如:`value=[{field1,value1},...{fieldN,valueN}]`,非常适合用来存储对象,如用户信息。

!!! Note ""
应用场景:

- **存储对象**:哈希类型非常适合存储具有多个属性的对象,如用户信息(用户名、密码、邮箱等)。
- **部分数据变更**:适合存储那些经常变动的信息,如用户的偏好设置。

**List(列表)**:是一个简单的字符串列表,<wavy>按照插入顺序排序</wavy>,并支持从头部或尾部插入和删除操作。

!!! Note ""
应用场景:

- **消息队列**:利用List的`PUSH`操作将任务存储在List中,然后工作线程使用`POP`操作取出任务执行。
- **最新列表**:使用`LPUSH`命令将最新数据插入到列表头部,`LTRIM`命令限制列表长度,从而实现最新N个元素的列表。

**Set(集合)**:是一个<wavy>无序并唯一的键值集合</wavy>,可以对集合执行交集、并集、差集等操作。

!!! Note ""
应用场景:

- **标签系统**:集合可以用来实现标签功能,一个用户可以对应多个标签,多个用户也可以对应同一个标签。
- **唯一对象集合**:存储唯一对象的集合,如网站的唯一访客。

**ZSet(有序集合)**:与集合类似,保留了集合不能有重复成员的特性,但<wavy>每个成员都关联了一个score,用于排序</wavy>。

!!! Note ""
应用场景:

- **排行榜**:维护一个排行榜,如游戏中的得分排行。
- **按分数排序**:根据时间和权重对元素进行排序,如新闻流的时间线。

**Bitmaps(位图)**:虽然不是一种独立的数据类型,但可以通过将字符串视为位图来实现高效的空间使用。

!!! Note ""
应用场景:

- **用户行为追踪**:记录哪些用户登录过。
- **大规模数据统计**:估算某个时间段内的唯一访客数量。

**HyperLogLog**:一种专门用来估算大量数据的基数(不重复元素的数量)的数据结构。

!!! Note ""
应用场景:

- **唯一访客数估算**:在不过多消耗内存的情况下估算网站的唯一访客数。

**Streams(流)**:Redis 5.0引入的一种新的数据类型,<wavy>用于构建消息队列,支持持久化和消费</wavy>。

!!! Note ""
应用场景:

- **实时数据分析**:如日志处理。
- **事件驱动机制**:构建微服务架构中的事件驱动机制。

[相关链接🔗](https://www.cnblogs.com/xiaolincoding/p/16370783.html)

## 6.MQ消息积压如何解决,如何保证消息消费的顺序性,如何保证消息不丢失,如何解决消息重复解决

## 7.jvm为什么会存在stw的问题?
Expand All @@ -23,6 +89,29 @@ status: new

## 9.什么情况下会产生表锁,复合索引失效的情况有哪几种?

### MySQL中产生表锁的情况
InnoDB存储引擎:

- **行级锁升级**:虽然InnoDB主要使用行级锁,但在某些情况下,如当锁定的行数量过多时,可能会升级为表锁。
如果查询的行数占总行数的比例较高(例如超过20%),MySQL可能会选择使用表锁以提高效率。
- **复合索引失效导致行锁变表锁**:如果复合索引失效,例如WHERE条件中的列没有索引,或者索引选择不当,可能会导致行锁升级为表锁。
- **显式锁定**:使用`SELECT ... FOR UPDATE``SELECT ... LOCK IN SHARE MODE`时,如果没有合适的索引,也可能导致表锁。
- **DDL操作**:类似于MyISAM,执行`ALTER TABLE`等DDL语句时,InnoDB也会使用表级锁。

### 复合索引失效的情况
**复合索引**(或联合索引)是指在多个列上创建的索引。当查询条件符合索引的最左侧字段时,索引才能被有效地利用。以下是一些可能导致复合索引失效的情况:

- **未按照索引列顺序使用**:如果查询条件中没有使用索引的第一个字段,那么索引将完全失效。
- **使用函数或表达式**:如果查询条件中包含了对索引列的函数调用或数学运算,那么索引可能不会被使用。
- **使用OR连接条件**:如果`WHERE`子句中包含`OR`操作,并且连接的列不在同一个索引上,或者没有按照索引的顺序使用,索引可能不会被使用。
- **LIKE操作符以%开头**:当LIKE操作符的模式以通配符%开头时,如`LIKE '%abc%'`,MySQL不能有效地使用索引。
- **隐式类型转换**:如果索引列是整型,而查询条件是字符串,MySQL需要做类型转换,这种情况下索引可能不会被使用。
- **范围查询**:如果查询条件中某个列使用了范围查询(如>或<),那么索引中该列之后的所有列都将失效。
- **使用IN或NOT IN**:当`IN``NOT IN`的参数较多时,MySQL可能会选择全表扫描而非使用索引。
- **使用!=或<>操作符**:使用!=或<>操作符时,索引可能不会被使用。
- **ORDER BY使用不当**:如果`ORDER BY`后面的列不是索引的一部分,或者没有正确使用索引,可能会导致索引失效。
- **数据分布不均**:如果索引列的数据分布不均匀,MySQL可能会认为全表扫描更快,从而不使用索引。

## 10.微服务的优缺点分别是什么?说一下你在项目开发中遇到的坑?

## 11.所知道的微服务技术栈?
Expand All @@ -41,12 +130,12 @@ status: new

每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类有一个@SpringBootApplication注解,它是一个组合注解;

!!! note
1️⃣ <span style="color: #BCAD4E;">@EnableAutoConfiguration</span >:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置
!!! note ""
1️⃣ `@EnableAutoConfiguration`:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置

2️⃣ <span style="color: #BCAD4E;">@SpringBootConfiguration</span>(内部为@Configuration): 标注这个类是一个配置类;
2️⃣ `@SpringBootConfiguration`(内部为@Configuration): 标注这个类是一个配置类;

3️⃣ <span style="color: #BCAD4E;">@ComponentScan</span>:组件扫描,可自动发现和装配Bean,自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中
3️⃣ `@ComponentScan`:组件扫描,可自动发现和装配Bean,自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中

**SpringBoot启动类**

Expand Down Expand Up @@ -83,7 +172,7 @@ refresh方法
## 14.MySQL数据库索引作用和优缺点。如何创建索引
### **➊优缺点**

!!! Note
!!! Note ""
1️⃣虽然索引可以大大<u>**提高数据的查询速度**</u>,但是提高查询速度的同时,将<u>**会降低INSERT、UPDATE、DELETE的速度**</u>,因为更新表时,MySQL不仅要保存数据,还要保存索引文件,这样如果索引滥用的话,就会大大降低数据库写入的速度。

2️⃣建立索引<u>**会占用磁盘空间**</u>,一般情况这个问题不会很严重,但是如果你在一个大表上创建了多种索引,索引文件就会大大增加。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要你花时间去建立最优秀的索引,或者优化查询语句,分表,或者分区。
Expand All @@ -101,12 +190,12 @@ CREATE TABLE 表名(
);
```

!!! Tip "说明:"
UNIQUE:可选。表示索引为唯一性索引。</br>
FULLTEXT:可选。表示索引为全文索引。</br>
SPATIAL:可选。表示索引为空间索引。</br>
!!! Tip "参数说明:"
`UNIQUE`:可选。表示索引为唯一性索引。</br>
`FULLTEXT`:可选。表示索引为全文索引。</br>
`SPATIAL`:可选。表示索引为空间索引。</br>

INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。</br>
`INDEX`和`KEY`:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。</br>
索引名:可选。给创建的索引取一个新名称。</br>
字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。</br>
长度:可选。指索引的长度,必须是字符串类型才可以使用。</br>
Expand Down Expand Up @@ -161,17 +250,19 @@ yml->ymal->properties
## 19.10000个数据包含字母和数字,用ASCLL码排序,怎么实现,comparator比较器怎么实现
## 20.什么是二叉树、红黑树
## 20.什么是二叉树、红黑树、B+树
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。
红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
(1)<u>每个节点或者是黑色,或者是红色。</u>
(2)<u>根节点是黑色。</u>
(3)<u>每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]</u>
(4)<u>如果一个节点是红色的,则它的子节点必须是黑色的。</u>
(5)<u>从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。</u>
!!! Note "红黑树的特性"
1. 每个节点或者是黑色,或者是红色。
2. 根节点是黑色。
3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4. 如果一个节点是红色的,则它的子节点必须是黑色的。
5. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。
Expand All @@ -183,28 +274,28 @@ R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊
## 22.HashMap和ConcurrentHashMap;底层实现原理等
### 底层的实现方式是<span style="text-decoration: underline; text-decoration-color: #FFFFFF; text-decoration-style: wavy;">数组+链表+红黑树</span>(加红黑树为了解决二叉查找树的缺陷,因为二叉查找树可能会退化成线性结构)
底层的实现方式是<wavy>数组+链表+红黑树</wavy>(加红黑树为了解决二叉查找树的缺陷,因为二叉查找树可能会退化成线性结构)
#### ①HashMap基础知识
**1、数组结构**: <u>存储区间连续、内存占用严重、空间复杂度大</u>
1. **数组结构**: <wavy>存储区间连续、内存占用严重、空间复杂度大</wavy><br>
**优点**:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)<br>
**缺点**:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。
优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)
缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。
**2、链表结构**:<u>存储区间离散、占用内存宽松、空间复杂度小</u>
2. **链表结构**:<wavy>存储区间离散、占用内存宽松、空间复杂度小</wavy><br>
**优点**:插入删除速度快,内存利用率高,没有固定大小,扩展灵活<br>
**缺点**:不能随机查找,每次都是从第一个开始遍历(查询效率低)
优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活
缺点:不能随机查找,每次都是从第一个开始遍历(查询效率低)
**3、哈希表结构**:<u>结合数组结构和链表结构的优点,从而实现了查询和修改效率高,插入和删除效率也高的一种数据结构</u>
3. **哈希表结构**:<wavy>结合数组结构和链表结构的优点,从而实现了查询和修改效率高,插入和删除效率也高的一种数据结构</wavy>
!!! 常见的HashMap就是这样的一种数据结构
1️⃣HashMap底层是一个Entry[ ]数组,当存放数据时,会根据hash算法来计算数据的存放位置
!!! Note "常见的HashMap就是这样的一种数据结构"
1️⃣HashMap底层是一个`Entry[ ]`数组,当存放数据时,会根据hash算法来计算数据的存放位置
2️⃣算法:hash(key)%n , n就是数组的长度,其实也就是集合的容量
2️⃣算法:`hash(key)%n` , n就是数组的长度,其实也就是集合的容量
3️⃣当计算的位置没有数据的时候,会直接存放数据
4️⃣当计算的位置,有数据时,会发生**hash冲突/hash碰撞**,解决的办法就是采用链表的结构,在对应的数据位置存放链表的头节点,对于这个链表来说,每次新加的节点会从头部位置开始加入,也就是说,数组中的永远是新节点.
4️⃣当计算的位置,有数据时,会发生 **hash冲突/hash碰撞** ,<wavy>解决的办法就是采用链表的结构,在对应的数据位置存放链表的头节点,对于这个链表来说,每次新加的节点会从头部位置开始加入,也就是说,数组中的永远是新节点</wavy>.
#### ②HashMap扩容
Expand All @@ -214,11 +305,11 @@ R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊
static final float DEFAULT_LOAD_FACTOR = 0.75f;
```
> 前面的讲述已经发现,当你空间只有仅仅为10的时候是很容易造成2个对象的hashcode所对应的地址是一个位置的情况。这样就造成 2个对象会形成散列桶(链表)。
>
> 这时就有一个加载因子的参数,值默认为0.75 ,如果你hashmap的 空间有100那么当你插入了75个元素的时候 hashmap就需要扩容了,不然的话会<u>形成很长的散列桶结构</u>,对于查询和插入都会增加时间,因为它要一个一个的equals比较。
>
> 但又不能让加载因子很小,如0.01,这样显然是不合适的,<u>频繁扩容会大大消耗你的内存</u>。这时就存在着一个平衡,jdk中默认是0.75,当然负载因子可以根据自己的实际情况进行调整。
前面的讲述已经发现,当你空间只有仅仅为10的时候是很容易造成2个对象的hashcode所对应的地址是一个位置的情况。这样就造成2个对象会形成散列桶(链表)。

这时就有一个加载因子的参数,值默认为0.75 ,如果你hashmap的空间有100那么当你插入了75个元素的时候hashmap就需要扩容了,不然的话会<wavy>形成很长的散列桶结构</wavy>,对于查询和插入都会增加时间,因为它要一个一个的equals比较。

但又不能让加载因子很小,如0.01,这样显然是不合适的,<wavy>频繁扩容会大大消耗你的内存</wavy>。这时就存在着一个平衡,jdk中默认是0.75,当然负载因子可以根据自己的实际情况进行调整。

2、**为何随机增删、查询效率都很高的原因是?**
**原因**: 增删是在链表上完成的,而查询只需扫描部分,则效率高。(存在链表退化问题)
Expand Down
34 changes: 34 additions & 0 deletions docs/日常/文字/文-项脊轩志.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
hide:
- toc
---

<div class="essay_sketch">
<div class="essay_sketch_margin"></div>
<h1 style="color: black">项脊轩志</h1>
<p style="text-align: center;">归有光〔明代〕</p>

<P>
项脊轩,旧南阁子也。室仅方丈,可容一人居。百年老屋,尘泥渗漉,雨泽下注;每移案,顾视无可置者。又北向,不能得日,日过午已昏。余稍为修葺,使不上漏。前辟四窗,垣墙周庭,以当南日,日影反照,室始洞然。又杂植兰桂竹木于庭,旧时栏楯,亦遂增胜。借书满架,偃仰啸歌,冥然兀坐,万籁有声;而庭阶寂寂,小鸟时来啄食,人至不去。三五之夜,明月半墙,桂影斑驳,风移影动,珊珊可爱。
</P>

<p>
然余居于此,多可喜,亦多可悲。先是庭中通南北为一。迨诸父异爨,内外多置小门墙,往往而是,东犬西吠,客逾庖而宴,鸡栖于厅。庭中始为篱,已为墙,凡再变矣。家有老妪,尝居于此。妪,先大母婢也,乳二世,先妣抚之甚厚。室西连于中闺,先妣尝一至。妪每谓余曰:“某所,而母立于兹。”妪又曰:“汝姊在吾怀,呱呱而泣;娘以指叩门扉曰:‘儿寒乎?欲食乎?’吾从板外相为应答。”语未毕,余泣,妪亦泣。余自束发读书轩中,一日,大母过余曰:“吾儿,久不见若影,何竟日默默在此,大类女郎也?”比去,以手阖门,自语曰:“吾家读书久不效,儿之成,则可待乎!”顷之,持一象笏至,曰:“此吾祖太常公宣德间执此以朝,他日汝当用之!”瞻顾遗迹,如在昨日,令人长号不自禁。
</p>

<p>
轩东故尝为厨,人往,从轩前过。余扃牖而居,久之,能以足音辨人。轩凡四遭火,得不焚,殆有神护者。
</p>

<p>
项脊生曰:“蜀清守丹穴,利甲天下,其后秦皇帝筑女怀清台;刘玄德与曹操争天下,诸葛孔明起陇中。方二人之昧昧于一隅也,世何足以知之,余区区处败屋中,方扬眉、瞬目,谓有奇景。人知之者,其谓与坎井之蛙何异?”
</p>

<p>
余既为此志,后五年,吾妻来归,时至轩中,从余问古事,或凭几学书。吾妻归宁,述诸小妹语曰:“闻姊家有阁子,且何谓阁子也?”其后六年,吾妻死,室坏不修。其后二年,余久卧病无聊,乃使人复葺南阁子,其制稍异于前。然自后余多在外,不常居。
</p>

<p>
庭有枇杷树,吾妻死之年所手植也,今已亭亭如盖矣。
</p>
</div>
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ nav:
- 《回忆-奶奶》: 日常/文字/回忆-奶奶.md
- 《回忆-爷爷》: 日常/文字/回忆-爷爷.md
- 《回忆-外公》: 日常/文字/回忆-外公.md
- 《项脊轩志》: 日常/文字/文-项脊轩志.md
- 黑暗料理:
- 日常/厨艺/index.md
- 青椒炒肉: 日常/厨艺/青椒炒肉.md
Expand Down

0 comments on commit 1f29a5b

Please sign in to comment.