- 博客(77)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 Spring Aop源码解析与细节
终于看完了庞大的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概念.
2020-08-17 12:01:21
302
转载 spring生命周期与集成apollo原理分析(动态生效配置中心)
结合spring总结的非常的棒!转载链接: Apollo配置中心动态生效实现原理Spring中的重要概念在了解Apollo配置中心实现原理之前,我们需要先熟悉一下Spring框架中的几个重要的概念:1、BeanDefinition用于描述Bean的配置信息,Bean配置一般有三种方式:(1)XML配置文件(2)@Service、@Component等注解(3)Java Config方式 对应的BeanDefinition实现类如下图,Spring容器启动时,会把所有的Bean配置信息转换为
2020-08-16 00:29:24
1436
1
原创 从kafka说起零拷贝机制的运用
参考文章: 图解Kafka的零拷贝技术kafka高吞吐量的原因1、磁盘顺序写: 磁盘的顺序IO速度远大于固态硬盘随机写操作2、消息压缩: 数据压缩减少网络传输3、分批发送: kafka允许批量发送消息4、分区: 多分区,并行消费5、零拷贝机制今天主要讲讲零拷贝机制与在kafka中的应用传统的文件拷贝机制传统的文件拷贝,从磁盘上再到网卡要经过四步1、操作系统从磁盘将数据读取到内核空间的页缓存2、应用程序将数据从内核空间读入用户空间缓存区3、应用程序将读到的数据写回到socket缓冲区
2020-08-12 20:51:50
302
原创 ES 运行机制 与 分页方式
Lucene相关概念Lucene采用新文档生成新倒排索引,读时两边一起。Lucene构建单个倒排索引称为segment,合并在一起称为Lucene Index,对应ES中的一个ShardLucene有专门文件记录所有segment信息,称为commit point文件...
2020-08-09 00:57:18
362
原创 秒杀系统总结与思考(四) 流量削峰
什么是流量削峰秒杀这一场景,削峰的本质是更多的延缓用户请求的发出,以便减少和过滤一些无效的请求,遵从“请求数尽量少”的原则为什么要用削峰的存在,一是可以让服务器端处理变的更加平稳,二是节省服务器资源成本。实现思路排队、答题、分层过滤排队1、利用线程池加锁等待2、先进先出、仅仅后出等常用的内存排队算法3、请求序列化文件,然后再顺序读文件恢复请求答题作用: 1、防作弊。2、延缓请求答题模块三部分1、题库生成,重要防止机器算出结果2、题库推送模块,秒杀答题前,把题目提前推送给详情和交
2020-08-06 02:48:34
295
转载 java 线程池核心配置与介绍
线程池是什么、为什么要用线程池 参考 美团线程池实现原理介绍参数的原始构造ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
2020-08-05 00:10:51
223
原创 MYSQL系列之 锁与死锁
MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。风险:1.如果在主库备份,在备份期间不能更新,业务停摆2.如果在从库备份,备份期间不能执行主库同步的binlog,导致主从延迟可重复读的隔
2020-08-03 23:27:31
343
原创 MYSQL系列之 事务
事务的特性ACID: Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)事务开启方式:1、显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。2、set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 ro
2020-08-03 18:12:10
283
原创 MYSQL系列之 索引的概念
索引的常见模型:1、哈希表,以key-value存储的数据结构。同样的哈希用链表存储(类hashmap)优点: 插入很快缺点: 链表非有序查询会很慢。范围查询遍历整个数据库2、有序数组,优点:等值查询(二分)、范围查询性能非常优秀缺点:二叉搜索树维持有序需要log(N)、大量数据会访问多个数据块,访问会变慢3、 InnoDB索引模型(B+): 每一个索引在InnoDB中,对应一颗B+树索引存储结构create table T( id int primary key,
2020-08-03 14:47:39
202
原创 MYSQL系列之 redolog 和 binlog
上一篇中已经介绍过redo log的基本概念 MYSQL系列之 change buffer 和 redo logbinlogMySQL整体分为两块:Server层,主要MySQL功能层面的事情,引擎层,负责存储相关。redo log是InnoDB特有的日志,Server有自己的日志,称为binlog为什么有两份日志:MySQL自带引擎不具有crash-safe能力,binlog只是用于归档,InnoDB使用redolog实现此功能redolog 与 binlog 区别1、redo lo
2020-08-03 13:29:22
184
原创 MYSQL系列之 change buffer 和 redo log
读丁奇大佬课程笔记与思考 课程链接WAL技术(Write-Ahead Logging) 先写日志,再写磁盘:当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。刚刚update的语句还在缓存中未持久化磁盘,此时select是直接读取内存redo logInnoDB的redo log固定大小,比如可配置一组
2020-08-03 13:20:26
3066
2
原创 秒杀系统总结与思考(三) 发现热点
什么是热点:热点分为热点操作和热点数据。热点数据又分为静态热点数据和动态热点数据发现热点数据:发现静态热点数据:1、静态热点数据可通过强制卖家报名,提前把商品筛选,然后通过后台系统将热点商品进行预处理(提前进行缓存),不过增加了卖家的使用成本,也不够灵活2、通过技术手动进行提前预测,大数据分析,统计TOPN商品发现动态热点数据: 可以通过大数据预测等手动提前预测,但是实时性较差1、构建一个异步系统,可收集交易链路上各个环节的中间件产品的热点key,如Nginx、缓存、RPC服务框架等(一些中间
2020-08-03 12:53:26
277
原创 秒杀系统总结与思考(二) 数据动静分离
何为动静数据“动态数据”和“静态数据”的主要区别就是看页面中输出的数据是否和 URL、浏览者、时间、地域相关,以及是否含有 Cookie 等私密数据。比如说:1、媒体类网站,无论谁访问,文章内容都一样,典型的静态资源2、页面上的个性化推荐与个人信息等为动态数据静态数据如何缓存呢1、将静态数据缓存在用户最近的地方。常见的有三种:· 用户浏览器· CDN上· 服务器的Cache上2、静态化改造就是直接缓存HTTP连接。静态化缓存HTTP连接不是仅仅缓存数据,就连HTTP协议都不用重新组装
2020-08-03 00:33:30
356
原创 秒杀系统总结与思考(一) 架构原则
重温许令波老师的秒杀系统课程 课程链接架构基本原则: “4要1不要”1、数据尽量少:数据网络传输,序列化,编码,解压等操作消耗CPU,数据越简单、越小则好简化秒杀页面大小,去掉不必要的页面装修等2、请求数量尽量少: 减少额外的请求,TCP等都耗时较多3、路径尽量短: 远程调用都会创建scoket连接,也会增大服务不可用的可能性的叠加4、依赖尽量少: 用户访问一个页面所依赖的系统,防止关键系统被弱依赖系统拖累5、不要单点: 服务单点不可用最初版本的秒杀系统把你的商品购买页面增加一个“定时
2020-08-03 00:27:14
251
原创 ES读写性能优化
写性能优化优化方案:客户端: 多线程写,批量写ES:在高质量数据建模前提下,主要在refresh,translog和flush之间做文章写性能优化 - refresh增大refresh_interval,降低实时性,增大一次refresh处理的文档树,默认是1s,设置为-1直接禁止自动refresh增大index buffer size ,参数 indices.memory.index_buffer_size(静态参数,在elasticsearch.yml),默认10%写性能优化 -
2020-08-02 01:02:37
1012
原创 ES为什么被称为实时性搜索
segmentLucene采用新文档生成新倒排索引,读时两边一起。Lucene构建单个倒排索引称为segment,合并在一起称为Lucene Index,对应ES中的一个ShardLucene有专门文件记录所有segment信息,称为commit point文件ES Index 与 Lucene Index整体视角对照图文档搜索实时性 - refresh· segment写入磁盘很耗时,借助缓存,先将segment在缓存中创建并开放查询,提升实时性,该过程成为refresh· ref
2020-08-02 00:33:57
753
原创 网易云音乐评论模块高并发下的设计思考
主要讨论的功能 (基于高流量高并发的场景)评论资源评论总数的更新评论点赞精彩评论的读取评论表设计(简约版)这是资源通用的表设计高并发下的问题热点数据并发量极高评论的新增,更新CommentResource的评论总数,存在并发问题评论的点赞数也是同样的问题四大业务模块详解评论发表,如下图通过异步化的操作,来解决行锁竞争给核心资源MYSQL带来压力,保证系统平稳平滑。在异步化的场景下,同时带来的问题1、评论的有序性质: 评论的发布本周没有逻辑上的有序,最终展示通过发
2020-08-01 01:11:49
987
2
原创 高并发之请求合并
应用场景Redis官方介绍,Redis单机读写性能12万/s,批量处理能达到70w/秒。不管是缓存还是数据库,都有批量处理能力。当系统达到瓶颈时,才充分考虑压榨心梗。适用于电商双十一,特定高并发场景。思路1、一个用户请求到来时,将请求放在一个队列中,单线程定时任务10ms从队列中取数据进行处理。2、定时任务,把队列中的请求,批量的方式向后端和Redis缓存或数据库发起批量请求。3、请求合并,请求阻塞等待请求处理完毕,需要用到Future代码实现:/*** @author MrCai
2020-07-31 01:55:46
636
原创 Memcached内存管理模型与LRU算法优化
Memcached 采用的是 Slab allocation 内存模型,如下图:说明:1、最大内存默认64兆,通过-m调整,内存空间有slab class构成,内存以slab page为单位申请,分配到对应的slab class2、slab page: 最大1兆,由一个或多个chunk组成3、chunk: 实际存储数据的单元96字节 ~ 1兆4、slab class增长的幅度,由增长因子决定 (默认1.25)5、调整slab的增长因子,根据业务需求调整,进行调优Memcached LRU 策
2020-07-30 01:55:40
454
原创 Elasticsearch 集群基本概念
构建集群命令启动es节点:bin/elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node1 -Enode.name=node1 -Ehttp.port=5200 -dbin/elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node2 -Enode.name=node2 -Ehttp.port=5200 -d基本概念Cluster Stat
2020-07-30 01:44:58
247
原创 布隆过滤器原理与场景
原理一个很长的二进制向量和一系列随机映射函数 。通过设置向量数组长度与定义多种随机hash函数,正向预热数据,反向查询数据。使用的hash函数越多,区分度就越高。图解:使用场景大数据判断是否存在:这就可以实现出上述的去重功能,如果你的服务器内存足够大的话,那么使用 HashMap 可能是一个不错的解决方案,理论上时间复杂度可以达到 O(1 的级别,但是当数据量起来之后,还是只能考虑布隆过滤器。解决缓存穿透:我们经常会把一些热点数据放在 Redis 中当作缓存,例如产品详情。 通常一
2020-07-29 22:59:41
220
原创 从LongAdder说到内存伪共享
简介LongAdder 为AtomicLong增强版特点:1、AtomicLong 多线程CAS竞争同一个锁,其他自旋,LongAdder 多个Cell对象多个锁,获得锁失败,会尝试在别的cell上进行竞争,减少锁冲突,适合写多读少2、LongAdder 中的 cell数组长度初始0,随后扩容会保证长度与CPU的核数差不多,长度是2的倍数保证hash的均匀3、cell数组解决了伪共享问题主角:伪共享什么是伪共享(概念)缓存系统中是以缓存行,64字节(cache line)为单位存储的
2020-07-29 11:16:57
487
原创 记一次线上dubbo线程池爆满的问题 jedis 2.9源码问题
服务项目背景:一个二手房楼盘字典的服务,有三台服务,查询量大,用了redis缓存,用的缓存框架 jetcache,注解缓存dubbo线程池配置 500个线程 dubbo.provider.threads=500异常现象与初步分析以为是底层服务,Cat疯狂告警,整个dashboard告警。dubbo 远程调用全部超时,查看poi.esf.fdd项目日志,只有一台机器dubbohandler线程一直处于爆满状态,其他两台偶有50-100ms的慢SQLCat上GC没有任何异常 初步认为是慢
2020-07-29 10:50:41
1227
原创 基于rabbitMQ解决分布式事务
常见的分布式事务解决方案:1、基于数据库XA/JTA协议的方式: 需要数据库厂商支持;java组件有atomikos等2、异步校对数据的方式: 支付宝、微信支付主动查询支付状态、对账单的形式3、基于可靠消息的MQ解决方案: 异步场景;通用性强;扩展性较高4、TCC编程式解决方案: 严选、阿里自己封装的DTX课外读物:https://my.oschina.net/dyyweb/blog/1633373错误场景:调用接口失败时,订单系统事务回滚,提示用户操作失败误以为这样的接口调用写法,就
2020-07-29 10:30:49
218
原创 mysql删除重复数据,并保留一条
因为系统bug在对所在店铺的会员进行屏蔽的时候没有进行查重操作,导致在屏蔽表中出现了重复的数据,所以需要删除此表中姓名重复的数据,并保留其中的一条。模拟数据如下图: 第一条sql :delete from t_black_list where sellerId = 120055122 and names in ( select names from t_black_list wh
2018-01-18 15:29:27
3054
原创 mysql 计算前多少天 sql语句
语法 DATE_SUB(date,INTERVAL expr type) date: 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。type 参数可以是下列值:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_
2017-12-14 16:38:23
1335
原创 springmvc @RequestParam 获取参数 HTTP Status 400 - Required String parameter 'xx' is not present
公司换用react做前后端分离之后,发现用@RequestParam不能获取前台传回来的值,使用Postman发送模拟请求的时候,Content-Type == application/x-www-form-urlencoded 可以接受到请求,而 Content-Type == application/json 的时候参数获取不到。并且会报错:HTTP Status 400 - Required
2017-11-04 11:35:07
14104
原创 java调用新浪长连接转短链接api--新浪微博Oauth2.0授权 获取Access Token
最近接触到了新浪长连接转短链接api调用,之前公司直接让用户跳转到新浪页面自己生成,然后复制了页面跳回来再用,用户体验不好,现在做修改。新浪Oauth2.0授权 获取Access Token新浪开放平台 —> 【网站接入web】 —> 【立即接入】 —> 创建应用 —> 【获得AppKey/AppSecret】 修改回调地址(后面会用到) 下载java授权sdk ( –> 点击下载 )
2017-08-11 15:19:43
3925
原创 jQuery 表单异步提交
因为在表单上传文件的时候,需要获得后台的返回值,所以需要表单异步提交。这里用的是jQuery的异步提交ajaxSubmit : (直接贴代码) //提交表单(上传文件) $("#importPhoneForm").ajaxSubmit(url, data, "", function (calbackData) { //calbackData为后台返回的结果 });
2017-07-17 17:58:41
534
原创 Fastjson toJSONString用单引号进行转换
String str = '[{"sourceItemId":"554826261696","itemTitle":"服务商测试商品不发货","itemCount":"1","itemCountMax":""},{"sourceItemId":"554864314455","itemTitle":"测试店铺不发货","itemCount":"1","itemCountMax":""}]';JSON
2017-07-14 00:18:53
8218
原创 实时监控文本框中的数据变化(完美解决方案)
首先会想到用onchange时间监听,不过onchange事件是在鼠标焦点离开文本框的时候才会触发的事件,并不能满足我们实时监控文本框的需求。jquery代码实现(推荐): $('textarea').bind('input propertychange', function() { $('.msg').html($(this).val().length + ' characters');
2017-07-12 13:07:19
2010
原创 装饰者模式之servlet过滤器(Filter)网页压缩
1.装饰者模式定义动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰模式相比生成子类更为灵活。 ------《设计模式之禅》2.通用类图: 类图说明:● Component抽象构件Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也
2016-09-22 19:52:14
843
原创 jQuery表单校验之Validate
jQuery表单校验之Validate一、相关网址jQuery表单校验框架Validate的官方链接:官网 jQuery表单校验框架Validate的官方文档: 官方文档二、 文件导入三、校验规则国际化后中文的一些默认值:四、表单校验初探Html代码:<body> <form action="" method="post" id="myform"> <di
2016-08-28 16:45:23
906
原创 jQuery中选择器空格注意事项
jQuery以它强大的选择器,给开发带来了极大的方便,有敲空格习惯的程序猿很容易在这这里栽跟头,jQuery中选择器中的空格是不容忽视的,下面是《锋利的jQuery》中的例子:<body> <div class="test"> <div style="display:none;">aa</div> <div style="display:none;">bb</di
2016-08-26 20:26:54
963
原创 如何在tomcat服务器中读取xml文件(路径问题)
因为之前用的dom4j读取的都是本地的xml文件,所以一旦在服务器中就不能再像之前那样获取xml路径了。 可以通过反射获得项目的src的路径。问题:如何在服务器中读取xml文件(路径问题)读取product.xml文件 解决方案: 解决代码://获得Document对象 Document doc = null; try { InputSt
2016-08-22 16:32:40
3425
原创 git push时遇到问题“fatal: No destination configured to push to.”
另一篇博客已经解决相应问题 :http://blog.csdn.net/kindle_code/article/details/52196511
2016-08-13 00:16:06
12524
原创 git push:fatal the current branch master has no upstream branch
今天试git的时候最后一步 git本地仓库push远程仓库的时候,出了这个错: fatal the current branch master has no upstream branch解决方案 : 用如下命令提交git push -u origin master具体原因转向另一篇博客看:http://blog.csdn.net/kindle_code/article/details/52196
2016-08-13 00:12:14
9375
1
java并发编程实战pdf及源码
2016-07-28
关于java的一个小小的语法问题,有点想不明白
2016-07-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人