- 博客(25)
- 收藏
- 关注
原创 hashMap解析
为什么hashMap不仅仅用数组一种数据结构?因为数组虽然查询的时间复杂度为O1,但是数组有个缺陷就是不能动态改变大小,一旦超出数组长度,就需要创建一个新的数组,数组默认长度是16链表是怎么插入的?java1.7采用头部插入法,后来的数据插入链表的头部,而1.8采用的时尾部插入法红黑树hashMap在扩容的时候遇到的问题?在并发情况下,每个线程都同时申请扩容hashMap,这就造成声明多个数组,会导致内存溢出和频繁gc,...
2020-11-28 16:27:06 168
原创 sping源码解读(三)
本篇我们重点讲下getBean流程然后我们重点看下这个doGetBean方法我们重点看下这个getSingleton方法 @Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == nu
2020-11-01 18:15:08 191
原创 spring源码解读(二)
接着上一篇文章,首先我们需要解决如何解决不修改spring源码的情况下,使注解在接口上生效?根据前一篇文章分析,使注解不在接口上生效的原因是因为ClassPathScanningCandidateComponentProvider的isCandidateComponent的方法protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { AnnotationMetadata metadata =
2020-11-01 15:54:56 848 1
原创 spring源码解读(一)
bean注入的方式1:xml<bean id = ""class = ""/>2:@Bean config配置文件3:@ComponentScan @Controller @Service @Component......4:@import上述四种方式,导入bean会被spring识别成BeanDefinition对象,不是单例对象一般出现NoSuchBeanDefinitionException异常,代表该bean没有被spring管理...
2020-10-10 22:18:36 151
原创 redis分布式锁
常用的redis分布式锁实现方式以上方式可能会出现一些问题:在高并发的情况下,每个线程的执行顺序是不可预估的,当前线程抢占的锁可能被其它的锁给释放掉,应将上述代码修改成如下:以上方案还是会出现一些问题,比如锁失效时间不好把握,所以我们还要继续优化,一般一线大厂他们后台会启动一个异步线程去监控这个key是否存在,如果存在则会延长失效时间使用redisson:三行代码实现锁:原理:底层是通过lua脚本语言实现:redis是满足AP的,保证可用性,但是不
2020-10-04 13:32:24 169
原创 redis架构介绍
redis速度快的原因基于内存单线程:worker线程是单线程(工作线程) 但是io线程(读写线程)是多个基于NIO的多路复用器,在linux系统中是采用epoll形式redis通信:1:epoll不会拉取数据,只会告诉你哪个节点有数据传输,然后把信息告诉给worker线程2:由woker线程去内核中读取对应的客户端传输的数据3:把数据取回到内存进行计算(set get等操作)redis串行化redis是单线程的,所以在并发情况下不需要加锁,它是通过工作线程进行轮
2020-09-13 18:23:03 294
原创 分布式事务
CAP定理任何分布式系统都有三个指标,且无法同时满足三个,最多只能满足其中的两个一致性:就是写操作后的读操作,必须返回该值,就比如下图,某条记录本来是v0,向G1发起修改操作,改成v1,而后面读请求被负载到了G2上,如果G2数据没有修改,就造成了数据不一致性可用性:只要用户发出请求,那么服务器必须给出回应(对错不论)分区容错性:大多数分布式系统可能存在多个机房中,他们之间可能因为网络的原因导致无法通信为什么说一致性和可用性之间是矛盾的?因为如果在G2没有同步G1修改后的数据之
2020-08-24 17:45:18 107
原创 java秒杀系统设计
1:架构图说明:1:搜索系统主要使用elasticSearch,因为es可以达到PB级别,轻松应对海量数据的查询速度,不建议使用缓存,因为如果商品数据过大,使用缓存占用的容量是非常大,会对缓存这块造成性能影响,而且缓存的搜索方式比较局限2:用户进来的时候首先通过lvs+nginx+lua脚本判断用户抢购的商品是否是热门商品,,如果是热点数据则走热点数据抢单通道,如果不是热门就走冷门抢购通道3:热门数据抢购通道使用队列发送到kafka,这样可以避免服务器崩溃2:淘宝的秒杀架构详
2020-08-10 22:13:44 668
原创 数据库本地事务
读未提交一个事务可以读取到另一个事务未提交的内容,就是脏读读已提交读取不到未提交的数据,读的还是原始数据,只有事务提交后了才能读取到可重复度在一个事务执行过程中,不管对方事务有没有提交,读取到的数据都是一致的串行化事务被排成队,一个个去执行ACID隔离性和一致性可以通过事务去实现,但是原子性和持久性是靠undo和redo实现的undo日志:为满足原子性,在操作数据之前,会将数据被分到undo Log中,然后再执行修改,如过执行了rollback操作,系统可以将Un
2020-07-31 23:52:02 275
原创 mysql存储引擎
mysql不同引擎存储方式我们先创建两张表,m_innodb是innodb引擎,m_myisam是MyIsam引擎通过执行sql,查看数据保存的位置show VARIABLES LIKE 'datadir';然后去服务器该路径下查看:共同都有的是frm文件,这个是存储的是表的元信息,包括一些字段信息.MYI文件是MyISAM引擎B+树存储的位置.MYD是MyISAM引擎是数据存储的位置在innodb中,数据就是索引,索引就是数据,数据是存放在叶子节点上的,innod
2020-07-31 23:07:13 124
原创 redis缓存穿透及解决方案
redis常用业务场景如何解决缓存穿透带来的问题如果是多次查询相同不存在的值,可以将该空值也给添加至redis中,并且给失效时间,因为防止后面该条数据会有更新。问题:如何在海量数据(例如10亿无序,不定长,不重复)快速判断某一元素是否存在?分析思路:首先,10亿条数据肯定不能直接去mysql,因为mysql数据是在磁盘上,会很慢。能否直接放到redis???也不可以,因为如果全放到redis,就无法保证redis和mysql的数据一致性。所以我们必须要有个存.
2020-07-29 17:33:18 186
原创 mysql索引的本质
磁盘存取原理说明:磁盘逆时针旋转,找到对应的数据后(旋转时间),然后磁头再左右移动读取数据(寻道时间),这就是取一行数据的过程,也叫一次IO。如果不加索引的情况,每查一条数据数据都要经历一次磁盘IO,比如某表由十条数据,要取出最后一条数据那么需要经过十次IO,效率低下。...
2020-07-28 23:13:48 246
原创 java二叉排序树
二叉排序树的新增public void insertNode(SortTreeNode node) { if (node == null) { return; } if (this.value < node.value) { if (this.leftNode == null) { this.leftNode = node; return
2020-07-26 19:40:47 94
原创 java链式存储二叉树详解
前序遍历:1 2 4 5 3 6 7中序遍历:4 2 5 1 6 3 7后序遍历:4 5 2 6 7 3 1二叉树遍历源码public class TreeNode { //根节点值 private int value; //左节点 private TreeNode leftNode; //右节点 private TreeNode rightNode; public TreeNode(int value) { ...
2020-07-25 15:30:04 138
原创 redis持久化数据
RDB和AOF两种持久化机制的介绍rdb持久化机制:对redis数据周期性持久化AOF持久化机制:是对每条命令作为日志,以append-only模式写到日志文件中在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集如果我们想要redis仅仅作为纯内存的缓存来用,那么可以禁止RDB和AOF所有的持久化机制如果同时使用RDB和AOF两种持久化机制,那么在redis重启...
2019-10-20 15:36:45 189
原创 SpringMVC学习总结
springMVC搭建流程(零配置)官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html以以下代码替换原生的web.xml文件配置public class MyWebApplicationInitializer implements WebApplicationInitial...
2019-10-18 19:38:09 125
原创 jvm简单学习笔记
jvm标题jvm运行时数据区方法区:java堆:java栈class反汇编命令:jvm性能调优工具堆jvm运行时数据区方法区:运行的常量池和虚拟机加载的类信息,比如方法名字,类的名字、接口、父类以及静态变量和一些及时编译器编译的代码数据常量java堆:存放对象实例数据垃圾回收器回收最高的区域对象实例都在堆上分配内存(这话不是绝对)java栈栈帧:每执行方法就会向java栈中存放一...
2019-10-17 22:47:18 135
原创 hbase单机安装
一:修改hbase-site.xml.文件:<configuration><property> <name>hbase.rootdir</name> <value>hdfs://172.17.152.57:9000/hbase</value> </property> <proper...
2019-04-07 12:06:12 111
原创 hadoop单机安装
一:修改hdfs-site.xml文件:<configuration> <property> <name>dfs.replication</name> <value>1</value> </property></configuration>二:修改co...
2019-04-07 10:53:08 130
原创 redis哨兵机制搭建
redis哨兵机制搭建cp redis.conf redis6380.conf修改redis6380配置:slaveof 127.0.0.1 6379 //使6380作为6379从服务器配置哨兵:修改redis-sentinel.conf文件:port 26379sentinel monitor mymaster 127.0.0.1 6379 1启动主从服务器redis-s...
2019-03-31 20:25:37 100
原创 mysql主从复制
mysql复制--主从复制配置复制原理:复制流程图:复制过程:主从复制配置过程:主节点:编辑从节点配置文件复制原理:Mysql中有一种日志叫做bin日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL语句(insert,update,delete,ALTER TABLE,grant等等)。主从复制的原理其实就是把主服务器上的BIN日志复制到从服务器上执行一遍,这样从服务器上的数据就和...
2018-11-06 15:09:52 88
原创 kafka安装配置及启动
kafka安装启动1.解压kafka安装2.修改配置vim config/zookeeper.propertiesdataDir=/tmp/zookeeper //ZK数据存储路径# the port at which the clients will connectclientPort=2181 //ZK端口号# disable the per-ip limit on the...
2018-10-10 17:12:26 286
原创 使用Quartz实现定时任务
使用Quartz实现定时任务Quertz是一个开源的作业任务调度框架,他可以完成像JavaScript定时器类式的功能,其实Java中Timer也可实现部分功能,但相比Quertz还是略逊一筹,本人这次需要解决的就是定期统计消费记录的功能。你还可以用他完成定期执行各类操作的功能。比如想每月25号,信用卡自动还款想每年4月1日自己给当年暗恋女神发一封匿名贺卡想每隔1小时,备份一下自己的学习笔...
2018-10-10 16:22:08 160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人