<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cfy1024的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cfy1024</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cfy1024]]></copyright><item><title><![CDATA[http基础篇（二）协议分层]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/118416024</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/118416024</guid><author>cfy1024</author><pubDate>Fri, 02 Jul 2021 18:07:39 +0800</pubDate><description><![CDATA[http基础篇（二）TCP/IP 协议分层（四层）链路层网际层/网络互联层传输层应用层OSI 网络分层模型（七层）物理层数据链路层网络层传输层会话层表示层应用层对比四层的优势四层负载均衡 OR 七层负载均衡TCP/IP 协议栈的工作方式
TCP/IP 协议分层（四层）
注：括号内为传输单位

层层相扣，每一层都需要下层的支撑，也为上层提供着支撑。
链路层
负责给以太网、WIFI等底层网络发送原始的数据包，工作在网卡，使用MAC地址标记网络上的设备，所以有时候也会成为MAC层。
网际层/网络互联层
IP协议处]]></description><category></category></item><item><title><![CDATA[http基础篇（一）名词解释]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/118367912</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/118367912</guid><author>cfy1024</author><pubDate>Fri, 02 Jul 2021 14:49:01 +0800</pubDate><description><![CDATA[httphttp的发展http
http的发展
http 0.9 简单的文本协议
http 1.0 确定了目前使用的大部分技术，但非标准
http 1.1 目前使用最广泛的协议，功能比较完善
http 2.0 优化了性能等，尚未普及
http 3.0 后续的发展方向
http
超文本 + 传输 + 协议
HyperText Transfer Protocol
协议：大家共同约定遵守的。http是计算机世界里的一个协议，它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范，以及相关的各种控制和错误处理]]></description><category></category></item><item><title><![CDATA[MySQL索引]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/115794704</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/115794704</guid><author>cfy1024</author><pubDate>Wed, 26 May 2021 20:41:26 +0800</pubDate><description><![CDATA[前言
1. 表的索引越全越好，对吗？
不是的
2.为什么不要在性别字段上建立索引？
就只有男和女，效果相当于全量扫描了、
3. 为什么不建议使用身份证做为主键？
太长了
4. 模糊匹配 like abc%，都用不到索引是吗？
5. 不要使用select *, 写明具体查询字段，为什么？
索引
数据库索引，是数据库管理系统中的一个排序的数据结构，以协助快速查询、更新数据库表中数据。
可以理解为“目录”
单列索引、联合索引
索引类型
normal 普通索引
unique 唯一索引
primary 主键索引 不唯]]></description><category></category></item><item><title><![CDATA[MySQL架构]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/115335574</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/115335574</guid><author>cfy1024</author><pubDate>Wed, 31 Mar 2021 22:23:17 +0800</pubDate><description><![CDATA[MySQL架构
1. mysql语句的执行流程
（1）、客户端与服务端连接
3306
客户端与服务端连接
通信类型：同步/异步
连接方式：长连接/短连接
协议：TCP/Unix Socket
单进程/多线程。
服务端查看连接了多少客户端
show global status like ‘Thread%’;
Threads_cached：缓存的线程数
Threads_connected：正在使用的连接数
Threads_created：为了连接创建的线程数
Threads_running：当前并发的连接数

]]></description><category></category></item><item><title><![CDATA[并发编程-线程池详解（ThreadPoolExecutor源码分析）]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/103265150</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/103265150</guid><author>cfy1024</author><pubDate>Tue, 14 Jul 2020 09:36:24 +0800</pubDate><description><![CDATA[线程池详解
一、为什么要有线程池？
当只有线程的时候，会有几个很明显的缺点：
1、来一个任务创建一个线程，线程创建的数量不可控；
2、频繁的创建和销毁线程，会消耗很多资源；
所以，就有了”线程池“。
它的优势：
1、限流 -&gt; 控制线程数量
2、降低频繁创建和销毁线程
3、对于任务的响应速度更快（不再需要创建线程，而是复用已有的线程，所以就更快啦）
二、JAVA中提供的线程池
Executo...]]></description><category></category></item><item><title><![CDATA[并发编程 - Java线程的一大堆]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107220853</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107220853</guid><author>cfy1024</author><pubDate>Sun, 12 Jul 2020 19:14:25 +0800</pubDate><description><![CDATA[一、通用的线程生命周期

1、初始状态：线程被创建，但是还允许被分配cpu执行。
2、可运行状态：线程可以分配cpu执行。
3、运行状态：线程正在被cpu执行。
4、休眠状态：运行的时候，如果被阻塞或者等待某个事件，就会从运行状态转为休眠状态，同时释放cpu资源，如果等到了事件，则会转为可运行状态；
5、结束状态：线程运行完成或者出现异常。
二、通用的线程生命周期

...]]></description><category></category></item><item><title><![CDATA[并发编程 - 等待/通知机制]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107190847</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107190847</guid><author>cfy1024</author><pubDate>Wed, 08 Jul 2020 09:23:21 +0800</pubDate><description><![CDATA[一、为啥需要等待 - 通知机制
假设线程没拿到锁，一直循环尝试去获取锁，这样效率是很低的，如果有通知机制，那么得到通知了，再执行即可。
二、何为等待 - 通知
医院就医顺序：
1、患者挂号，等待叫号。  （等锁）
2、患者被叫号，医生诊治。 （拿到锁）
3、医生问诊，开检查单。（线程缺少执行条件，释放锁）
4、患者检查完，重新等待叫号。（重新尝试拿锁）
5、患者被叫好，医生诊治。（拿锁-执行）
三、如何实现等待 - 通知？
synchronized 配合wait(),notify(),notifyAll()]]></description><category></category></item><item><title><![CDATA[并发编程 - 死锁如何处理]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107153927</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107153927</guid><author>cfy1024</author><pubDate>Tue, 07 Jul 2020 21:01:19 +0800</pubDate><description><![CDATA[一、死锁是个啥？
关于银行转账问题，a转给b，c转给d，涉及到两个用户，那么是否可以拿两把锁来操作呢？如下：

这种骚操作就可能引起死锁哦。 如下：

]]></description><category></category></item><item><title><![CDATA[并发编程 - 互斥锁synchronized]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107139070</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107139070</guid><author>cfy1024</author><pubDate>Sun, 05 Jul 2020 22:37:58 +0800</pubDate><description><![CDATA[一、如何解决原子性问题？
原子性问题的产生原因是“线程切换”，那么只要禁止线程切换就可以避免原子性问题，不管是单核还是多核cpu，都必须禁止同一时刻只有一个线程在执行。
二、锁
锁的含义：保护需要保护的资源

三、synchronized（同步锁/互斥锁）
java编译器会在synchronized修饰的代码前后加上加锁和解锁的功能。
3.1 修饰普通方法 = 锁住当前实例
示例：多个线程同时访问同一同步方法，则串行执行，即一个线程执行完，才会轮到下一个线程。
public class Synchroniz]]></description><category></category></item><item><title><![CDATA[并发编程 - Happens-before]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107115097</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107115097</guid><author>cfy1024</author><pubDate>Fri, 03 Jul 2020 22:13:56 +0800</pubDate><description><![CDATA[一、Happens-before
Happens-before: 前面的操作结果对后续操作是可见的。
要求编译器的优化必须遵许Happens-before原则
二、Happens-before 六大原则
2.1 程序的顺序性原则
单线程中，某一个变量的修改对后续的操作一定是可见的。
如下所示的程序中，第1句和第2句的顺序编译器可以调换（不影响程序结果），但是1和2必须要在3之前执行完成才可以哦（3有volatile关键字）。
public class Test {
    volatile static i]]></description><category></category></item><item><title><![CDATA[并发编程 - 可见性，原子性和有序性问题]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/107092566</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/107092566</guid><author>cfy1024</author><pubDate>Thu, 02 Jul 2020 21:37:40 +0800</pubDate><description><![CDATA[并发
一、并发的根源
cpu、内存、I/O设备 三者的速度差异
二、并发带来的问题
2.1 缓存导致的可见性
可见性：一个线程对共享变量的修改，另一个线程可以立马看到，称为“可见性”（你的修改我能看见）。
2.2 线程切换带来的原子性问题
把一个或者多个操作在cpu执行过程中不被中断的特性称为“原子性”（原子哦，不可切割）。
非原子性操作：

2.3 编译优化带来的有序性问题
编译器为了优化性能，可能会调整指令顺序哦。
public class Singleton {
  static Singleton ]]></description><category></category></item><item><title><![CDATA[mysql读写分离，主从复制，主从延迟]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106674868</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106674868</guid><author>cfy1024</author><pubDate>Thu, 11 Jun 2020 21:10:35 +0800</pubDate><description><![CDATA[一、mysql读写分离
为了提升数据库的性能，一般会采用读写分离，即写请求去主库，读请求去从库。

二、mysql主从复制

从库读binlog日志，写relay日志，操作数据都是串行执行的。所以从库的数据比主库晚一些执行，主从复制是有延迟的。
主库的写并发达到1000/s时，从延迟几ms；
主库的写并发达到2000/s时，从延迟几十ms；
主库的写并发达到4000/s以上，从延迟几s；
三、mysql主从延迟

...]]></description><category></category></item><item><title><![CDATA[如何生成分库分表的全局id？]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106445782</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106445782</guid><author>cfy1024</author><pubDate>Tue, 09 Jun 2020 21:00:09 +0800</pubDate><description><![CDATA[如何动态扩容缩容分库分表
第一种，停机扩容
参考单库到多库的迁移方案。

缺点：分库分表 迁移到 分库分表，旧的数据量已经很大了，这个方案很不靠谱哟。
第二种

]]></description><category></category></item><item><title><![CDATA[分库分表的中间件和迁移方案]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106443663</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106443663</guid><author>cfy1024</author><pubDate>Sat, 30 May 2020 19:18:28 +0800</pubDate><description><![CDATA[分库分表
一、为什么要分库分表
单机mysql带来的问题：
1、mysql单机，扛不住并发
2、mysql单机磁盘容量快满
3、mysql单表数据量太大，sql执行越跑越慢
利用分库分表将单机拆分成多机，带来的好处。
1、可承受的并发增加数倍；
2、磁盘容量增加数倍，使用率降低；
3、单表数据量缩小，sql语句执行速度加快。
二、分库分表的中间件
数据库中间件：用来做数据的分发。
有两种：proxy类和client类

cobar、TDDL、sharding-jdbc、atlas、mycat。
cobar ]]></description><category></category></item><item><title><![CDATA[认识分布式系统]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106245211</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106245211</guid><author>cfy1024</author><pubDate>Wed, 20 May 2020 22:04:19 +0800</pubDate><description><![CDATA[分布式系统
1、分布式系统是什么？
多个系统一起组成分布式系统，各个系统之间互相调用。
2、为什么要做系统拆分？
系统不做拆分，代码量会很大，很多人一起维护代码，难以维护，上线复杂。
拆分之后，每个人只维护自己的系统和服务，大大减少了代码冲突，上线也只需要测试自己的部分即可，想用新技术也不怕影响其他代码。
3、如何进行系统拆分？
根据系统功能进行拆分，比如风控系统，拆成了交易系统，授信系统，审核系统，催收系统等等，然后每个工程再自行拆分。如催收系统再分成 核心系统，催收活动系统，催收后台管理系统等等。
4、]]></description><category></category></item><item><title><![CDATA[redis的并发竞争]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106244280</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106244280</guid><author>cfy1024</author><pubDate>Wed, 20 May 2020 21:15:16 +0800</pubDate><description><![CDATA[redis的并发竞争
redis的并发竞争问题是什么？
某个时刻，多个系统实例都去更新key。

如何解决redis的并发竞争问题？
增加zookeeper分布式锁和时间戳，来保证后者不会被覆盖。


]]></description><category></category></item><item><title><![CDATA[redis-保证和数据库的一致性]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106162364</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106162364</guid><author>cfy1024</author><pubDate>Sat, 16 May 2020 18:48:38 +0800</pubDate><description><![CDATA[如何保证redis和数据库的一致性？
cache Aside pattern
读取的时候，先从缓存读，读不到就读数据库，然后取出数据之后写入到缓存；
更新的时候，先删除缓存，再更新数据库。
为啥不是更新缓存？
如果缓存的计算逻辑比较复杂（比如要关联表计算什么的），而且写的频率大于读的频率，那么更新缓存就不是很划算啦。
为什么要先删除缓存，在更新数据库？
如果先更新数据库，再删除缓存，那么如果删除失败了，就会导致缓存里是旧数据，数据库里是新数据。
如果删了缓存，更新数据库失败了，那么也无非是多更新一次缓存。
]]></description><category></category></item><item><title><![CDATA[redis的雪崩和穿透，情况描述及解决方案]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106159454</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106159454</guid><author>cfy1024</author><pubDate>Sat, 16 May 2020 17:20:17 +0800</pubDate><description><![CDATA[redis的雪崩和穿透
1、redis的雪崩发生的现象？
原本，缓存可以消化很多请求，使得这些请求不用到达数据库，降低db负载。
但是，如果缓存宕机了，所有请求将全部到达数据，数据库扛不住的话，会直接崩溃。

2、如何处理缓存雪崩？
首先，redis必须是高可用的，主从模式，哨兵，redis cluster等，避免全盘崩溃。
其次，不单单只有redis这一级缓存，可以多做一些，比如在系统内部增加ehcache。
（1、业务发送请求；2、先查本地的ehcache缓存；3、如果没有，查redis；4、如果还没有]]></description><category></category></item><item><title><![CDATA[redis cluster 的集群模式]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/106009484</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/106009484</guid><author>cfy1024</author><pubDate>Sat, 16 May 2020 14:51:37 +0800</pubDate><description><![CDATA[redis的集群模式
一、单机redis的存储瓶颈问题。
master和slave存储的数据量是一模一样的，如果master只能存储32g，那么这个模式下，一共也只能存储32g数据。

二、如何突破单机瓶颈问题，让redis支持海量数据。
建立多个master，每个master上存放部分数据，那么总容量就等于master容量之和。

三、redis的集群架构 - redis cluster
cluster - 支撑n个master node，每个master node都可以挂载多个slave node。
读]]></description><category></category></item><item><title><![CDATA[分布式缓存redis（持久化） - 大总结3]]></title><link>https://blog.youkuaiyun.com/cfy1024/article/details/105980735</link><guid>https://blog.youkuaiyun.com/cfy1024/article/details/105980735</guid><author>cfy1024</author><pubDate>Thu, 07 May 2020 21:29:04 +0800</pubDate><description><![CDATA[redis的持久化
一、为什么redis需要持久化？
redis持久化的意义，主要在于故障恢复。
如果redis宕机了，被重启，如果不进行持久化，那么所有的数据将会丢失，造成大型故障。
持久化，把数据存到磁盘上，然后从磁盘里备份一份到阿里云等云存储服务上，如遇机器宕机，可以保证不会丢掉所有数据。
二、redis的持久化有哪几种方式？
RDB：对redis里面的数据进行周期性的持久化。每隔一段时间，...]]></description><category></category></item></channel></rss>