- 博客(77)
- 收藏
- 关注
原创 redis字符串
文章目录redis字符串redis字符串的实现SDS代码结构动态扩展特点redis字符串的优势 redis字符串 redis字符串的实现 redis的基础语言是c语言,但是其中字符串的实现是自己实现的,目的是为了提高性能,增强相应速度。 SDS 代码结构 struct sdshdr{ // 记录已使用长度 int len; // 记录空闲未使用的长度 int free; // 字符数组 char[] buf; }; 最后一个字符为空字符,但是这个空字符不会
2021-05-24 20:59:45
231
原创 LinkedList
文章目录LinkedList简介源码分析基础属性构造方法node节点增加获取删除修改 LinkedList 简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的,是线程不安全的,允许元素为null的双向链表。 源码分析 基础属性 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<
2021-04-23 21:02:05
381
原创 ArrayList
文章目录ArrayList简介优缺点ArrayList 和 LinkedList 的区别ArrayList 和 Vector 的区别源码分析基础属性transient构造方法基础方法clonetrimToSizeadd(E e)add(int index, E element) ArrayList 简介 ArrayList是常用的是数据存储容器,底层是数组,查询效率很高,线程bu’an’q 优缺点 **优点: ** 底层是数组,查询的效率很高 顺序插入元素时效率很高,自动扩容 缺点: 插入和删除元素的
2021-04-22 19:23:02
203
原创 分布式锁,进程锁,线程锁
文章目录分布式锁,进程锁,线程锁概念分布式锁的实现缓解数据库压力常用分布式锁 分布式锁,进程锁,线程锁 概念 线程锁: 主要用来给方法和代码块来加锁,多个线程同时访问被加锁的方法或者代码块时,同一时间只有一个线程在执行,其他线程只能访问该对象中的非加锁代码块 进程锁: 为了控制操作系统中多个进程访问一个共享资源,可以使用本地系统的信号量控制 分布式锁: 当多个进程不在同一个系统中时,使用分布式锁控制多个进程对资源的访问 分布式锁的实现 分布式锁的实现总是要依赖第三方来存储锁的元数据信息。 数据库乐观锁 基
2021-04-21 19:26:19
401
原创 消息队列的高可用
文章目录消息队列的高可用RabbtitMQ 高可用 消息队列的高可用 RabbtitMQ 高可用 RabbitMQ有三种模式:单机模式 、普通集群模式、镜像集群模式 普通集群模式(非高可用): 优点: 可以多个服务消费消息,提高吞吐量 缺点: 可能会在rabbitMQ里面产生大量的数据传输,服务器宕机,没法保证可用性 镜像集群模式: 高可用,非分布式 队列的元数据和消息都会存在于多个实例中,每次写消息到 queue的时候,都会自动把消息到多个实例的 queue 里进行消息同步。也就 是每个节点上都有这个
2021-04-20 22:12:37
243
原创 SpringCloud面试题
文章目录SpringCloud面试题什么是微服务微服务之间的通信SpringCloud 和 DubboSpringBoot 与 SpringCloud熔断与服务降级微服务的优缺点eureka和zookeeper的区别微服务技术栈 SpringCloud面试题 什么是微服务 微服务架构是一种架构模式,将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协调,为用户提供最终价值。服务之间采用轻量级通信。每个服务都围绕具体业务进行构建,并能够独立部署到生产环境等。单独的模块只
2021-04-19 21:01:26
137
原创 降级与熔断
降级与熔断 概念 熔断 类似于电路上的保险丝,当服务出现宕机或者连接超时的情况,为了防止整个微服务挂掉 降级 对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。 异同 相同点: 都是为了提高系统的高性能和高可用 用户都能体验到某些模块功能暂时无法使用 不同点: 触发原因不同,熔断一般是下游的
2021-04-17 10:32:35
204
原创 高并发流量应对
文章目录高并发流量应对常用方法限流常用方式计数器滑动窗口漏桶令牌 高并发流量应对 常用方法 缓存 降级 限流 限流常用方式 计数器 在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。 滑动窗口 把固定时间片,进行划分,并且随着时间的流逝,进行移动,这样就巧妙的避开了计数器的临界点问题。也就是说这些固定数量的可以移动的格子,将会进行计数判断阀值,因此格子的数量影响着滑动窗口算法的精度。 漏桶 有一个固定的桶,进水的速率是不确定的,但是出水的速率是恒定的,当水满的时候是会溢出的。(ngi
2021-04-16 21:27:20
156
原创 新生代内存
文章目录新生代内存分代工作流程为什么有survivor为什么有2个survivor 新生代内存 分代工作流程 新生代一般采用复制算法,有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1 老年代一般采用标记整理算法,提高回收效率。 新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。 新生代: 把 Eden + From Survivor 存活的对象放入 To Survivor 区; 清空 Eden 和 From Survivor 分
2021-04-15 21:09:55
357
原创 HTTPS
文章目录HTTPS实现原理传输过程为什么数据传输使用对称加密中间人攻击证书证书校验抓包 HTTPS 实现原理 因为 HTTPS 保证了传输安全,防止传输过程被监听、防止数据被窃取,可以确认网站的真实性。 证书验证阶段使用的是非对称加密,内容传输时是对称加密。 证书验证: 浏览器发起https请求 服务端返回https证书 客户端验证证书是否合法,不合法提示警告 数据传输: 证书验证合法后,在本地生成随机数 通过公钥加密随机数,传输至服务端 服务端通过私钥对随机数进行解密 服务端通过客户端传入的随机数构
2021-04-14 22:35:08
162
原创 StringBuilder
文章目录StringBuilder线程安全性原因 StringBuilder 线程安全性 StringBuilder与String不是线程安全的,StringBuffer是线程安全的。 原因 StringBuilder和StringBuffer的内部实现跟String类一样,都是通过一个char数组存储字符串的,不同的是String类里面的char数组是final修饰的,是不可变的,而StringBuilder和StringBuffer的char数组是可变的。 //存储字符串的具体内容 char[] v
2021-04-13 20:00:27
201
原创 finally
finally finally一定会执行吗 不会 在执行try之前直接return 执行try之前程序报错 try中执行System.exit(0); 执行时机 finally块执行在try的return之前 finally块执行在catch的return之前 finally的返回值 Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返
2021-04-12 20:58:10
100
原创 redis海量数据访问
文章目录redis海量数据访问解决方案 redis海量数据访问 解决方案 keys user_token* 的方式进行查询,redis直接卡死,但线程下顺序执行所有指令,在数据量大的情况下该指令执行的时间较长,而其他指令必须等到该指令执行完才会执行。 SCAN cursor [MATCH pattern] [COUNT count] scan 0 match user_token* count 5 scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数
2021-04-11 09:06:50
322
原创 BigDecimal的精度
文章目录BigDecimal的精度double的精度问题BigDecimal BigDecimal的精度 double的精度问题 System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); console: 0.060000000000000005 0.5800000000000001
2021-04-10 19:17:45
768
原创 数据结构
文章目录数据结构数组链表栈队列哈希表树堆图 数据结构 数组 固定大小的结构,只能容纳相同的数据类型。数组自带索引,可以进行随机访问 遍历 插入 删除 搜索 更新 链表 相互链接的线性顺序项目序列组成。只能顺序访问,无法进行随机访问。 链表中的元素叫做节点 每个节点包括一个密钥和一个指向后继节点next的指针 head指向链表的第一个元素 链表的最后一个元素叫尾 单链表: 只能沿正向遍历链表 双链表: 可以在前进和后退方向上遍历项目 循环链表: 尾的next是头,头的prior是尾 栈 push:
2021-04-09 19:38:57
150
转载 Nginx
文章目录Nginx概念使用原因高性能原因处理请求的方式正向代理与反向代理优缺点使用场景目录结构属性模块跨域问题虚拟主机配置location的作用限流正常限制访问频率突发限制访问频率限制并发连接数限流算法漏桶算法令牌算法动静分离原因nginx的动静分离负载均衡轮询权重 weightip_hashfairurl_hash配置高可用限制ip访问限制浏览器访问rewrite全局变量 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 Nginx
2021-04-08 22:15:46
588
原创 spring的设计模式
文章目录spring的设计模式策略模式工厂模式单例模式代理模式模板方法观察者模式建造者模式 spring的设计模式 策略模式 策略模式: 一个接口下有多个实现类,每个实现类处理的情况各不相同。 注意事项: 使用@Component注解对当前类进行标注,将其声明为Spring容器所管理的一个bean; 声明一个返回boolean值的方法,通过这个方法来控制当前实例是否为处理目标request的实例; 声明一个方法用来判断类型; 声明一个方法用于处理业务逻辑; 传一个对象进行,而不是简简单单的基本类型的变量,
2021-04-07 21:08:07
287
原创 spring的设计模式
文章目录spring的设计模式策略模式工厂模式单例模式代理模式模板方法观察者模式建造者模式 spring的设计模式 策略模式 策略模式: 一个接口下有多个实现类,每个实现类处理的情况各不相同。 注意事项: 使用@Component注解对当前类进行标注,将其声明为Spring容器所管理的一个bean; 声明一个返回boolean值的方法,通过这个方法来控制当前实例是否为处理目标request的实例; 声明一个方法用来判断类型; 声明一个方法用于处理业务逻辑; 传一个对象进行,而不是简简单单的基本类型的变量,
2021-04-06 19:30:34
309
原创 网络面试题
文章目录网络面试题输入url到页面加载发生了什么浏览器与服务器建立tcp连接后是否会在完成http请求后断开?什么情况情况下断开一个tcp连接可以对应几个http请求一个tcp连接中多个http请求可以一起发送吗浏览器对同一host建立tcp连接的数量有没有限制 网络面试题 输入url到页面加载发生了什么 输入地址浏览器 查找域名的 IP 地址 这一步包括 DNS 具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存… 浏览器向 web 服务器发送一个 HTTP 请求 服务器的永久重定向
2021-04-05 08:31:59
296
1
原创 序列化反序列化为何要实现Serializable接口
文章目录序列化反序列化为何要实现Serializable接口概念使用情况为何要指定serialVersionUID的值特性 序列化反序列化为何要实现Serializable接口 概念 序列化:把对象转换成字节序列的过程 反序列化:把字节序列恢复为对象的过程 使用情况 只在本地jvm里面运行程序时,是不需要序列化与反序列化的,当我们需要将内存中的对象持久化到磁盘,数据库中,或者与数据库进行交互时,就需要序列化与反序列化了。 结论:在对内存中的对象进行持久化或网络传输时,需要用到序列化或反序列化。 服务器与
2021-04-04 10:30:26
374
原创 String
**[toc] String public class Demo1 { public static void main(String[] args) { String st1 = "abc";//常量池中已经创建abc了 String st2 = "abc"; System.out.println(st1 == st2);//true System.out.println(st1.equals(st2)); //true } } Java中==是比较运算
2021-04-03 09:11:08
100
原创 面向对象原则
文章目录面向对象原则单一职责原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特原则 面向对象原则 单一职责原则 一个类负责一个事件,,降低类的复杂度,提高类的可读性,降低系统维护的成本,当需求变动时,可以将更改代码所带来的波动性降至最低 开闭原则 系统中的对象,类,模块,函数,方法等,对于拓展应该是开放的,但对于修改应该是关闭的。 当需求发生改变时,我们应该尽可能地去拓展原来的代码,而不是修改原来的代码。 里氏替换原则 子类可以拓展父类的功能,但是不能改变父类原有的功能: 子类可以实现父类的抽象方法,
2021-04-02 09:41:59
72
原创 Redis和MongoDB
文章目录Redis和MongoDB简介比较 Redis和MongoDB 简介 Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 MongoDB 将数据存储为一个文档,数据结构由
2021-04-01 22:26:03
475
原创 sql优化
文章目录sql优化概念锁MVCC事务建表查询 sql优化 概念 锁 数据库解决并发场景的锁: 共享锁(读锁),排他锁(写锁) 乐观锁:适用于数据竞争不激烈的场景,读多写少,通过版本号和时间戳实现 悲观锁:每次操作都会锁定数据。适用于并发量大的场景 表锁:锁定整张表,开销小,但是有严重的锁竞争 行锁:开销大,但是可以支持高并发 MVCC 在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期或者被删除。 在可重复读 (repeat
2021-03-31 21:38:44
102
原创 list遍历和删除
文章目录list遍历和删除Iterator遍历list的方式Iterator 和 ListIterator的区别删除 list遍历和删除 Iterator List<String> list = new ArrayList<>(); Iterator<String> it = list. iterator(); while(it. hasNext()){ String obj = it. next(); System. out. println(obj); }
2021-03-30 21:41:41
162
原创 redis的过期删除策略
文章目录redis的过期删除策略常见删除策略定时删除策略惰性删除策略定期删除策略redis的过期删除策略惰性删除策略定时删除策略rdb对过期键的处理生成rdb文件载入rdb文件aof对过期键的处理写入重写复制功能对过期键的处理 redis的过期删除策略 常见删除策略 定时删除: 在设置键的过期时间时创建一个定时器,定时器会在时间到来时执行对键的删除操作 惰性删除: 放任过期键不管,每次从键空间中获取键时,会检查该键是否过期,过期则删除,没过期则返回 定期删除: 每隔一段时间,对数据库进行检查,删除过期键
2021-03-29 21:36:55
126
原创 Lock
文章目录Locksynchronized与Lock的区别源码分析 Lock synchronized与Lock的区别 类别 synchronized Lock 结构 Java关键字 Java类 释放锁 等待已经获取锁的线程同步完代码后释放锁、线程发生异常,jvm让线程释放锁 在finally中释放锁,否则会造成线程死锁 获取锁 等待其他线程释放锁 可以尝试获取锁,不用一直等待 锁状态 无法判断 可以判断 锁类型 可重入、不可中断、非公平 可重入、可判断、可公平 性能 少量
2021-03-28 10:28:38
134
原创 线程池
文章目录线程池介绍使用原因作用种类及作用newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPool风险死锁资源不足线程泄露使用原则线程数计算cpu密集型程序I/O密集型程序 线程池 介绍 thread pool,是一种线程使用模式,是java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现。 线程池是一种多线程处理形式
2021-03-27 09:57:52
116
原创 volatile
文章目录volatile并发特性使用保证可见性保证原子性防止重排序原理可见性实现有序性实现内存屏障 volatile 并发特性 原子性:一个或者多个操作,要么全部执行,要么全部不执行,不能执行中途被打断 可见性:当多个线程访问同一个变量时,一个线程修改了变量的值,那么其他线程可以立刻看到 有序性:程序按照代码的先后顺序执行 使用 保证可见性 一个线程修改了共享变量值,需要保证其他线程看到,每一个线程都有一个高速缓存去–线程工作内存 保证原子性 共享的long和double建议设置volatile类型,这
2021-03-25 22:38:42
89
原创 线程协作
文章目录线程协作线程状态waitnotify/notifyAllsleepyieldjoin 线程协作 线程状态 Java中的线程状态可以分为以下5种,new,runnable,running,blocked,dead; new: 线程创建完毕,还没有调用start方法; runnable: 调用start()方法后,线程进入就绪状态;此时由线程调度程序(thread scheduler)调度; running: 运行状态,就绪线程取得cpu执行权,执行run()方法; blocked: 阻塞状态,线程并
2021-03-24 21:24:41
80
原创 ConcurrentHashMap
文章目录ConcurrentHashMap如何保证线程安全简介get操作volatile总结 ConcurrentHashMap如何保证线程安全 简介 在jdk1.7中,ConcurrentHashMap用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现。 1.7的锁是基于segment的,包含多个Entry,1.8的锁就是Hash
2021-03-23 21:36:08
183
原创 MySQL行锁和表锁
文章目录MySQL行锁和表锁表锁行锁注意事项间隙锁总结 MySQL行锁和表锁 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,而InnoDB支持行锁和表锁。 MyISAM在执行select时,会自动给所有涉及的表加读锁,在执行update、delete、insert前,会给所有涉及的表加写锁,无需用户操作。 读锁: select math from zje where math>60 lock in share mode; 写锁: s
2021-03-22 21:34:19
219
原创 可重复读(Repeatable read)能防住幻读吗?
文章目录可重复读(Repeatable read)能防住幻读吗?事务隔离级别事务的并发问题概念幻读和不可重复读的区别乐观锁与悲观锁悲观锁乐观锁数据版本MVCC当前读Next-Key锁 可重复读(Repeatable read)能防住幻读吗? 事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) √ √ √ 读已提交(read-committed) × √ √ 可重复读 (repeatable-read) × × √ 串行化 (seria
2021-03-21 19:42:23
2516
原创 索引
文章目录索引索引相关语句创建索引查看索引删除索引key_len的计算适用原则explain分析查询语句select_typetypekeypossible_keysrefrows数值类型代替字符串考虑使用ENUM类型 索引 索引相关语句 创建索引 CREATE INDEX CREATE INDEX indexName ON tableName (columnName(length)); ALTER ALTER TABLE tableName ADD INDEX indexName(columnNa
2021-03-20 09:23:07
389
1
原创 MySQL二三事
文章目录MySQLMyISAM与innodbMyISAMInnoDb适用场景MySQL的索引类型int与char的隐式转换 MySQL MyISAM与innodb MyISAM 不支持事务,但是每次查询都是原子的; 支持表级锁,即每次操作对整个表加锁; 存储表的总行数; 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件; 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb 支持ACID的事务,支持事务的四种隔离级别; 支
2021-03-19 20:04:21
107
原创 Java锁种类和区别
文章目录Java锁种类和区别公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁 Java锁种类和区别 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 公平锁的性能会比非公平锁差很多。 对于ReentrantLock(可重入锁)而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在
2021-03-18 21:28:41
131
原创 Java引用类型原理
文章目录Java引用类型原理引用类型Reference强引用(FinalReference)软引用(SoftReference)弱引用(WeakReference )虚引用(PhantomReference ) Java引用类型原理 引用类型 JVM将引用类型分为以下4中: 强引用(FinalReference) 软引用(SoftReference ) 弱引用(WeakReference ) 虚引用(PhantomReference ) Referenc
2021-03-17 21:03:39
188
原创 BeanFactory和FactoryBean
文章目录BeanFactory和FactoryBean概念区别BeanFactoryApplicationContextBeanFactory获取bean的方式FactoryBean BeanFactory和FactoryBean 概念 BeanFactory是接口,提供了OC容器最基本的形式,给具体的IOC容器的实现提供了规范。 FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式。 我
2021-03-16 20:32:01
91
原创 ClassNotFoundException 和 NoClassDefFoundError
文章目录ClassNotFoundException 和 NoClassDefFoundErrorClassNotFoundExceptionNoClassDefFoundError总结 ClassNotFoundException 和 NoClassDefFoundError ClassNotFoundException ClassNotFoundException是一个运行时异常。从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFound
2021-03-15 22:01:56
437
原创 Mybatis
文章目录Mybatis面试问题#{}和${}的区别是什么Dao接口的工作原理?能否重载?如何分页?分页原理?动态sqlmybatis与Hibernatemybatis优势MyBatis的接口绑定概念实现方式resultType与resultMapMybatis比IBatis的改进点 Mybatis面试问题 #{}和${}的区别是什么 1)#{}是预编译处理,${}是字符串替换。 2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; 3)
2021-03-14 08:31:33
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人