![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础与算法
文章平均质量分 90
fixAllenSun
这个作者很懒,什么都没留下…
展开
-
【redis】redis缓存与数据库的一致性
经过上面的比较,我们发现在出现失败的时候,是无法明确分辨出先删缓存和先更新数据库哪个方式更好,以为它们都存在问题。上述场景出现的问题,应该如何解决呢?都建议采用重试机制解决。一般情况下,删除缓存是比更新缓存更优的方案;先更新数据库是比先删除缓存更优的方案;总的来说【先更新数据库,再删除缓存】就是四个策略中影响最小,效果最优的方案。但是如果需要使用【先删除缓存,再更新数据库】的方案的话,可以使用【延时双删】【读写分离时强制读主库】【重试机制】来解决问题。原创 2023-02-15 22:22:33 · 502 阅读 · 0 评论 -
【Springcloud】Nacos
(1)服务发现机制就是通过一个中间件去记录服务提供者的ip地址,服务名以及心跳等数据(比如用mysql去存储这些信息,所以Nacos要配置持久化),然后服务消费者会去这个中间平台去查询相关信息,然后再去访问对应的地址,这就是服务注册和服务发现。(2)当用户地址发生了变化也没有影响,因为服务提供方修改了用户地址,在中间件中会被更新,当服务消费方去访问中间件时就能及时获取最新的用户地址,就不会出现用户地址发生变化导致服务找不到什么是Nacos(2)下载安装搭建NacosServerNacos下载。原创 2023-02-13 02:32:37 · 3621 阅读 · 0 评论 -
【Docker】部署带mysql和redis的springboot项目
VOLUME指定临时文件目录为tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp。#ADD 文件名 app.jar (我到时打算把jar包和Dockerfile文件放在同一级目录文件)2-配置文件里的port是6379,那么创建容器的时候对应的端口就要也是6379,项目配置文件里也是。(6)上传springboot项目到服务器,防火墙开放端口。(4)服务器安装docker、mysql、redis。(2)修改代码的mysql和redis配置信息。原创 2023-02-07 13:25:09 · 447 阅读 · 0 评论 -
【Docker】中级篇
(3)修改完配置后重启master实例(5)master容器实例内创建数据同步用户(6)新建从服务器容器实例3308(8)修改完配置后重启slave实例(9)在主数据库中查看主从同步状态(11)在从数据库中配置主从复制(12)在从数据库中查看主从同步状态在主库执行以下sql在从库进行查询,查询成功。1-2亿条数据需要缓存,请问如何设计这个存储案例?单机单台100%不可能,肯定是分布式存储,用redis如何落地?既然是分布式,那么一个数据落在哪一台服务器上?能不能保证下原创 2023-02-07 00:22:33 · 305 阅读 · 0 评论 -
详解事务:Mysql事务、Spring事务、分布式事务
事务传播行为是为了解决业务层方法之间互相调用的事务问题,当一个事务方法被另一个事务方法调用时,事务该以何种状态存在?例如新方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行,等等,这些规则就涉及到事务的传播性。原创 2022-12-21 01:37:40 · 980 阅读 · 0 评论 -
【JVM】调优案例
任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出来一个系统运行模型,评估JVM性能和GC频率等等指标。建模步骤:(1)对象创建速度计算业务系统每秒钟创建的对象会占用多大的内存空间,然后计算集群下的每个系统每秒的内存占用空间。(2)设置一个机器配置,估算新生代的空间比较不同新生代大小之下,多久触发一次MinorGC。(3)重估。原创 2022-12-09 20:30:01 · 1998 阅读 · 0 评论 -
多线程——线程同步器CountDownLatch
CountDownLatch的原理和ReentrantLock的原理类似,都是基于AQS实现的。CountDownLatch 用于阻塞当前 1 个或多个线程,其目的是让这些线程等待其它线程的执行完成。可以简单将其理解为一个计数器,当初始化一个 count=n 的 CountDownLatch 对象之后,需要调用该对象的 CountDownLatch#countDown 方法来对计数器进行减值,直到计数器为 0 的时候,等待该计数器的线程才能继续执行。原创 2022-12-08 19:51:33 · 1900 阅读 · 0 评论 -
【多线程】读写锁ReentrantReadWriteLock源码分析
ReentrantLock完全可以解决线程安全问题,但是ReentrantLock是独占锁,某一时间只能有一个线程可以获取锁,其他线程只能等待。现实中有很多“写少读多”的场景,那么我们就希望同一时间只能有一个写线程可以获取写锁,但是同时可以多个读线程可以获取读锁,于是便有了ReentrantReadWriteLock。ReentrantReadWriteLock采用读写分离策略,允许多个线程可以同时获取读锁。原创 2022-11-25 14:59:16 · 562 阅读 · 0 评论 -
【JVM】优化参数+优化工具
JDK为我们提供了监测工具VisualVM,我们直接在 终端或者cmd 中输入 jvisualvm 命令就可以进入有颜色的区域是占用的空间,空白的部分是指剩余的空间。原创 2022-11-09 01:20:20 · 1125 阅读 · 0 评论 -
多线程-- CopyOnWriteArrayList+并发队列+ConcurrenHashMap
从 add 系列方法可以看出,CopyOnWriteArrayList 通过加锁 + 数组拷贝+ volatile 来保证了线程安全,每一个要素都有着其独特的含义:(1)加锁:保证同一时刻数组只能被一个线程操作;(2)数组拷贝:保证数组的内存地址被修改,修改后触发 volatile 的可见性,其它线程可以立马知道数组已经被修改;(3)volatile:值被修改后,其它线程能够立马感知最新值。原创 2022-11-08 01:34:38 · 718 阅读 · 0 评论 -
多线程-- 原子访问和atomic原子操作类实现原理
然后每个Cell里面有一个初始值为0的long型变量,也就相当于一个计数器,当一个线程成功竞争到一个Cell后,就会对Cell里面的计数器值进行修改,最后的最后把每个Cell里面的计数器value值累加再加上base返回,就是最终的结果值。在上面的代码,每个线程是先拿到变量的当前值,因为value是volatile变量,所以拿到的值是从主内存中取出来的最新值,然后再工作内存中对其进行增1操作,而后使用CAS修改变量的值,如果设置失败,则循环继续尝试,直到设置成功。原创 2022-11-08 00:14:32 · 437 阅读 · 0 评论 -
redis业务场景的实现汇总
业务场景的实现汇总(1)AOP+redis锁实现幂等性,防止请求重复(2)年会活动抽奖开奖的优化过程(1)业务逻辑(2)优化设计(3)延伸的知识点(4)redis事务(5)redis双写一致性问题(3)事务失效的案例(1)注解声明式事务的参数(2)嵌套事务的隔离级别(3)@Transactional失效场景(4)同一个类中的方法调用导致事务失效的解决办法(4)结合入职流程说说观察者模式+策略模式+单例模式(1)单例模式的两种形式(2)观察者模式(3)策略模式(5)JVM的一些参数(6)AOP实现全局异常处理原创 2022-04-06 10:13:15 · 1032 阅读 · 0 评论 -
【Spring】spring启动流程+bean生命周期+spring循环依赖解决+spring三级缓存
Spring---spring启动流程+bean生命周期+spring循环依赖解决(1)spring初始化流程(2)启动流程核心代码分析(3)容器刷新流程(4)spring启动流程小总结(5)spring容器bean的生命周期(5)测试结果分析(6)总结(7)spring循环依赖问题和解决方案(1)spring初始化流程【入口流程图:AnnotationConfigApplicationContext】因为是基于 java-config 技术分析源码,所以这里的入口是 AnnotationConfig原创 2022-04-05 18:05:05 · 640 阅读 · 0 评论 -
【ThreadLocal】的使用案例和实现原理
ThreadLocal的使用案例和实现原理(1)ThreadLocal简单介绍(1)为什么会有ThreadLocal(2)未使用ThreadLocal时是什么样(3)使用ThreadLocal存放线程设定的值(4)使用synchronized锁也可以实现上述的效果,但是会降低性能(5)ThreadLocal和synchronized的区别(6)ThreadLocal的好处(2)ThreadLocal的基本使用(1)创建ThreadLocal对象(2)设定ThreadLocal的值set()和获取值get()原创 2022-04-02 00:31:56 · 1901 阅读 · 0 评论 -
【多线程】Lock和ReentrantLock使用和源码分析
多线程---Lock和ReentrantLock使用详情(1)Lock和ReentrantLock介绍(2)Lock锁实现同步效果(3)Lock的trylock方法(4)使用Lock时候的线程交互(5)总结Lock(ReentrantLock)和synchronized的区别(6)ReenTrantLock实现的原理(7)什么情况下使用ReenTrantLock(8)案例一:使用Lock把MyStack改造为线程安全的类并且实现生产者消费者问题(9)案例二:借助tryLock 解决死锁问题(1)Lock和原创 2022-03-24 00:33:58 · 1377 阅读 · 0 评论 -
多线程-- 线程池使用(等待所有任务执行完和关闭线程池)
多线程-- 线程池(1)自定义线程池(2)java自带的线程池(1)自定义线程池(1)为什么使用线程池每一个线程的启动和结束都是比较消耗时间和占用资源的。使用线程池的过程中创建固定数量的线程,不用创建多余新的线程,而是循环使用那些已经存在的线程。(2)自定义线程池设计思路1-准备一个任务容器2-一次性启动10个消费者线程3-刚开始任务容器是空的,所以线程都wait在上面4-直到一个外部线程往这个任务容器中扔了一个“任务”,就会有一个消费者线程被唤醒5-这个消费者线程取出“任务”,并且执行这原创 2022-03-20 13:56:58 · 7502 阅读 · 0 评论 -
多线程-- 多线程交互+生产者消费者案例
多线程-- 多线程交互(1)wait、notify、notifyAll(2)生产者消费者问题(1)wait、notify、notifyAllwait方法和notify方法,并不是Thread线程上的方法,它们是Object上的方法,所有的Object都可以被用来作为同步对象。wait()的意思是: 让占用了这个同步对象的线程,临时释放当前的占用,并且等待。 所以调用wait是有前提条件的,一定是在synchronized块里,否则就会出错。notify() 的意思是,通知一个等待在这个同步对象上的线原创 2022-03-20 12:01:16 · 302 阅读 · 0 评论 -
多线程-- 通过Java中共享变量的内存可见性问题,逐个认识synchronized/volatile/CAS/死锁
多线程-- synchronized同步和死锁问题(1)synchronized同步(2)死锁(1)synchronized同步(1)synchronized同步对象为了避免产生同时加减之类的脏数据,要保证当一个线程在执行操作的时候,其他线程必须等待当前线程结束才能开始,实现线程安全。可以创建任何一种对象,要求线程执行之前必须先占有这个对象,如果当前这个对象已经被其他线程占有了,就必须等待这个对象被释放。这个对象必须是唯一的,使用final修饰。这就实现了在同一时间,数据只能被一个线程修改。1-使原创 2022-03-20 11:23:00 · 535 阅读 · 0 评论 -
【Mysql】数据库设计的那些事
【Mysql】数据库设计的那些事(1)需求分析(1.1)数据库设计简介(1.2)数据库设计的步骤(1.3)需求分析重要性简介(1.4)需求分析举例(1)实例讲解(2)模块分析(3)表之间关系分析(2)逻辑分析(2.1)ER图(2.2)设计范式概要(2.3)第一范式(2.4)第二范式(2.5)第三范式(2.6)BC范式(3)物理设计(2.1)数据库物理设计要做什么(2.2)选择哪种数据库(2.3)mysql常用存储引擎(2.4)数据库表和字段的命名规则(2.5)数据库字段类型选择原则(2.6)数据库如何具体选原创 2020-05-26 15:27:21 · 337 阅读 · 0 评论 -
【Mysql优化安全】防止sql注入
【Mysql安全】防止sql注入(1)什么是sql注入(2)寻找sql注入的方法(3)mybatis是如何做到防止sql注入的(3.1)sql对比(3.2)简单分析(3.3)底层实现原理(3.4)总结#{}和${}的区别(3.5)总结(3.6)如果手工处理“${xxx}”(3)常见的sql注入问题:数据库查询参数的类型转换处理(4)防范sql注入的思路(5)放置sql注入的方法(1)什么是sql注入(1)概念“SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让原创 2020-05-20 00:19:23 · 6127 阅读 · 0 评论 -
【Mysql优化01】优化分析-7种join和索引命令
【Mysql优化】优化分析-7种join和索引简介(1)索引优化分析(1)sql性能下降的原因(执行时间长、等待时间长)(2)常见通用的join查询(1)sql执行顺序(2)join图(七种)(3)建表sql(4)7种join(使用上面新建的表进行sql编写)(3)索引简介(1)索引是什么(2)索引的优势(3)索引的劣势(4)mysql索引结构(结构另外一篇博客进行总结)(5)基本语法(6)哪些情况需要创建索引(7)哪些情况不要创建索引(1)索引优化分析(1)sql性能下降的原因(执行时间长、等待时间长原创 2020-05-19 11:42:34 · 240 阅读 · 0 评论 -
【Mysql优化04】查询索引优化实例
【Mysql优化】查询索引优化实例(4)查询优化(2)单表查询索引(1)建表sql(2)案例(3)关联(两表)查询优化(1)建表sql(2)案例(不知道左边还是右边,那就都试试再比较)(3)建议(4)子查询优化(1)用in还是exists(2)实验(3)结论(5)order by关键字优化(1)order by子句,尽量使用index方式排序,避免使用FileSort方式排序(6)分页查询的优化(limit)(7)group by关键字优化(8)去重优化(4)查询优化(2)单表查询索引(1)建表sql原创 2020-05-19 10:56:27 · 267 阅读 · 0 评论 -
【Mysql优化02】避免索引失效
【Mysql优化】避免索引失效(1)使用索引(1)建表sql(索引失效测试)(2)索引失效的案例(1)全值匹配我最爱(2)大头大哥不能死,中间兄弟不能断:最佳左前缀原则(3)索引列上不计算:不再索引列上做任何操作(计算、函数、自动或者手动的类型转换),会导致索引失效而转向全表扫描(4)范围之后全失效:存储引擎不能使用索引中范围条件右边的列(5)尽量使用覆盖索引(值访问索引的查询(索引列和查询列一致))。减少select *(6)mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫原创 2020-05-19 10:54:37 · 2991 阅读 · 0 评论 -
【Mysql优化03】性能分析explain
【Mysql优化】性能分析explain(4)性能分析(1)mysql常见瓶颈(2)Explain(4)性能分析(1)mysql常见瓶颈(1)CPU:sql中对大量数据进行比较、关联、排序、分组。最大的压力在于比较(2)IO:实例内存满足不了缓存数据或者排序等需要,导致产生大量物理IO。查询执行效率低,扫描过多数据行(3)锁:不适宜的锁的设置,导致线程阻塞,性能下降。死锁就是线程之间交叉调用资源,导致死锁,程序卡住(4)服务器硬件的性能瓶颈:top,free,iostat和vmstat来查看系统原创 2020-05-19 10:51:05 · 166 阅读 · 0 评论 -
【Mysql优化05】查询截取分析
【Mysql优化】查询截取分析(1)慢查询日志(1.1)慢查询是什么(1.2)慢查询怎么用(1.2.1)说明(1.2.2)查看是否开启和如何开启(1.2.3)什么样的sql会被慢查询日志记录(1.2.4)实际案例分析(1.2.5)配置(1.3)日志分析工具mysqldumpslow(1.3.1)如何打开并查看(1.3.2)工作常用参考(2)批量数据脚本(往表里插入1000w数据)(2.1)建表(2.2)设置参数log_bin_trust_function_creators(2.3)创建函数,保证每条数据都不原创 2020-05-19 00:11:26 · 202 阅读 · 0 评论 -
【BigDecimal】货币金额和浮点数处理注意事项
【货币金额和浮点数处理注意事项】(1)【强制】任何货币金额,均以最小货币单位且整型类型来进行存储。(2)【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals来判断。说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。反例:float a = 1...原创 2020-04-29 13:01:36 · 2306 阅读 · 1 评论 -
【Mysql】浅谈表结构设计
【Mysql】浅谈表结构设计(1)主键选择(2)创建时间&修改时间(3)四个范式(4)添加必要的冗余字段(5)合理的表关联数据表设计规则总结(6)字段数据类型设计规范(1)主键选择主键要满足以下几个条件:唯一性(是表的唯一标识,用来联立其他的表)非空性有序性(提高查询效率)可读性可扩展性注意点:建议使8字节无符号的bigint(20)作为主键的数据类型主外键的数据...原创 2020-04-17 00:03:51 · 981 阅读 · 0 评论 -
【Mysql】一条sql语句再mysql中如何执行的
【Mysql】一条sql语句再mysql中如何执行的(1)Mysql基础架构分析(1.1)Mysql基本架构概述(1.2)Server层基本组件1)连接器2)查询缓存(Mysql8.0版本后移除)3)分析器4)优化器5)执行器(2)语句分析(2.1)查询语句(2.2)更新语句(3)总结(1)Mysql基础架构分析(1.1)Mysql基本架构概述(1)基本组件连接器:身份认证和权限相关(登...原创 2020-04-09 22:41:20 · 165 阅读 · 0 评论 -
【多线程】认识线程池
【多线程】认识线程池(1)为什么使用线程池(线程池的优点)(2)认识Executor框架(2.1)基本介绍Executor(2.2)Executor框架结构(主要由三大部分组成)(2.3)Executor框架的使用流程和示意图(2.4)常见的线程池实现方式(3)ThreadPoolExecutor 类(重要)(3.1)ThreadPoolExecutor 类分析(4)ThreadPoolExecu...原创 2020-04-09 21:05:29 · 307 阅读 · 0 评论 -
【基础】浅谈面向对象
【基础】浅谈面向对象(1)面向对象和面向过程的区别(2)认识JVM、JDK、JRE(2.1)JVM虚拟机(2.2)JDK(2.3)JRE(3)认识面向对象三大特性:封装、继承、多态(3.1)封装(3.2)继承(3.3)多态(1)面向对象和面向过程的区别面向过程:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开...原创 2020-04-08 14:00:34 · 122 阅读 · 0 评论 -
【JVM】详细分析JVM内存区域
【JVM】详细分析JVM内存区域(1)准备好Math.java、Math.class和JVM结构图(1.1)认清*.java、*.class和JVM之间的关系(1.2)编写一个简单的Math.java文件(1.3)对Math.java文件进行反编译,得到Math.class文件(1.4)准备一个JVM运行时数据区域图(2)从Math.class开始分析流程(2.1)Math.class进入JVM(...原创 2020-04-04 00:41:25 · 306 阅读 · 0 评论 -
【Mysql】(1)简单认识Mysql
【Mysql】(1)简单认识Mysql(1)MySQL基本介绍(2)存储引擎(2.1)MyISAM和InnoDB区别(2.1.1)两者对比(2.1.2)认识一下MVCC(多版本并发控制:Multiversion Concurrency Control)(1)MySQL基本介绍MySQL 是一种关系型数据库,默认端口号是3306(2)存储引擎(2.1)MyISAM和InnoDB区别在5.5...原创 2020-04-01 21:39:31 · 180 阅读 · 0 评论 -
【Mysql】(3)事务+锁
【Mysql】(3)事务+锁(1)什么是事务?(2)事务的四大特性ACID(3)并发事务带来的数据问题(4)事务隔离级别(MySQL的默认隔离级别)(5)锁机制与InnoDB锁算法(5.1)MyISAM和InnoDB存储引擎使用的锁:(5.2)表级锁和行级锁对比:(5.3)InnoDB存储引擎的锁的算法有三种:(6)锁(6.1)锁分类(6.1.1)按照锁的粒度分类(6.1.2)按照是否可写分类(6...原创 2020-04-01 21:14:46 · 226 阅读 · 0 评论 -
【Mysql】(2)索引
【Mysql】(2)索引(1)简单认识一下索引(1.1)索引是啥?为什么要用索引(索引的优点复习)?(1.2)能不能对表中的每一列都创建一个索引?(索引的缺点分析)(1.3)正确使用索引的姿势(什么条件下使用索引、注意事项)(2)Mysql索引的两种主要的数据结构(2.1)哈希索引(2.2)B树索引(B+树索引)(2.2.1)MyISAM存储引擎实现B+树索引方式(2.2.2)InnoDB存储引擎...原创 2020-04-01 20:37:40 · 289 阅读 · 0 评论 -
【算法】字符串
【算法】字符串(1)暴力匹配法检索子字符串(2)KMP算法检索子字符串部分匹配表和部分匹配值:思路分析:代码实现(部分匹配值那一块没看懂)算法往往是记住中间关键的几个节点,而不是记住全部(1)暴力匹配法检索子字符串思路分析:1-把父字符串和子字符串用toCharArray转换成两个字符数组,方便字符对比2-从下标为0的位置开始字符对比,如果字符能匹配上,则两个数组的下标都往后移一位if...原创 2020-03-31 23:37:32 · 121 阅读 · 0 评论 -
【Java基础】浅谈泛型
【Java基础】浅谈泛型(1)基本介绍(2)泛型的通配符(3)泛型的应用(3.1)泛型接口(集合框架用的最多)(3.2)泛型方法(3.3)泛型数组(1)基本介绍泛型的定义:在对象建立的时候不指定类中属性的具体类型,而由外部在声明和实例化对象的时候再指定具体的类型。泛型可以解决数据类型的安全性问题,合理的使用泛型需要结合类集框架和反射机制。例如://可以设置一个泛型T,也可以设置多个泛型T...原创 2020-03-31 21:58:54 · 155 阅读 · 0 评论 -
【反射】(02)反射之动态代理
【反射】(02)反射之动态代理(1)啥是动态代理?(2)动态代理的逻辑简要分析(2.1)用到的类和接口(1)InvocationHandler接口(2)Proxy类(3)补充:类加载器(3)动态代理的案例分析(3.1)第一步:定义一个InvocationHandler 接口的子类,以完成代理的具体操作(固定写法)(3.2)第二步:定义被代理的接口(3.3)第三步:定义被代理接口的子类(3.4)第四...原创 2020-03-29 15:34:35 · 113 阅读 · 0 评论 -
Java学习笔记---static关键字
Java学习笔记---static关键字static关键字基本介绍static声明属性static属性的注意事项Java中常用的内存区域(主要4块)static声明方法static方法的注意事项static声明内部类static内部类的注意事项static的相关应用static关键字基本介绍创建实例化一个类对象时,JVM会分别开辟一个栈内存和一个堆内存。在堆内存里保存对象中的属性,每个对象都...原创 2020-03-26 23:12:28 · 191 阅读 · 0 评论 -
SpringBoot(2)---读取配置文件
SpringBoot(2)---读取配置文件(1)通过 @value 读取比较简单的配置信息(不推荐使用)(2)通过@ConfigurationProperties读取并与 bean 绑定(读取到数据直接注入实体类的字段中)通过@ConfigurationProperties读取并校验(不仅读取数据注入字段,还会对字段进行校验)介绍三种方式读取配置文件application.yml:1-准备一...原创 2020-03-26 22:04:17 · 194 阅读 · 0 评论 -
Java基础学习---I/O
Java基础学习---I/O(1)File-操作文件的类基本介绍常用的方法代码示例(2)RandomAccessFile类基本介绍常用的方法代码示例(3)字节流与字符流基本操作基本介绍(4)转换流(5)内存操作流(6)管道流(7)打印流(8)System类对IO的支持(9)BufferedReader类(10)Scanner类(11)数据操作流(12)合并流(13)压缩流(14)回退流(15)字符...原创 2020-03-26 21:22:50 · 138 阅读 · 0 评论