diff --git a/2023/AugESC/index.html b/2023/AugESC/index.html index 1ab7e71..04fd88f 100644 --- a/2023/AugESC/index.html +++ b/2023/AugESC/index.html @@ -154,18 +154,18 @@ diff --git a/2023/Control Globally, Understand Locally/index.html b/2023/Control Globally, Understand Locally/index.html index 984100a..2e5d08b 100644 --- a/2023/Control Globally, Understand Locally/index.html +++ b/2023/Control Globally, Understand Locally/index.html @@ -166,18 +166,18 @@ diff --git a/2023/DQ-HGAN/index.html b/2023/DQ-HGAN/index.html index 85b157a..606fcb3 100644 --- a/2023/DQ-HGAN/index.html +++ b/2023/DQ-HGAN/index.html @@ -160,18 +160,18 @@ diff --git a/2023/FADO/index.html b/2023/FADO/index.html index 46b9238..17c700f 100644 --- a/2023/FADO/index.html +++ b/2023/FADO/index.html @@ -155,18 +155,18 @@ diff --git a/2023/HEAL_ A Knowledge Graph for Distress Management Conversations/index.html b/2023/HEAL_ A Knowledge Graph for Distress Management Conversations/index.html index 7d1a7ba..b842aae 100644 --- a/2023/HEAL_ A Knowledge Graph for Distress Management Conversations/index.html +++ b/2023/HEAL_ A Knowledge Graph for Distress Management Conversations/index.html @@ -154,18 +154,18 @@ diff --git a/2023/Knowledge-enhanced Mixed-initiative Dialogue System for Emotional Support Conversations/index.html b/2023/Knowledge-enhanced Mixed-initiative Dialogue System for Emotional Support Conversations/index.html index 4a506e1..6191192 100644 --- a/2023/Knowledge-enhanced Mixed-initiative Dialogue System for Emotional Support Conversations/index.html +++ b/2023/Knowledge-enhanced Mixed-initiative Dialogue System for Emotional Support Conversations/index.html @@ -155,18 +155,18 @@ diff --git a/2023/MISC_ A MIxed Strategy-Aware Model Integrating COMET for Emotional Support Conversation/index.html b/2023/MISC_ A MIxed Strategy-Aware Model Integrating COMET for Emotional Support Conversation/index.html index f04b1eb..e7c3fed 100644 --- a/2023/MISC_ A MIxed Strategy-Aware Model Integrating COMET for Emotional Support Conversation/index.html +++ b/2023/MISC_ A MIxed Strategy-Aware Model Integrating COMET for Emotional Support Conversation/index.html @@ -155,18 +155,18 @@ diff --git a/2023/Recipes for building an open-domain chatbot/index.html b/2023/Recipes for building an open-domain chatbot/index.html index 463e239..b7e055d 100644 --- a/2023/Recipes for building an open-domain chatbot/index.html +++ b/2023/Recipes for building an open-domain chatbot/index.html @@ -153,18 +153,18 @@ diff --git a/2023/Towards Emotional Support Dialog Systems/index.html b/2023/Towards Emotional Support Dialog Systems/index.html index 8412096..b2bd2b3 100644 --- a/2023/Towards Emotional Support Dialog Systems/index.html +++ b/2023/Towards Emotional Support Dialog Systems/index.html @@ -153,18 +153,18 @@ diff --git a/Docker/576507-docker1.png b/2024/Docker/576507-docker1.png similarity index 100% rename from Docker/576507-docker1.png rename to 2024/Docker/576507-docker1.png diff --git a/Docker/index.html b/2024/Docker/index.html similarity index 94% rename from Docker/index.html rename to 2024/Docker/index.html index 8df627d..85242d4 100644 --- a/Docker/index.html +++ b/2024/Docker/index.html @@ -19,27 +19,27 @@ - + - + - + - + - + - + - + - + Docker | 闻 @@ -155,18 +155,18 @@ @@ -198,7 +198,7 @@
- +
+
LLM人工对齐算法
+ + -
-
- + + + +

TODOLIST

+

RM + PPO

+

DPO

+

ReMax和GRPO

+

RLOO

-
- -
+
- -
-
+ + + - + + + + + - - - - - diff --git "a/tags/Java\346\225\260\346\215\256\347\273\223\346\236\204/index.html" b/LLM/index.html similarity index 70% rename from "tags/Java\346\225\260\346\215\256\347\273\223\346\236\204/index.html" rename to LLM/index.html index dc05ddd..bf1c411 100644 --- "a/tags/Java\346\225\260\346\215\256\347\273\223\346\236\204/index.html" +++ b/LLM/index.html @@ -19,25 +19,27 @@ - - - - + + + + - + + + - + - + -标签: Java数据结构 | 闻 +LLM | 闻 @@ -149,18 +151,18 @@ @@ -181,50 +183,97 @@ -
+
+ + +
-
-
-
-

Java数据结构 - 标签 + +
+ + + + + + + +
+

+ LLM

-

+ + + + + -
-
- - -
diff --git a/JUC/index.html b/Linux-Tool/index.html similarity index 51% rename from JUC/index.html rename to Linux-Tool/index.html index 3566835..f61d1ae 100644 --- a/JUC/index.html +++ b/Linux-Tool/index.html @@ -19,32 +19,28 @@ - + - - + + - + - - - - - + + - + - - + - + -Java 并发基础 | 闻 +Linux-Tool | 闻 @@ -144,7 +140,7 @@ -
-

ThreadLocal

-

每一个线程都有自己的专属本地变量,通过空间换时间的方式避免并发下线程安全问题

+

Vim

+

基本模式切换

    -
  • 完整的一次请求处理,于唯一一个线程中执行,可以通过 ThreadLocal -共享数据
  • -
  • ThreadLocal.set 方法是将值存储到 Thread 线程本身的 -ThreadLocalMap 里面
  • +
  • i:进入插入模式,从光标前插入文本。
  • +
  • a:进入插入模式,从光标后插入文本。
  • +
  • Esc:退出插入模式,回到正常模式。
  • +
  • v:进入可视模式,用于选择文本块。
  • +
  • V 或 +vv:进入可视行模式,选择整行文本。
  • +
  • Ctrl + v:进入可视块模式,选择矩形区域。
-

原理

-
public class ThreadLocal<T> {
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
// 存放数据
private Entry[] table;
}
}
-

整体结构图

- -img -

引用关系图

- -img -

Q&A

-

Entry的key为什么设计成弱引用?

-

ThreadLocal 变量生命周期结束后,ThreadLocal 对象就可以被回收;

-

ThreadLocal为什么会导致内存泄露,如何解决?

-

虽然 get、set 或 remove 方法会回收 key 为 null 的 value -值,但是如果没有调用这些方法,Entry 和ThreadLocalMap -将会长期存在下去,会导致内存泄露;

-

使用完 ThreadLocal 对象之后,调用 remove 方法;

-

ThreadLocal 是如何定位数据的?

-

int i = key.threadLocalHashCode & (len-1);

-

如果有冲突就通过线性探测再散列,直到找到空 bin;

-
-

其他Hash冲突解决方法:开放寻址法(再散列)、拉链法

-
-

ThreadLocal 是如何扩容的?

-

父子线程如何共享数据?

-

InheritableThreadLocal:初始化时会拷贝一份父线程中 ThreadLocal -值,到子线程 InheritableThreadLocal 中;

-

ThreadLocal 作为成员变量时,为什么定义成 static -更好?

-

将 ThreadLocal 定义为 static 可以确保所有线程都访问同一个 ThreadLocal -实例,但它们各自存储的数据是独立的;

-

确保它们的生命周期与线程的生命周期一致,而不是与类的实例的生命周期一致;

-

使用 InheritableThreadLocal -时,如果父线程中重新set值,在子线程中能够正确的获取修改后的新值吗?

-

不会影响到已经存在的子线程中 InheritableThreadLocal -的值,子线程将保持它在创建时从父线程中继承的原始值;

-

JMM

+

光标移动

    -
  • 抽象了 happens-before -原则来解决这个指令重排序问题,保证多线程环境下数据的一致性和可见性。

  • -
  • 抽象了线程和主内存之间的关系,提供一套内存模型以屏蔽系统差异

  • +
  • w:光标移动到下一个单词的开头。
  • +
  • b:光标移动到上一个单词的开头。
  • +
  • 0:移动到行首。
  • +
  • $:移动到行尾。
  • +
  • gg:移动到文件的第一行。
  • +
  • G:移动到文件的最后一行。
  • +
  • H:移动到屏幕的顶部。
  • +
  • M:移动到屏幕的中部。
  • +
  • L:移动到屏幕的底部。
-

概念

-

CPU 高速缓存:为解决 CPU 处理速度和内存不匹配的问题;

-

指令重排序【编译器优化重排 —> 指令并行重排 —> -内存系统重排】:指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致;

-
-

内存屏障可以禁止处理器指令发生重排序,从而保障指令执行的有序性。此外,还能保证指令执行的可见性。

-
-

happens-before 原则

-

前一个操作的结果对于后一个操作是可见的,无论这两个操作是否在同一个线程里

+

编辑文本

    -
  • 只要不改变程序的执行结果,编译器和处理器怎么进行重排序优化都行;
  • -
  • 会改变程序执行结果的重排序,JMM -要求编译器和处理器必须禁止这种重排序;
  • +
  • x:删除光标所在的字符。
  • +
  • dw:删除从光标到单词末尾的内容。
  • +
  • dd:删除当前行。
  • +
  • d$:删除从光标到行末的内容。
  • +
  • yy:复制当前行。
  • +
  • p:粘贴到光标之后。
  • +
  • u:撤销上一步操作。
  • +
  • Ctrl + r:重做撤销的操作。
  • +
  • r:替换光标下的字符。
  • +
  • ciw:删除光标所在的单词并进入插入模式。
  • +
  • c$:删除从光标到行尾的内容并进入插入模式。
-

并发的三大特性

-

原子性:一次操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么都不执行

+

搜索和替换

    -
  • synchronized、各种 Lock 以及各种原子类;
  • +
  • /pattern:向下搜索 +pattern
  • +
  • ?pattern:向上搜索 +pattern
  • +
  • n:跳到下一个搜索结果。
  • +
  • N:跳到上一个搜索结果。
  • +
  • :s/old/new/g:将当前行的所有 +old 替换为 new
  • +
  • :%s/old/new/g:将整个文件中的所有 +old 替换为 new
-

可见性:当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值

+

文件操作

    -
  • synchronized、Volatile 以及各种 Lock 实现可见性;
  • +
  • :w:保存文件。
  • +
  • :q:退出 Vim。
  • +
  • :wq:保存并退出。
  • +
  • :q!:不保存强制退出。
  • +
  • :e filename:打开文件 +filename
  • +
  • :r filename:在当前文件中插入 +filename 的内容。
-

有序性:代码的执行顺序未必就是编写代码时候的顺序

+

Screen

+

基本命令

    -
  • Volatile -关键字:保证变量的可见性和代码执行的有序性,但无法在多线程读写变量时保证操作原子性;

  • -
  • 内存屏障:Unsafe 类的 fullFence() -可以避免代码重排序;

  • +
  • screen:启动一个新的 +screen 会话。
  • +
  • screen -S session_name:启动一个命名为 +session_namescreen 会话。
  • +
  • screen -ls:列出当前所有的 +screen 会话。
  • +
  • screen -r:重新连接到一个 +screen 会话(如果只有一个会话)。
  • +
  • screen -r session_name:重新连接到一个名为 +session_namescreen 会话。
  • +
  • screen -d session_name:在其他地方的终端断开某个会话的连接。
  • +
  • screen -d -r session_name:强制从其他地方的终端断开并重新连接到 +session_name 会话。
  • +
  • screen -X quit:关闭所有 +screen 会话
  • +
+

screen 会话中操作

+

screen 会话中,所有命令都以 Ctrl + a +开头(表示“前缀键”),然后跟随其他按键来执行操作。

+
    +
  • Ctrl + a, X:关闭当前的分割窗口。
  • +
  • Ctrl + a, c:创建一个新的窗口。
  • +
  • Ctrl + a, n:切换到下一个窗口。
  • +
  • Ctrl + a, p:切换到上一个窗口。
  • +
  • Ctrl + a, ":列出当前所有窗口,允许选择切换。
  • +
  • Ctrl + a, 0-9:切换到指定编号的窗口(例如 +Ctrl + a, 1 切换到窗口 1)。
  • +
  • Ctrl + a, d:将当前 +screen 会话断开(detach),会话继续在后台运行。
  • +
  • Ctrl + a, A:重命名当前窗口。
  • +
  • Ctrl + a, K:关闭当前窗口。
  • +
  • Ctrl + a, S:水平分割当前窗口。
  • +
  • Ctrl + a, |:垂直分割当前窗口。
  • +
  • Ctrl + a, tab:在分割的窗口间切换焦点。
  • +
  • Ctrl + a, Q:关闭除了当前窗口外的所有分割窗口。
  • +
  • Ctrl + a, X:关闭当前的分割窗口。
  • +
+

会话管理

+
    +
  • Ctrl + a, :quit 或 +Ctrl + a, d:结束当前 screen +会话。
  • +
  • Ctrl + a, :kill:强制关闭当前窗口。
  • +
  • exit:退出当前 screen +会话。
@@ -347,21 +367,18 @@

并发的三大特性

diff --git a/Machine-Learning/index.html b/Machine-Learning/index.html index d1223b2..8396c7a 100644 --- a/Machine-Learning/index.html +++ b/Machine-Learning/index.html @@ -35,7 +35,7 @@ - + @@ -148,7 +148,7 @@ diff --git a/OS/index.html b/OS/index.html index 1246028..da50706 100644 --- a/OS/index.html +++ b/OS/index.html @@ -156,18 +156,18 @@ @@ -264,8 +264,8 @@

虚拟内存

只会访问虚拟内存地址,在操作总线前,通过一个地址转换硬件将虚拟内存地址转换为物理内存地址

进程隔离:将虚拟内存映射到物理内存,进程之间的地址空间相互隔离,互不干扰

虚拟内存空间:

- -image-20240518105657086 + +image-20240518105657086

用户态虚拟内存空间是相互隔离相互独立的;内核虚拟内存空间是各个进程共享的;

进程管理

数据结构 PCB

@@ -345,8 +345,8 @@

I/O 多路复用

-
diff --git a/Redis/98987d9417b2bab43087f45fc959d32a.png b/Redis/98987d9417b2bab43087f45fc959d32a.png deleted file mode 100644 index a61048c..0000000 Binary files a/Redis/98987d9417b2bab43087f45fc959d32a.png and /dev/null differ diff --git a/Redis/a6286053c6884cf58bf397d01674fe80.png b/Redis/a6286053c6884cf58bf397d01674fe80.png deleted file mode 100644 index 190bdfc..0000000 Binary files a/Redis/a6286053c6884cf58bf397d01674fe80.png and /dev/null differ diff --git a/Redis/d1b889b9039f4f2f9853d44e3aa258fctplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp b/Redis/d1b889b9039f4f2f9853d44e3aa258fctplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp deleted file mode 100644 index ab0e3ea..0000000 Binary files a/Redis/d1b889b9039f4f2f9853d44e3aa258fctplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp and /dev/null differ diff --git a/Redis/ea4f7e86baf2435af3999e5cd38b6a26.png b/Redis/ea4f7e86baf2435af3999e5cd38b6a26.png deleted file mode 100644 index 421eb52..0000000 Binary files a/Redis/ea4f7e86baf2435af3999e5cd38b6a26.png and /dev/null differ diff --git a/Redis/fdd5f695bb3643258662886f9fba0aab.png b/Redis/fdd5f695bb3643258662886f9fba0aab.png deleted file mode 100644 index d1ff1f2..0000000 Binary files a/Redis/fdd5f695bb3643258662886f9fba0aab.png and /dev/null differ diff --git a/Redis/index.html b/Redis/index.html deleted file mode 100644 index 050b1d3..0000000 --- a/Redis/index.html +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Redis | 闻 - - - - - - - - - - - - - -
- -
- - -
- - - - - -
- - - -
- - - - - - - -
-

- Redis -

- - -
- - - - -

Redis 的特性:单线程、原子性、基于内存、优化数据结构、I/O -多路复用的非关系型数据库;

-

6.0 版本前网络 I/O 和命令处理都是单线程,6.0 版本后网络 I/O -改用多个线程处理

-
    -
  • 大部分操作都在内存中完成(制约 Redis 性能的瓶颈并不是 -CPU,而是内存和网络带宽)
  • -
  • 避免了多线程之间的竞争
  • -
  • I/O 多路复用机制
  • -
-

数据结构

-

5 -种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合) -3 种特殊数据类型:HyperLogLog(基数统计)、Bitmap (位图)、Geospatial -(地理位置)

-

持久化

-

保证即使在服务器重启的情况下也不会丢失数据(或少量损失)

-

AOF 日志

-

将每条执行成功的写操作命令追加到日志文件中,持久化代码命令在主进程上执行

-

写回策略(防止AOF日志在持久化过程中丢失):

- -img -

重写机制(防止AOF日志文件过大):

-
    -
  • 删去已经无意义的日志;

  • -
  • 重写操作由后台子进程完成,子进程共享父进程内存(为什么不用线程?父子进程以只读的方式共享数据,如果任意一方修改了该共享内存,父子进程会有独立的数据副本,即写时复制,注意这里只会复制主进程修改的物理内存数据,没修改物理内存还是与子进程共享的。而线程共享内存需要加锁);

  • -
  • AOF -重写缓冲区用于保存重写子进程启动后,新产生的AOF日志,并在重写结束后追加到新的AOF文件中;

  • -
-

RDB 快照

-

某一时刻内存数据的快照(二进制数据),恢复时直接读入内存即可

-

执行 bgsave 时,想要修改数据,需采用写时复制(Copy-On-Write, -COW),以减少性能损耗

-

混合持久化

-

在AOF日志重写过程中,将新的含有 RDB 格式和 AOF 格式的 AOF -文件替换旧的的 AOF 文件,前半部分是 RDB 格式的全量数据,后半部分是 AOF -格式的增量数据,即重写缓冲区数据。

-

策略

-

过期删除策略

-

惰性删除+定期删除

-

内存淘汰策略

-

仅淘汰过期数据:random、ttl、lru、lfu

-

淘汰所有数据:lru、lfu

-

高可用

-

主从复制

-

模式一:全量复制【多用于初始化】

- -
    -
  • bgsave 命令创建子进程来做生成 RDB 文件的工作,是异步工作的
  • -
-

为了避免过多的从服务器和主服务器进行数据同步(全量复制),可以把一部分从服务器升级成分发节点,利用从节点分担读取操作的压力

-

模式二:基于长连接的命令传播【多用于保持同步】

-

主从服务器在完成第一次同步后,双方之间就会维护一个 TCP -连接,保证第一次同步后的主从服务器的数据一致性。

-

模式三:连接恢复时可以采用增量复制:repl_backlog_buffer -环形缓冲区保存了最近传播的写命令,若其中存着从服务器请求的 -offset,就采用增量复制;否则采用全量复制。若想降低主从服务器断开后全量同步的概率,需要增大 -repl_backlog_buffer

-

QA

-

如何应对异步复制导致的主从数据不一致?

-

外部程序来监控主从节点间的复制进度

-

主从切换如何减少数据丢失?

-
    -
  • 设置复制延迟限制 min-slaves-max-lag
  • -
  • 客户端降级措施,当 master 不可写,就把数据存到本地或 kafka -中等待主节点正常后再消费
  • -
-

集群脑裂导致数据丢失

-

主节点必须要有至少 min-slaves-to-write -个从节点连接,主从数据复制和同步的延迟不能超过 -min-slaves-max-lag -秒。否则原主节点就会被限制接收客户端写请求,客户端也就不能在原主节点中写入新数据,等到新的主节点上线一切恢复正常。

-

哨兵机制

-
-

自动完成故障发现和故障转移,并通知给应用方,从而实现高可用性

-
-

哨兵之间建立连接

- -img -

哨兵与从节点建立连接

- -img -

第一轮投票:判断主节点下线

-

主观下线:主节点或者从节点没有在规定的时间内响应哨兵的 PING 命令

-

客观下线:一个哨兵判断主节点为「主观下线」后,就会向其他哨兵发起命令,通过多个哨兵节点一起判断主节点是否下线。哨兵的赞同票数达到哨兵配置文件中的 -quorum 配置项设定的值则判断主节点客观下线

-

第二轮投票:选出哨兵 leader

-
    -
  • 哪个哨兵节点判断主节点为「客观下线」,这个哨兵节点就是候选者,所谓的候选者就是想当 -Leader 的哨兵。
  • -
  • 候选者会向其他哨兵发送命令,表明希望成为 Leader -来执行主从切换,并让所有其他哨兵对它进行投票。Raft 算法选择哨兵 Leader: -
      -
    • 第一,拿到半数以上的赞成票;
    • -
    • 第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。
    • -
  • -
-

由哨兵 leader -进行主从故障转移

-
    -
  • 第一步:在已下线主节点(旧主节点)属下的所有「从节点」里面,挑选出一个从节点,并将其转换为主节点,选择的规则: -
      -
    • 过滤掉已经离线的从节点;
    • -
    • 过滤掉历史网络连接状态不好的从节点;
    • -
    • 将剩下的从节点,进行三轮考察:优先级、复制进度、ID -号。在每一轮考察过程中,如果找到了一个胜出的从节点,就将其作为新主节点。
    • -
  • -
  • 第二步:让已下线主节点属下的所有「从节点」修改复制目标,修改为复制「新主节点」;
  • -
  • 第三步:将新主节点的 IP -地址和信息,通过「发布者/订阅者机制」通知给客户端;
  • -
  • 第四步:继续监视旧主节点,当这个旧主节点重新上线时,将它设置为新主节点的从节点;
  • -
-

集群

- -
    -
  • 同一个分区内的 Redis -节点之间的数据完全一样,多个节点保证了数据有多份副本冗余保存,且可以提供高可用保障;
  • -
  • 不同分片之间的数据不相同;
  • -
  • 通过水平增加多个分片的方式,可以实现整体集群容量的扩展;
  • -
-

集群数据分布策略

-

Hash 槽

-
    -
  • 切片 slot 槽,共有16384个槽位;
  • -
  • 数据 key 通过 “CRC16 算法 + 16384 取模”,得到对应存储的哈希槽;
  • -
  • 数据存储在该槽位对应的 Redis -分区中,每个分区都有独立的主从哨兵保证高可用;
  • -
-

一致性Hash

-

虚拟节点

-

缓存

-

缓存雪崩、击穿、穿透

-

缓存穿透:大量请求了缓存和数据库里都没有的数据,请求穿透缓存和数据库

-
    -
  • 参数校验:参数不合法直接抛出异常
  • -
  • 缓存无效 key:适用于 key 变化不频繁
  • -
  • 布隆过滤器:校验 Key -是否合法(有误差,可能会把未存的值当作已有,即不合法的 key -当作合法的)
  • -
  • 接口限流:固定窗口算法、滑动窗口算法、漏桶算法、令牌桶算法
  • -
-

缓存击穿:瞬间大量请求未缓存的数据库数据,请求击穿缓存直接打到数据库上

-
    -
  • 热点数据永不过期或过期时间长
  • -
  • 预热热点数据:定时任务预热(定时触发缓存预热的逻辑,将数据库中的热点数据查询出来并存入缓存中)、kafka -异步预热(将数据库中的热点数据的主键或者 ID -发送到消息队列中,然后由缓存服务消费消息队列中的数据,根据主键或者 ID -查询数据库并更新缓存)
  • -
  • 访问数据库互斥锁
  • -
-

缓存雪崩:缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上

-
    -
  • Redis 集群
  • -
  • 限流
  • -
  • 多级缓存:本地缓存+Redis
  • -
  • 热点数据失效时间长
  • -
  • 预热热点数据
  • -
-

如何保证数据库和缓存一致性

-
-

采用 Cache Aside -旁路缓存策略:以数据库中的数据为准,缓存中的数据是按需加载的;缺点:数据写入频繁时,缓存中的数据会被频繁的清理,降低缓存命中率;

-
-

更新数据库+删除缓存:延迟双删

-

更新数据库+更新缓存:分布式锁

-

更新数据库+不更新缓存:较短的缓存有效期

-

删除缓存的时候失败了怎么办?

-

采用异步删除:

-
    -
  • 消息队列确保缓存删除成功
  • -
  • 订阅 MySQL 的 binlog,数据修改时删除缓存
  • -
-

缓存预热

-

提高访问速度,平滑流量峰值,减少后端压力,保证数据的时效性

-

Redis 缓存预热的方法:系统启动时加载;定时任务加载;

-

实战

-

分布式锁

-
-

Redis + Lua -脚本,可以以原子性的方式执行一组命令,可用于保证锁释放操作的原子性(Lua -脚本在处理的过程中不会被任意其它请求打断),但无法用于事务执行失败的回滚。Redisson -采用的就是这种方法保证分布式锁的原子性。

-
-

SET 命令的 NX 参数可以实现:key -不存在才插入,可以用于实现分布式锁

-

优点:性能高效、实现方便、分布式高可用

-

缺点:不好设置超时时间(解决方法:守护线程定期续约)、主从异步复制可能导致不可靠性(解决方法如下)

-

提高可靠性(Redlock 算法):客户端和多个独立的 Redis -节点依次请求申请加锁,如果客户端能够和半数以上的节点成功地完成加锁操作,那么就认为,客户端成功地获得分布式锁,否则加锁失败,所有的 -redis 实例都会进行解锁;

-
    -
  • 单机的 redis 是 cp 的,但是集群情况下 redis 是 ap 的,所以运行 -Redisson -的节点必须是主节点,不能有从节点,防止主节点加锁成功未同步从节点就宕机,而客户端却收到加锁成功,导致数据不一致。
  • -
-
@Resource
private RedissonClient redisson;
-

延迟队列

-

有序集合 Zset;score 存储延迟执行的时间

-

大 Key 问题

-

会导致的问题

-
    -
  • 由于 Redis 单线程处理,大 Key -的增删改查都很耗时,会导致工作线程阻塞、客户响应超时、网络传输阻塞
  • -
  • 内存分布不均,集群场景下 slot 槽数据量不均;
  • -
  • 持久化阻塞主线程,会主线程的两个阶段耗时增加:创建子进程复制页表结构、修改共享数据写时复制;
  • -
-

解决办法

-
    -
  • 拆分大 key;
  • -
  • 及时/定时清理大 key,unlink 异步删除代替 del 同步删除;
  • -
-

发布者/订阅者

-
-

订阅命令:subscribe channel [channel ... ]

-
- -img -

Link

-

事务回滚

-

Redis 不支持回滚,事务没有原子性(要么全部成功要么全部失败)

-

管道

-

批处理技术,可以一次处理多个 Redis -命令,减少多个命令执行时的网络等待

- -
- - - - - - -
-
- - - - - - -
-
- -
- -
- - -
- - 0% -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Redis/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAwrfmooXoirHljYHkuIk=,size_20,color_FFFFFF,t_70,g_se,x_16.png b/Redis/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAwrfmooXoirHljYHkuIk=,size_20,color_FFFFFF,t_70,g_se,x_16.png deleted file mode 100644 index 410b113..0000000 Binary files a/Redis/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAwrfmooXoirHljYHkuIk=,size_20,color_FFFFFF,t_70,g_se,x_16.png and /dev/null differ diff --git a/Rpc/A5B6F28E3286E3F920698A1D904CE4B0.png b/Rpc/A5B6F28E3286E3F920698A1D904CE4B0.png deleted file mode 100644 index 6687fdd..0000000 Binary files a/Rpc/A5B6F28E3286E3F920698A1D904CE4B0.png and /dev/null differ diff --git a/Rpc/index.html b/Rpc/index.html deleted file mode 100644 index 0f2acf9..0000000 --- a/Rpc/index.html +++ /dev/null @@ -1,550 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Rpc 中间件 | 闻 - - - - - - - - - - - - - -
- -
-
-
- - -
- - - -

- -
-

Yesterday is history, tomorrow is a mystery but today is a gift.

-
- - -
- - - - - - - -
- -
- -
- - - - - -
- -
- - - - - -
- - - -
- - - - - - - -
-

- Rpc 中间件 -

- - -
- - - - -
-

分布式系统的 CAP 理论

-
    -
  • 一致性(Consistency):所有节点访问同一份最新的数据副本
  • -
  • 可用性(Availability):非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)
  • -
  • 分区容错性(Partition -Tolerance):分布式系统出现网络分区的时候,仍然能够对外提供服务。
  • -
-

分布式保证服务高并发稳定性

-
    -
  • 缓存:缓存是一种提高数据读取性能的技术,通过在内存中存储经常访问的数据,可以减少对数据库或者其他存储系统的访问,从而提高系统的响应速度。缓存可以应用在多个层次,例如浏览器缓存、CDN -缓存、反向代理缓存、应用缓存等。
  • -
  • 降级:降级是在系统压力过大或者部分服务不可用的情况下,暂时关闭一些非核心的服务,以保证核心服务的正常运行。降级可以在多个层次进行,例如页面降级、功能降级、服务降级等。
  • -
  • 限流:限流是一种控制系统处理请求的速率的技术,以防止系统过载。限流可以通过多种算法实现,例如固定窗口、滑动窗口、漏桶算法、令牌桶算法等。
  • -
-

Nacos 配置中心 注册中心

-

RPC 框架

-
-

泛指调用远程的函数的方法,对编解码和网络层有特殊的优化,从而有更高的效率。

-
-

RPC 框架主要由 Server、Client、Server Stub、Client Stub 组件组成

-
    -
  • Client Stub -主要是将客户端的请求参数、请求服务地址、请求服务名称做一个封装,并发送给 -Server Stub
  • -
  • Server Stub 主要用于接收 Client Stub 发送的数据并解析,去调用 Server -端的本地方法
  • -
-

层次结构:代理曾、注册中心层(服务发现、注册、管理)、

-

RPC 协议定制化程度高,可以采用体积更小的 Protobuf -或其他序列化协议去保存结构体数据,同时也不需要像 HTTP -那样考虑各种浏览器行为,如 302 -重定向跳转。因此性能也会更好一些。其底层不仅可以通过 tcp udp -实现,也可以通过 http 实现。

-

RPC -协议会建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用,可以说非常环保。

-

目前,对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC -协议进行通讯。

-

Dubbo 上线问题

-

记录、学习、汇总实习和技术博客中看到的 Dubbo 实战遇到的问题

-

服务端接口不指定通讯协议导致 -OOM

-

问题背景:

-

问题描述:

-
    -
  • 开发人员使用方没有配置接口的 protocol -字段,而是写在接口实现类上

  • -
  • dubbo-3.0.4 框架:

    -
      -
    • 若没有指定 protocol 字段,会创建服务端提供的所有协议的 invoker
    • -
    • EasyREST 包createClientInvoker创建 REST 协议的 invoker -时需要 HttpMethod 参数
    • -
    • 由于注解写在实现类而不是接口上面,导致消费端无法共享相应的 REST -配置信息,即 HttpMethod 为 null,因此 RESTClient 创建失败
    • -
    • 在服务更新过程中,客户端每次都是全量更新注册中心的服务端信息,这个过程中如果 -invoker -一直注册失败,会不断将失败的Client存到List<ResteasyClient>中,如果有 -n 台机器需要依次更新,这时客户端的数组中会存 n*n -个失败的连接实例,从而导致 OOM
    • -
  • -
-

解决方法(针对框架,开发人员需要牢记 Dubbo 配置必须在接口上):

-
    -
  • ResteasyClient 对象由 RestProtocol 协议对象持有,针对没有创建成功 -invoker 的场景应把其对应的 ResteasyClient 销毁
  • -
-

销毁方法

-
    -
  • Map<String, ResteasyClient>代替 -List<ResteasyClient>,同一个服务端只存一次
  • -
  • WeakHashMap<String, ResteasyClient>自动回收不用的 -ResteasyClient(参考pr
  • -
-

参考

-

父子线程并发 RPC 调用死锁

-

问题描述:

-
    -
  • 直接通过 Executors 构造 固定数量+无限长等待队列 -线程池,该线程池在共享的无界队列上操作的固定数量的线程。在任何时候,最多nThreads线程将处于活动处理任务状态。如果在所有线程都处于活动状态时提交额外的任务,它们将在队列中等待,直到有线程可用。
  • -
-
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
-
    -
  • 并发调用 Rpc 接口获取返回值
  • -
-
Future<String> future = executor.submit(()->{
return 数据查询任务;
})
-
    -
  • 数据查询任务中存在父子调用关系,数据查询任务同步调用 Redis -查询缓存和 Rpc 调用微服务获得数据。如果本地 Redis -缓存中能获得数据,就直接返回缓存值并取消 Rpc 调用 -future.cancel(true)
  • -
-

解决办法

-
    -
  • 父子任务分开并发执行,耗时的异步线程应做好线程池隔离
  • -
  • CompletableFuture.anyOf(task1,tsak2) -优先取先完成的那个任务的返回值
  • -
-

参考

-

尝试开发基础版 Rpc 中间件

-

服务发现流程:使用远程服务的时候首先需要配置一个 -dubbo.xml -文件或者在使用的类加上@Reference,二者都是用来对dubbo消费者引用服务进行一些配置,然后应用在启动的时候会将配置信息转化为一个ReferenceBean对象,并调用createProxy方法创建一个远程服务接口的代理对象。

-

代理对象的 invoke -创建:启动时主动订阅注册中心,会显示地调用一次notify接口,这个接口会尝试将远程服务注册的url转换成一个本地的invoker

-
    -
  • 转换过程中会根据具体的 protocol 创建对应的 -invoker,如 Rest 和 Dubbo 需要解析不同的参数。
  • -
-

服务注册地址发生改变时:会通知给消费者,dubbo -协议里面明确讲到服务发生改变会全量更新所有客户端的缓存

-

Netty 数据传输

-
-

在网络通信中,序列化和编码通常是结合使用的。序列化将对象转换为字节流,编码将字节流转换为网络传输所需的格式(如按照协议规定的格式进行编码)。在接收端,解码将网络传输的数据解析为原始的格式(如解码成对象),以便进行进一步的处理和使用。

-
-

Netty 是一个高性能事件驱动型非阻塞 IO 框架

-
    -
  • 提供了 ByteBuf 容器,更方便地处理数据。ByteBuf -在重写编解码器的 encoder/decoder 方法中作为参数传入。
  • -
  • channel
  • -
-

编码:先序列化,再压缩,最后写进 ByteBuf 对象中

-

解码:从 ByteBuf 对象中读,然后转成我们需要的对象

-

代理模式

-

静态代理

-
-

静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码),非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。 -实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。

-
-

从 JVM 层面来说, -静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class -文件。

-

静态代理的步骤

-
    -
  • 定义一个接口及其实现类;
  • -
  • 创建一个代理类同样实现这个接口
  • -
  • 将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。
  • -
-

JDK 动态代理

-
    -
  • 定义一个接口及其实现类;
  • -
  • 自定义 InvocationHandler 并重写 invoke 方法,在 invoke -方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑;
  • -
  • 通过 -Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) -方法创建代理对象;
  • -
-
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
public class RpcClientProxy implements InvocationHandler {
// 在代理类内,根据传入的类 clazz,获得代理对象
public <T> T getProxy(Class<T> clazz) {
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, this);
}
// 当通过代理类调用的所有方法,实际上调用的是这个invoke(传入的只是服务接口,具体的实现在服务端实现类中)
public Object invoke(Object proxy, Method method, Object[] args) {...}
}
-

那么是如何调用服务端实现类的代码的呢?注入

-
    -
  1. 在实例化 bean 之后,postProcessAfterInitialization 方法被调用。
  2. -
  3. 对于每个 bean 类的字段,检查是否标记了 @RpcReference 注解。
  4. -
  5. 如果发现标记了 @RpcReference -注解的字段,根据注解中的信息创建相应的 RpcServiceConfig 对象。
  6. -
  7. 通过 RpcClientProxy 创建了一个代理对象 -clientProxy,这个代理对象实现了 declaredField.getType() -所表示的接口,这个接口可能就是 HelloService 接口或其它接口,取决于 -helloService 字段的类型。
  8. -
  9. 这个代理对象 clientProxy 会在方法调用时委托给 RpcClientProxy 的 -invoke 方法,该方法负责处理远程调用的逻辑。
  10. -
  11. 通过反射设置 clientProxy 到 HelloController 类的 helloService -字段上,替换了原来的字段值。
  12. -
-
Object clientProxy = rpcClientProxy.getProxy(declaredField.getType());
declaredField.setAccessible(true);
try {
declaredField.set(bean, clientProxy);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
-

传输协议

-
*   0     1     2     3     4        5     6     7     8         9        10     11     12   13   14 15 16
* +-----+-----+-----+-----+--------+----+----+----+------+-----------+-------+-------+-----+---+-----+----+
* | magic code |version | full length | messageType| codec|compress| RequestId |
* +-----------------------+--------+---------------------+-----------+-----------+-----------+------------+
* | body |
* +-------------------------------------------------------------------------------------------------------+
* 4B magic code(魔法数) 1B version(版本) 4B full length(消息长度) 1B messageType(消息类型)
* 1B compress(压缩类型) 1B codec(序列化类型) 4B requestId(请求的Id)
-

注册中心

-

服务注册:在 zk 里面创建一个对应的持久节点

-

当我们的服务被注册进 zookeeper -的时候,我们将完整的服务名称 rpcServiceName (class -name+group+version)作为根节点 -,子节点是对应的服务地址(ip+端口号)。相关代码在 -ZkServiceProviderImpl.publishService() 中。

-

如果我们要获得某个服务对应的地址的话,就直接根据完整的服务名称来获取到其下的所有子节点,然后通过具体的负载均衡策略取出一个就可以了。相关代码在 -ZkServiceDiscoveryImpl.lookupService() 中。

-

Zookeeper 客户端

-
-

Curator 是 Netflix -公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。项目内采用 -CuratorUtils 类调用 Curator。

-
-

重试策略:ExponentialBackoffRetry是指数退避重试策略

-
// zk的对外接口,后面我们要干什么只需要通过单例模式获得这个类,然后用这个类的方法
public interface ServiceProvider {
// 添加到本地 serviceMap 中(远程Rpc调用,获取本地的调用类)
void addService(RpcServiceConfig rpcServiceConfig);
Object getService(String rpcServiceName);
// 注册服务到 zookeeper 中(服务发现与注册)
void publishService(RpcServiceConfig rpcServiceConfig);
}
-

负载均衡

-

随机选取策略 轮询策略 加权轮询策略 最少活跃连接策略 一致性 Hash -策略

-

序列化

-
    -
  • 序列化:将数据结构或对象转化为二进制字节流
  • -
  • 反序列化:将在序列化过程中生成的二进制字节流转化为数据结构或对象
  • -
-

数据传输过程中,可能会出现粘包和半包问题,你是如何解决的?

-

自定义消息结构(其他的还有固定长度传输、特殊字符分割):MagicNumber -魔数、ContentLength 请求长度

- -
- - - - - - -
-
- - - - - - -
-
- -
- -
- - -
- - 0% -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Spring/image-20240521182846989.png b/Spring/image-20240521182846989.png deleted file mode 100644 index 475976d..0000000 Binary files a/Spring/image-20240521182846989.png and /dev/null differ diff --git a/Spring/image-20240521182854337.png b/Spring/image-20240521182854337.png deleted file mode 100644 index f7830fc..0000000 Binary files a/Spring/image-20240521182854337.png and /dev/null differ diff --git a/Spring/index.html b/Spring/index.html deleted file mode 100644 index d008ab7..0000000 --- a/Spring/index.html +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Spring | 闻 - - - - - - - - - - - - - -
- -
-
-
- - -
- - - -

- -
-

Yesterday is history, tomorrow is a mystery but today is a gift.

-
- - -
- - - - - - - -
- -
- -
- - - - - -
- -
- - - - - -
- - - -
- - - - - - - -
-

- Spring -

- - -
- - - - -

SpringCore 主要提供 IoC 依赖注入功能的支持 SpringMVC 快速构建 MVC -架构的 Web 程序 SpringBoot 简化 Spring 开发,减少配置文件,开箱即用

-

IOC 控制反转

-
-

当一个对象创建时,它所依赖的对象由外部传递给它,而非自己去创建所依赖的对象(比如通过new操作)。因此,也可以说在对象如何获取它的依赖对象这件事情上,控制权反转了。这便不难理解控制反转和依赖注入这两个名字的由来了。

-
-

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC -容器完成对象的注入 Bean 工厂模式

-
    -
  • 单例 Singleton、多例/原型 Prototype Bean
  • -
-

AOP 面向切面编程

-

将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。 -实现方式:基于动态代理,有接口用 jdk 原生的代理方法,没借口用 CGLib -

-

Bean 生命周期

-
-

自动装配:@Component@Service@Controller@Configure + @Bean

-
- -

xxx.class --> 默认无参构造方法 --> 普通对象 --> -依赖注入(属性赋值) --> 初始化前 --> 初始化 --> 初始化后 ---> 代理对象 --> 得到Bean(源码) -实例化 Bean -对象:默认调用无参构造器;若使用有参构造器,参数必须是容器中有的Bean【按参数查找 -Bean 时,先按照 classname 后按照参数名】 初始化前中后:BeanPostProcessor -的 postProcessAfterInitialization() --> @PostConstruct 注解 --> -InitializingBean 的 afterPropertiesSet() 方法 --> BeanPostProcessor -的 postProcessAfterInitialization()(实现了 AOP 代理)

-
    -
  • Aware 其实就是一个标识;只有满足 Aware -规范或者其子类规范的才能进行相关的赋值操作,这样做的话可以少写很多判断,并且可以在一个地方进行统一的判断赋值;
  • -
  • BeanPostProcessor -前置处理器的关键实现类:ApplicationContextAwareProcessor
  • -
  • BeanPostProcessor -后置处理器的关键实现类:AbstractAutoProxyCreator。这个方法负责帮我们创建代理,底层采用对象cglib -或动态代理【AOP其实就是 IOC -整体流程(Bean生命周期)里的一个扩展点】
  • -
  • InitializingBean 接口中的 afterPropertiesSet -方法:在这个方法里面去编写我们的业务逻辑,以及进行相关的属性赋值等等
  • -
-

底层实现

-
    -
  • AbstractAutowireCapableBeanFactory 内的 initializeBean 调用了所有 -BeanPostProcessor 的实现类
  • -
  • ApplicationContext 类型容器的内部维护了一个 BeanFactory -类型的容器(AnnotationConfigApplicationContext 的父类 -GenericApplicationContext 维护了一个 Bean -工厂实现类:DefaultListableBeanFactory)
  • -
  • DefaultListableBeanFactory:Spring 默认的 BeanFactory 实现
  • -
  • DefaultSingletonBeanRegistry:DefaultListableBeanFactory -单例模式存储关系的地方 Map<String(BeanName),Object(instance)>
  • -
  • AbstractApplicationContext.refresh() 方法 -
      -
    • 配置了对 BeanFactoryPostProcessor 的实现 -postProcessBeanFactory(beanFactory) 和处理 -invokeBeanFactoryPostProcessors(beanFactory)。BeanFactoryPostProcessor -可以自定义 ApplicationContext 容器中的 BeanFactory -进行处理,在还没有对任何Bean进行实例化之前(ConfigurationClassPostProcessor -通过注解解析配置类;PropertySourcesPlaceholderConfigurer:xml配置文件中导入的 -properties 文件进行解析,并替换bean定义中的占位符)
    • -
    • 配置了对 BeanPostProcessor 的实现
    • -
  • -
-
-
    -
  1. (1-1)依赖注入:@Autowired@Resource
  2. -
  3. 事务 @Transactional@Configuration
  4. -
  5. (1-2)单例 Singleton、多例/原型 Prototype Bean
  6. -
  7. jvm类加载器classloader:bootstrap ext app 博客
  8. -
-

TODO Spring 启动流程 Springboot 和 Spring 最大的区别就是不需要 xml -配置 Springboot 自动配置

-
    -
  • “约定优于配置”理念
  • -
  • @EnableAutoConfiguration
  • -
  • 自动将一些配置类的bean注册进ioc容器
  • -
-

logback是 slf4j 的官方实现,log4j 是另一个实现,logback 和 log4j -才是二选一,slf4j 是门面日志的 api。

-

TODO https://www.cnblogs.com/tuyang1129/p/12861617.html -https://www.cnblogs.com/tuyang1129/p/12866484.html

-

Spring 事务

-

Spring 的声明式事务信息是存在 ThreadLocal -中的,所以一个线程永远只能有一个事务,所以 Spring -的事务是无法实现事务一致性(同时提交、同时回滚)的

-

解决方法:可以通过编程式事务,或者通过分布式事务的思路:二阶段提交方式

-

如何解决循环依赖

-

三层缓存设计

-
    -
  • 一级缓存,缓存正常的 bean 实例
  • -
  • 二级缓存,缓存还未进行依赖注入和初始化方法调用的 bean 实例
  • -
  • 三级缓存,缓存 bean 实例的 ObjectFactory,用于解决 BeanPostProcessor -代理类时正确地依赖注入
  • -
-
-

循环依赖的情况下,不管使用三级缓存还是两级缓存,代理类逻辑都必须提前曝光

-
- -
- - - - - - -
-
- - - - - - -
-
- -
- -
- - -
- - 0% -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SpringMVC/2018120522281643.gif b/SpringMVC/2018120522281643.gif deleted file mode 100644 index 8b47562..0000000 Binary files a/SpringMVC/2018120522281643.gif and /dev/null differ diff --git a/SpringMVC/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5q2i5q2l5YmN6KGM,size_20,color_FFFFFF,t_70,g_se,x_16.png b/SpringMVC/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5q2i5q2l5YmN6KGM,size_20,color_FFFFFF,t_70,g_se,x_16.png deleted file mode 100644 index 049b7f8..0000000 Binary files a/SpringMVC/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5q2i5q2l5YmN6KGM,size_20,color_FFFFFF,t_70,g_se,x_16.png and /dev/null differ diff --git a/Transformers/index.html b/Transformers/index.html index f16ea9a..d8a4a30 100644 --- a/Transformers/index.html +++ b/Transformers/index.html @@ -19,16 +19,16 @@ - + - + - + @@ -141,7 +141,7 @@ +
Transformers & NLP 相关库及实现
-

NLP -任务:情感分析、文本生成、命名体识别、阅读理解、掩码填充、文本摘要、机器翻译、特征提取、对话机器人

-

万物之始 Transformer Attention is all you need

- -image-20240714162218754 -
    -
  • 直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征;
  • -
  • Self Attention 对于增加计算的并行性有直接帮助作用;
  • -
-

Transformers及相关库

-

Transformers:核心库,模型加载、模型训练、流水线并行等

-

Tokenizer:分词器,对数据进行预处理,文本到token序列的互相转换。具体工作包括:分词、索引、填充截断、attention_mask、token_type

-

Datasets:数据集库,提供了数据集的加载、处理等方法

-

Evaluate:评估函数,提供各种评价指标的计算函数

-

Trainer:将模型训练流程打包,包括:创建优化器、创建DataLoader、tensor转移到CUDA上

-

PEFT:高效微调模型的库,提供了几种高效微调的方法,小参数量动大模型

-

Accelerate:分布式训练,提供了分布式训练解决方案,包括大模型的加载与推理解决方案

-

Optimum:优化加速库,支持多种后端,如Onnxruntime、OpenVino等

-

Gradio:可视化部署库,几行代码快速实现基于Web交互的算法演示系统

-

NLP

-

NLP -数据集大多是未标注的文档,因此采用自监督学习的方式训练模型,如预测下一个词 -LM、完形填空 MLM。

-

早些年,流行的是词嵌入 Word -Embedding,目标是采用向量的形式表示词元,采用一组向量表示一段话,可以用于计算词/句子相似度。

-

现阶段,Transformer -的出现促使三种类型的模型的出现:Encoder-only-only-Decoder。Encoder-only -适用于机器翻译、句子分类、命名体识别和问答;Decoder-only -适用于文本预测;Encoder-Decoder 适用于文本压缩。

+

NLP +任务:情感分析、文本生成、命名体识别、阅读理解、掩码填充、文本摘要、机器翻译、特征提取、对话机器人

+

万物之始 Transformer Attention is all you need

+ +image-20240714162218754 +
    +
  • 直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征;
  • +
  • Self Attention 对于增加计算的并行性有直接帮助作用;
  • +
+

Transformers及相关库

+

Transformers:核心库,模型加载、模型训练、流水线并行等

+

Tokenizer:分词器,对数据进行预处理,文本到token序列的互相转换。具体工作包括:分词、索引、填充截断、attention_mask、token_type

+

Datasets:数据集库,提供了数据集的加载、处理等方法

+

Evaluate:评估函数,提供各种评价指标的计算函数

+

Trainer:将模型训练流程打包,包括:创建优化器、创建DataLoader、tensor转移到CUDA上

+

PEFT:高效微调模型的库,提供了几种高效微调的方法,小参数量动大模型

+

Accelerate:分布式训练,提供了分布式训练解决方案,包括大模型的加载与推理解决方案

+

Optimum:优化加速库,支持多种后端,如Onnxruntime、OpenVino等

+

Gradio:可视化部署库,几行代码快速实现基于Web交互的算法演示系统

+

分布式训练

+

Accelerate 包,融合了 Deepspeed、DDP、FSDP;

+

NLP

+

NLP +数据集大多是未标注的文档,因此采用自监督学习的方式训练模型,如预测下一个词 +LM、完形填空 MLM。

+

早些年,流行的是词嵌入 Word +Embedding,目标是采用向量的形式表示词元,采用一组向量表示一段话,可以用于计算词/句子相似度。

+

现阶段,Transformer +的出现促使三种类型的模型的出现:Encoder-only-only-Decoder。Encoder-only +适用于机器翻译、句子分类、命名体识别和问答;Decoder-only +适用于文本预测;Encoder-Decoder 适用于文本压缩。

@@ -292,8 +295,8 @@

NLP

-
diff --git a/about/index.html b/about/index.html index 4c03e1a..0b3c810 100644 --- a/about/index.html +++ b/about/index.html @@ -150,18 +150,18 @@ diff --git a/archives/2023/08/index.html b/archives/2023/08/index.html index 6257174..9271fa5 100644 --- a/archives/2023/08/index.html +++ b/archives/2023/08/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html index 976e2d1..2195b38 100644 --- a/archives/2023/09/index.html +++ b/archives/2023/09/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
diff --git a/archives/2023/10/index.html b/archives/2023/10/index.html index 4bf74a7..2c6bf0f 100644 --- a/archives/2023/10/index.html +++ b/archives/2023/10/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
diff --git a/archives/2023/index.html b/archives/2023/index.html index 7912013..09740f6 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
diff --git a/archives/2024/01/index.html b/archives/2024/01/index.html index 91a50c2..e4fbd4f 100644 --- a/archives/2024/01/index.html +++ b/archives/2024/01/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
diff --git a/archives/2024/03/index.html b/archives/2024/03/index.html index 6aa7a15..8457e2a 100644 --- a/archives/2024/03/index.html +++ b/archives/2024/03/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -239,26 +239,6 @@

- -
diff --git a/archives/2024/04/index.html b/archives/2024/04/index.html index 0624b05..6e88b69 100644 --- a/archives/2024/04/index.html +++ b/archives/2024/04/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -199,26 +199,6 @@

2024
- -
- -
- - - - - -
- -
diff --git a/archives/2024/05/index.html b/archives/2024/05/index.html index f97bca9..d73f691 100644 --- a/archives/2024/05/index.html +++ b/archives/2024/05/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -259,26 +259,6 @@

- -
diff --git a/archives/2024/06/index.html b/archives/2024/06/index.html index 4c6c89c..0a76193 100644 --- a/archives/2024/06/index.html +++ b/archives/2024/06/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -230,7 +230,7 @@

-
diff --git a/archives/2024/07/index.html b/archives/2024/07/index.html index 05e4b9e..17125d4 100644 --- a/archives/2024/07/index.html +++ b/archives/2024/07/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -199,26 +199,6 @@

2024
- -
+ +
+
+ + +
+
diff --git a/archives/2024/index.html b/archives/2024/index.html index 7eb55db..24f10da 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- 还行! 目前共计 39 篇日志。 继续努力。 + 还行! 目前共计 31 篇日志。 继续努力。
@@ -203,15 +203,75 @@

- +
+ + +
+
+ + + + + +
+
+ + +
+
@@ -330,7 +390,7 @@

-
@@ -399,46 +459,6 @@

- - - -
- -
-
@@ -399,46 +459,6 @@

- - - -
- -
diff --git "a/categories/LLM\345\272\224\347\224\250\345\274\200\345\217\221/index.html" "b/categories/LLM\345\272\224\347\224\250\345\274\200\345\217\221/index.html" index 3b556a3..015e906 100644 --- "a/categories/LLM\345\272\224\347\224\250\345\274\200\345\217\221/index.html" +++ "b/categories/LLM\345\272\224\347\224\250\345\274\200\345\217\221/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/LLM\345\276\256\350\260\203/index.html" "b/categories/LLM\345\276\256\350\260\203/index.html" index fa7a49f..fad893a 100644 --- "a/categories/LLM\345\276\256\350\260\203/index.html" +++ "b/categories/LLM\345\276\256\350\260\203/index.html" @@ -149,18 +149,18 @@ diff --git a/categories/index.html b/categories/index.html index 9e42c33..906e2d3 100644 --- a/categories/index.html +++ b/categories/index.html @@ -150,18 +150,18 @@ @@ -202,10 +202,10 @@

categories
diff --git a/tags/Spring/index.html b/categories/paper/index.html similarity index 92% rename from tags/Spring/index.html rename to categories/paper/index.html index 47e155e..733a113 100644 --- a/tags/Spring/index.html +++ b/categories/paper/index.html @@ -22,7 +22,7 @@ - + @@ -30,14 +30,14 @@ - + - + -标签: Spring | 闻 +分类: paper | 闻 @@ -149,18 +149,18 @@ @@ -181,7 +181,7 @@
-
+
@@ -190,8 +190,8 @@
-

Spring - 标签 +

paper + 分类

@@ -204,15 +204,15 @@

Spring
-
diff --git "a/categories/\345\205\253\350\202\241\346\226\207/index.html" "b/categories/\345\205\253\350\202\241\346\226\207/index.html" index 975aca2..0e49e9a 100644 --- "a/categories/\345\205\253\350\202\241\346\226\207/index.html" +++ "b/categories/\345\205\253\350\202\241\346\226\207/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/\345\267\245\344\275\234/index.html" "b/categories/\345\267\245\344\275\234/index.html" index 85b3535..1399c07 100644 --- "a/categories/\345\267\245\344\275\234/index.html" +++ "b/categories/\345\267\245\344\275\234/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/\345\267\245\344\275\234/\346\200\235\350\200\203/index.html" "b/categories/\345\267\245\344\275\234/\346\200\235\350\200\203/index.html" index 5627b7a..d9dd295 100644 --- "a/categories/\345\267\245\344\275\234/\346\200\235\350\200\203/index.html" +++ "b/categories/\345\267\245\344\275\234/\346\200\235\350\200\203/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/\345\274\200\345\217\221\345\267\245\345\205\267/index.html" "b/categories/\345\274\200\345\217\221\345\267\245\345\205\267/index.html" index d003ed9..2b8df20 100644 --- "a/categories/\345\274\200\345\217\221\345\267\245\345\205\267/index.html" +++ "b/categories/\345\274\200\345\217\221\345\267\245\345\205\267/index.html" @@ -149,18 +149,18 @@ @@ -200,6 +200,26 @@

开发工具 2024

+ +
-
diff --git "a/categories/\346\200\235\350\200\203/index.html" "b/categories/\346\200\235\350\200\203/index.html" index b8a4227..c802f3c 100644 --- "a/categories/\346\200\235\350\200\203/index.html" +++ "b/categories/\346\200\235\350\200\203/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/\346\225\260\346\215\256\345\272\223/index.html" "b/categories/\346\225\260\346\215\256\345\272\223/index.html" deleted file mode 100644 index 210c02d..0000000 --- "a/categories/\346\225\260\346\215\256\345\272\223/index.html" +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -分类: 数据库 | 闻 - - - - - - - - - - - - - -
- -
-
-
- - -
- - - -

- -
-

Yesterday is history, tomorrow is a mystery but today is a gift.

-
- - -
- - - - - - - -
- -
- -
- - - - - -
- -
- - - - - -
-
-
-

数据库 - 分类 -

-
- - -
- 2024 -
- - - - - -
-
- - - - -
-
- -
- -
- - -
- - 0% -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git "a/categories/\347\247\221\347\240\224/index.html" "b/categories/\347\247\221\347\240\224/index.html" index 270149e..ed285c0 100644 --- "a/categories/\347\247\221\347\240\224/index.html" +++ "b/categories/\347\247\221\347\240\224/index.html" @@ -149,18 +149,18 @@ diff --git "a/categories/\347\256\227\346\263\225/index.html" "b/categories/\347\256\227\346\263\225/index.html" index 5337f0e..b429489 100644 --- "a/categories/\347\256\227\346\263\225/index.html" +++ "b/categories/\347\256\227\346\263\225/index.html" @@ -149,18 +149,18 @@ diff --git a/index.html b/index.html index 5f8440c..4658d71 100644 --- a/index.html +++ b/index.html @@ -149,18 +149,18 @@

@@ -191,7 +191,7 @@

- +

- +