<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Kindle_code的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Kindle_code</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Kindle_code]]></copyright><item><title><![CDATA[Spring Aop源码解析与细节]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/108051518</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/108051518</guid><author>Kindle_code</author><pubDate>Mon, 17 Aug 2020 12:01:21 +0800</pubDate><description><![CDATA[终于看完了庞大的Spring core（spring ioc / spring aop）,鉴于ioc更为庞大，先整理下aop的源码流程，也能简单回顾下springioc的流程

首先要理解spring bean的启动大致的流程与生命周期，建议看另一篇已经详细解释 spring生命周期
基础概念
AOP 与 Spring AOP 与 AspectJ的区别

AOP 是思想，Spring AOP 与 AspectJ是AOP的实现，Spring AOP实现的时候用了AspectJ的规范

基本使用与AOP概念
.]]></description><category></category></item><item><title><![CDATA[spring生命周期与集成apollo原理分析（动态生效配置中心）]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/108030809</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/108030809</guid><author>Kindle_code</author><pubDate>Sun, 16 Aug 2020 00:29:24 +0800</pubDate><description><![CDATA[结合spring总结的非常的棒！
转载链接： Apollo配置中心动态生效实现原理
Spring中的重要概念
在了解Apollo配置中心实现原理之前，我们需要先熟悉一下Spring框架中的几个重要的概念：
1、BeanDefinition
用于描述Bean的配置信息，Bean配置一般有三种方式：
（1）XML配置文件
（2）@Service、@Component等注解
（3）Java Config方式	
对应的BeanDefinition实现类如下图，Spring容器启动时，会把所有的Bean配置信息转换为]]></description><category></category></item><item><title><![CDATA[从kafka的请求处理模型理解Reactor模式]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107966490</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107966490</guid><author>Kindle_code</author><pubDate>Wed, 12 Aug 2020 23:52:16 +0800</pubDate><description><![CDATA[是

]]></description><category></category></item><item><title><![CDATA[从kafka说起零拷贝机制的运用]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107966344</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107966344</guid><author>Kindle_code</author><pubDate>Wed, 12 Aug 2020 20:51:50 +0800</pubDate><description><![CDATA[参考文章: 图解Kafka的零拷贝技术
kafka高吞吐量的原因
1、磁盘顺序写: 磁盘的顺序IO速度远大于固态硬盘随机写操作
2、消息压缩: 数据压缩减少网络传输
3、分批发送: kafka允许批量发送消息
4、分区: 多分区，并行消费
5、零拷贝机制
今天主要讲讲零拷贝机制与在kafka中的应用
传统的文件拷贝机制

传统的文件拷贝，从磁盘上再到网卡要经过四步
1、操作系统从磁盘将数据读取到内核空间的页缓存
2、应用程序将数据从内核空间读入用户空间缓存区
3、应用程序将读到的数据写回到socket缓冲区]]></description><category></category></item><item><title><![CDATA[ES 运行机制 与 分页方式]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107888809</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107888809</guid><author>Kindle_code</author><pubDate>Sun, 09 Aug 2020 00:57:18 +0800</pubDate><description><![CDATA[Lucene相关概念

Lucene采用新文档生成新倒排索引，读时两边一起。
Lucene构建单个倒排索引称为segment，合并在一起称为Lucene Index，对应ES中的一个Shard
Lucene有专门文件记录所有segment信息，称为commit point文件




...]]></description><category></category></item><item><title><![CDATA[秒杀系统总结与思考(四) 流量削峰]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107829772</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107829772</guid><author>Kindle_code</author><pubDate>Thu, 06 Aug 2020 02:48:34 +0800</pubDate><description><![CDATA[什么是流量削峰
秒杀这一场景，削峰的本质是更多的延缓用户请求的发出，以便减少和过滤一些无效的请求，遵从“请求数尽量少”的原则
为什么要用
削峰的存在，一是可以让服务器端处理变的更加平稳，二是节省服务器资源成本。
实现思路
排队、答题、分层过滤
排队
1、利用线程池加锁等待
2、先进先出、仅仅后出等常用的内存排队算法
3、请求序列化文件，然后再顺序读文件恢复请求
答题
作用: 1、防作弊。2、延缓请求

答题模块三部分
1、题库生成，重要防止机器算出结果
2、题库推送模块，秒杀答题前，把题目提前推送给详情和交]]></description><category></category></item><item><title><![CDATA[LRU算法介绍、优化、使用场景(Redis、MySQL、Memcached)]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107805289</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107805289</guid><author>Kindle_code</author><pubDate>Wed, 05 Aug 2020 01:25:19 +0800</pubDate><description><![CDATA[是的]]></description><category></category></item><item><title><![CDATA[java 线程池核心配置与介绍]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107804349</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107804349</guid><author>Kindle_code</author><pubDate>Wed, 05 Aug 2020 00:10:51 +0800</pubDate><description><![CDATA[线程池是什么、为什么要用线程池 参考 美团线程池实现原理介绍
参数的原始构造
ThreadPoolExecutor( int corePoolSize, 
                    int maximumPoolSize, 
                    long keepAliveTime, TimeUnit unit, 
                    BlockingQueue&lt;Runnable&gt; workQueue, 
                  ]]></description><category></category></item><item><title><![CDATA[MYSQL系列之 锁与死锁]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107775923</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107775923</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 23:27:31 +0800</pubDate><description><![CDATA[MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类
全局锁
MySQL 提供了一个加全局读锁的方法，命令是 Flush tables with read lock (FTWRL)。
当你需要让整个库处于只读状态的时候，可以使用这个命令，之后其他线程的以下语句会被阻塞：数据更新语句（数据的增删改）、数据定义语句（包括建表、修改表结构等）和更新类事务的提交语句。
风险:
1.如果在主库备份，在备份期间不能更新，业务停摆
2.如果在从库备份，备份期间不能执行主库同步的binlog，导致主从延迟
可重复读的隔]]></description><category></category></item><item><title><![CDATA[MYSQL系列之 事务]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107766378</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107766378</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 18:12:10 +0800</pubDate><description><![CDATA[事务的特性
ACID: Atomicity、Consistency、Isolation、Durability，即原子性、一致性、隔离性、持久性）
事务开启方式:
1、显式启动事务语句， begin 或 start transaction。配套的提交语句是 commit，回滚语句是 rollback。
2、set autocommit=0，这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句，这个事务就启动了，而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 ro]]></description><category></category></item><item><title><![CDATA[MYSQL系列之 索引的概念]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107761677</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107761677</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 14:47:39 +0800</pubDate><description><![CDATA[索引的常见模型:
1、哈希表，以key-value存储的数据结构。同样的哈希用链表存储（类hashmap）
优点: 插入很快
缺点: 链表非有序查询会很慢。范围查询遍历整个数据库
2、有序数组，
优点：等值查询（二分）、范围查询性能非常优秀
缺点：二叉搜索树维持有序需要log(N)、大量数据会访问多个数据块，访问会变慢
3、 InnoDB索引模型(B+)： 每一个索引在InnoDB中，对应一颗B+树
索引存储结构
create table T(    
    id int primary key,    ]]></description><category></category></item><item><title><![CDATA[MYSQL系列之 redolog 和 binlog]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107761612</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107761612</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 13:29:22 +0800</pubDate><description><![CDATA[上一篇中已经介绍过redo log的基本概念 MYSQL系列之 change buffer 和 redo log
binlog

MySQL整体分为两块：Server层，主要MySQL功能层面的事情，引擎层，负责存储相关。redo log是InnoDB特有的日志，Server有自己的日志，称为binlog

为什么有两份日志:

MySQL自带引擎不具有crash-safe能力，binlog只是用于归档，InnoDB使用redolog实现此功能

redolog 与 binlog 区别

1、redo lo]]></description><category></category></item><item><title><![CDATA[MYSQL系列之 change buffer 和 redo log]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107761447</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107761447</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 13:20:26 +0800</pubDate><description><![CDATA[读丁奇大佬课程笔记与思考 课程链接
WAL技术(Write-Ahead Logging)  先写日志，再写磁盘:

当有一条记录需要更新的时候，InnoDB 引擎就会先把记录写到 redo log（粉板）里面，并更新内存，这个时候更新就算完成了。同时，InnoDB 引擎会在适当的时候，将这个操作记录更新到磁盘里面，而这个更新往往是在系统比较空闲的时候做。
刚刚update的语句还在缓存中未持久化磁盘，此时select是直接读取内存

redo log

InnoDB的redo log固定大小，比如可配置一组]]></description><category></category></item><item><title><![CDATA[秒杀系统总结与思考(三) 发现热点]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107761257</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107761257</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 12:53:26 +0800</pubDate><description><![CDATA[什么是热点:
热点分为热点操作和热点数据。热点数据又分为静态热点数据和动态热点数据
发现热点数据:
发现静态热点数据:
1、静态热点数据可通过强制卖家报名，提前把商品筛选，然后通过后台系统将热点商品进行预处理（提前进行缓存），不过增加了卖家的使用成本，也不够灵活
2、通过技术手动进行提前预测，大数据分析，统计TOPN商品
发现动态热点数据: 可以通过大数据预测等手动提前预测，但是实时性较差
1、构建一个异步系统，可收集交易链路上各个环节的中间件产品的热点key,如Nginx、缓存、RPC服务框架等（一些中间]]></description><category></category></item><item><title><![CDATA[秒杀系统总结与思考(二) 数据动静分离]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107754753</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107754753</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 00:33:30 +0800</pubDate><description><![CDATA[何为动静数据

“动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和 URL、浏览者、时间、地域相关，以及是否含有 Cookie 等私密数据。比如说：
1、媒体类网站，无论谁访问，文章内容都一样，典型的静态资源
2、页面上的个性化推荐与个人信息等为动态数据

静态数据如何缓存呢
1、将静态数据缓存在用户最近的地方。常见的有三种:
· 用户浏览器
· CDN上
· 服务器的Cache上
2、静态化改造就是直接缓存HTTP连接。静态化缓存HTTP连接不是仅仅缓存数据，就连HTTP协议都不用重新组装
]]></description><category></category></item><item><title><![CDATA[秒杀系统总结与思考(一) 架构原则]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107754677</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107754677</guid><author>Kindle_code</author><pubDate>Mon, 03 Aug 2020 00:27:14 +0800</pubDate><description><![CDATA[重温许令波老师的秒杀系统课程  课程链接
架构基本原则: “4要1不要”
1、数据尽量少：数据网络传输，序列化，编码，解压等操作消耗CPU，数据越简单、越小则好
简化秒杀页面大小，去掉不必要的页面装修等
2、请求数量尽量少: 减少额外的请求，TCP等都耗时较多
3、路径尽量短: 远程调用都会创建scoket连接，也会增大服务不可用的可能性的叠加
4、依赖尽量少: 用户访问一个页面所依赖的系统，防止关键系统被弱依赖系统拖累
5、不要单点: 服务单点不可用
最初版本的秒杀系统

把你的商品购买页面增加一个“定时]]></description><category></category></item><item><title><![CDATA[ES读写性能优化]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107739628</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107739628</guid><author>Kindle_code</author><pubDate>Sun, 02 Aug 2020 01:02:37 +0800</pubDate><description><![CDATA[写性能优化
优化方案:

客户端: 多线程写，批量写
ES：在高质量数据建模前提下，主要在refresh,translog和flush之间做文章

写性能优化 - refresh

增大refresh_interval,降低实时性，增大一次refresh处理的文档树，默认是1s,设置为-1直接禁止自动refresh
增大index buffer size ,参数 indices.memory.index_buffer_size(静态参数，在elasticsearch.yml),默认10%

写性能优化 - ]]></description><category></category></item><item><title><![CDATA[ES为什么被称为实时性搜索]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107739268</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107739268</guid><author>Kindle_code</author><pubDate>Sun, 02 Aug 2020 00:33:57 +0800</pubDate><description><![CDATA[segment

Lucene采用新文档生成新倒排索引，读时两边一起。
Lucene构建单个倒排索引称为segment，合并在一起称为Lucene Index，对应ES中的一个Shard
Lucene有专门文件记录所有segment信息，称为commit point文件


ES Index 与 Lucene Index整体视角对照图

文档搜索实时性 - refresh

· segment写入磁盘很耗时，借助缓存，先将segment在缓存中创建并开放查询，提升实时性，该过程成为refresh
· ref]]></description><category></category></item><item><title><![CDATA[网易云音乐评论模块高并发下的设计思考]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107724391</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107724391</guid><author>Kindle_code</author><pubDate>Sat, 01 Aug 2020 01:11:49 +0800</pubDate><description><![CDATA[主要讨论的功能 (基于高流量高并发的场景)

评论资源
评论总数的更新
评论点赞
精彩评论的读取


评论表设计(简约版)
这是资源通用的表设计

高并发下的问题

热点数据并发量极高
评论的新增，更新CommentResource的评论总数，存在并发问题
评论的点赞数也是同样的问题

四大业务模块详解

评论发表，如下图

通过异步化的操作，来解决行锁竞争给核心资源MYSQL带来压力，保证系统平稳平滑。
在异步化的场景下，同时带来的问题
1、评论的有序性质: 评论的发布本周没有逻辑上的有序，最终展示通过发]]></description><category></category></item><item><title><![CDATA[高并发之请求合并]]></title><link>https://blog.youkuaiyun.com/Kindle_code/article/details/107704693</link><guid>https://blog.youkuaiyun.com/Kindle_code/article/details/107704693</guid><author>Kindle_code</author><pubDate>Fri, 31 Jul 2020 01:55:46 +0800</pubDate><description><![CDATA[应用场景

Redis官方介绍,Redis单机读写性能12万/s,批量处理能达到70w/秒。不管是缓存还是数据库，都有批量处理能力。当系统达到瓶颈时，才充分考虑压榨心梗。适用于电商双十一，特定高并发场景。

思路

1、一个用户请求到来时，将请求放在一个队列中，单线程定时任务10ms从队列中取数据进行处理。
2、定时任务，把队列中的请求，批量的方式向后端和Redis缓存或数据库发起批量请求。
3、请求合并，请求阻塞等待请求处理完毕，需要用到Future

代码实现:
/**
* @author MrCai
]]></description><category></category></item></channel></rss>