自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_36566262的博客

日月照古今

  • 博客(49)
  • 问答 (4)
  • 收藏
  • 关注

原创 Redis实战-使用Redis构建应用程序组件

目录1 自动补全1.1 自动补全最近联系人1.1.1 需求和数据结构分析1.1.2 Java代码示例1 自动补全用户不进行搜索的情况下,根据用户输入的前缀,显示所有可能的结果。1.1 自动补全最近联系人这里只存储用户最近联系的100个用户。1.1.1 需求和数据结构分析需求分析:就是根据用户前缀返回用户可能的联系人。数据结构分析:这里使用列表存储用户最近的联系人。1.1.2 Java代码示例这里以Java代码为演示。下面是添加用户的代码demo1-1:/** * 添加用户联系人

2022-05-26 12:11:14 741

原创 Redis实战-数据安全和性能保障

目录1 持久化选项1.1 快照持久化1.2 AOF持久化2 复制2.1 复制选项配置2.2 Redis复制启动过程2.3 主从链3 处理系统故障3.1 验证快照和AOF文件3.2 更换故障主服务器4 Redis事务4.1 事务演示例子:游戏物品出售4.2 Java代码演示4.5 非事务性流水线参考文献1 持久化选项redis提供了两种方式进行持久化:1 快照:某一时刻将所有数据写入硬盘。2 只追加文件:在执行写命令时,将被执行的命令复制到硬盘。与持久化相关的选项。1.1 快照持久化根据r

2022-05-22 18:24:26 952

原创 Redis实战-Redis命令

目录1 字符串2 列表3 集合4 散列5 有序集合1 字符串由字节组成的序列,可以存储字符串、整数和浮点数。表 1 redis字符串的自增和自减命令命令用例和描述INCRINCR key-name,将键的存储值加1DECRDECR key-name,将键的存储值减一DECRBYDECRBY key-name amount,将键存储值减少amountINCRBYINCRBY key-name amount,将键存储值增加amountJava示例d

2022-05-21 11:29:22 1278

原创 Redis实战-初识Redis

目录1 redis简介2 redis数据结构简介2.1 redis中的字符串2.2 redis的列表2.3 redis的集合2.4 redis的散列2.5 redis的有序集合3 redis示例-文章投票3.1 数据结构划分3.2 搭建java环境3.3 编写测试demo参考文献1 redis简介redis是一种非关系型数据库。使用内存存储。具有:字符串、列表、集合、散列表和有序集合五种存储类型。附加特性:支持持久化。实现了主从复制:执行复制的从服务器连上主服务器,接受主服务器发送的整个数

2022-05-19 18:09:45 639

原创 Java测试-mockito学习

目录1 Mockito2 各种模拟使用2.1 mock接口并验证2.2 mock具体类,并进行stub2.3 参数匹配器-Argument matchers2.4 验证实际调用的次数2.5 stub 空返回值方法2.6 按顺序验证行为2.7 冗余的mock对象验证2.8 迭代器风格的stub2.9 支持回调的stub2. 10 spy真实对象2-11 部分真实mock2-12 重置mock2-13 @Mock和@InjectMocks2-14 行为驱动开发模式BDD参考文献1 Mockitomockit

2022-05-16 17:52:36 1876

原创 Junit5测试框架学习总结

目录1 Junit52 各种测试使用2.1 注释2.2 测试类和测试方法2.3 断言2.4 假言测试2.5 禁用测试2.6 测试顺序2.7 重复测试2.8 参数化类型测试2.9 动态测试2.10 超时测试参考文献1 Junit5Junit5由下面几个子模块组成:JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit VintageJunit5需要在Java8或者更高版本运行。一般springboot项目已经包含了Junit的依赖。2 各种测试使用待测

2022-05-15 18:44:02 476

原创 Mysql常见注意点总结

目录1 数据库基础2 检索数据3 过滤数据4 创建计算字段5 联结表6 全文本搜索7 插入、更新和删除数据8 使用视图参考文献1 数据库基础每个表都应该定义主键,不允许为NULL。2 检索数据SQL不区分大小写,但是建议SQL关键词大写,其它如:库、表和列名小写。检索多个列,注意最后一个列不要加逗号。除非使用表中的每一列数据,否则不要使用SELECT 。在对多个列进行降序排序时,必须每个列都要指定DESC。3 过滤数据数据也可以在应用层过滤,但是不建议,这样将导致性能问题喝传输多

2022-05-14 17:07:26 422

原创 JAVA并发编程实战-原子变量与非阻塞同步机制

目录思维导图1 锁的劣势2 硬件对并发的支持2.1 比较并交换2.2 非阻塞计数器3 原子变量类3.1 原子变量是更佳的volatile4 非阻塞算法4.1 非阻塞栈4.2 非阻塞链表4.3 ABA问题参考文献思维导图1 锁的劣势使用一致的加锁协议保障对共享状态的安全访问。当锁的竞争频率非常高,调度和真正用于工作的开销将会非常客观。加锁是线程安全的,但是也有缺点:加锁导致其它线程不能做任何事情或者被挂起,性能会由于上下文切换和调度受到损失。性能风险-优先级倒置,一个低优先级线程加锁成功

2022-05-11 11:14:20 115

原创 JAVA并发编程实战-构建自定义的同步工具

目录思维导图1 管理状态依赖性1.1 示例:将先验条件失败传给调用者1.2 轮询+休眠实现阻塞1.3 让条件队列来解决这一切2 使用条件队列2.1 条件谓词2.2 过早的唤醒2.3 丢失的信号2.4 通知2.5 示例:阀门类2.6 子类的安全问题3 显式的Condition对象4 剖析Synchronizer5 AbstractQueuedSynchronizer5.1 一个简单的闭锁6 JUC中实现AQS的同步器6.1 ReentrantLock6.2 Semaphore和CountDownLatch参考

2022-05-10 11:55:56 506

原创 JAVA并发编程实战-显式锁

目录思维导图1 Lock和ReentrantLock1.1 可轮询的和可定时的锁1.2 可中断的锁获取操作2 对性能的考量3 公平性4 在内部锁synchronized和ReentrantLock直接进行选择5 读写锁总结参考文献思维导图1 Lock和ReentrantLockLock定义了抽象的锁操作,如下图Lock提供了无条件的、可中断的、可轮询的和定时的获取锁操作。Lock的实现与内部锁具有相同的内存可见性语义。ReentrantLock实现了Lock接口,提供了与synchron

2022-05-08 21:05:20 548

原创 JAVA并发编程实战-性能和可伸缩性

目录思维导图1 性能的思考1.1 性能“遭遇”可伸缩性1.2 对性能的权衡进行评估2 Amdahl定律2.1 示例:框架中隐藏的串行化3 线程引入的开销3.1 切换上下文3.2 内存同步3.3 阻塞4 减少锁的竞争4.1 缩小锁的范围4.2 减小锁的粒度4.3 分离锁4.4 避免热点域总结思维导图1 性能的思考使用线程最主要原因是增加性能。改进性能意味着更少的资源做更多的事。1.1 性能“遭遇”可伸缩性可伸缩性:当增加计算资源(cpu、内存、贷款等),吞吐量和生产力更高相应的改善。性

2022-05-07 23:24:56 360

原创 JAVA并发编程实战-避免活跃度危险

目录思维导图1 死锁1.1 锁顺序死锁1.2 动态的锁顺序死锁1.3 协作对象间的死锁1.4 开放调用1.5 资源死锁2 避免和诊断死锁2.1 尝试定时的锁2.2 通过线程转储分析死锁3 其它的活跃度危险3.1 饥饿3.2 弱响应性3.3 活锁参考文献思维导图1 死锁比如经典的哲学家进餐问题,很好的阐释了死锁。如果每个人都拿起左边的筷子,等待右侧筷子可用,同时不放弃手中的筷子,将导致死锁产生。当一个线程永远占有有一个锁,而其它线程尝试去占有这个锁,那么它们将永远被阻塞。1.1 锁顺序死锁

2022-05-05 21:15:06 591

原创 JAVA并发编程实战-应用线程池

目录思维导图1 任务和任务策略间的隐形耦合1.1 线程饥饿死锁1.2 耗时操作2 定制线程池的大小3 配置ThreadPoolExecutor3.1 线程的创建和销毁3.2 管理队列任务3.3 饱和策略3.4 线程工厂4 扩展ThreadPoolExecutor4.1 示例:给线程池添加统计统计信息5 并行递归算法5.1 谜底框架5.1.1 顺序解决方案5.1.2 并发解决方案5.1.3 并发方案改进参考文献思维导图1 任务和任务策略间的隐形耦合有些任务需要明确指定一个执行策略如:依赖性任务:

2022-05-04 18:10:25 1097

原创 JAVA并发编程实战-取消和关闭

目录前言1 任务取消1.1 中断前言有时候我们希望任务或者线程自然结束前就停止它们,可能用户点击取消或者应用程序需要关闭。Java中提供了中断使一个线程可以要求另一个线程停止当前工作。1 任务取消可取消的活动:当外部代码能够在活动自然完成前,将其状态改为完成状态。可能有多种原因导致活动关闭如:用户请求的取消。用户点击取消按钮。限时活动。设置超时器,如果超出停止活动。应用程序事件,任务分解搜索,一个任务搜索到,停止其它任务。错误。当多个任务保存页面,一个遇到磁盘满,其它取消。关闭。当

2022-05-03 17:05:33 1247

原创 JAVA并发编程实战-任务执行

目录1 在线程中执行任务1.1 顺序执行任务1.2 显式的为任务创建线程1.3 无限制创建线程的缺点2 Executor框架2.1 使用Executor实现WebServer2.2 执行策略2.3 线程池2.3.1 定长线程池-newFixedThreadPool2.3.2 可缓存线程池-newCachedThreadPool2.3.3 单线程化的newSingleThreadExecutor2.3.4 定时的线程池-newScheduledThreadPool2.4 Executor生命周期2.5 延迟的

2022-05-01 21:42:10 1738

原创 JAVA并发编程实战——构建块

目录1 同步容器1.1 同步容器的问题1.2 迭代器和并发修改异常(ConcurrentModificationException)2 并发容器2. 1 ConcurrentHashMap2.2 并发容器附加的原子操作2.3 CopyOnWriteArrayList3 阻塞队列和生产者-消费者模型4 阻塞和可中断方法5 Synchronizer同步器5.1 闭锁5.2 FutureTask5.3 信号量Semaphore5.4 关卡CyclicBarrier参考文献1 同步容器如java的Vector

2022-04-30 22:36:21 872

原创 JAVA并发编程实战——共享对象

目录1. 可见性1. 1 过期数据1.2 锁和可见性1.3 Volatile变量2. 发布和逸出2.1 安全构建实践3. 线程封闭3.1 栈限制3.2 ThreadLocal4. 不可变性5 安全发布的模式参考文献1. 可见性内存可见性:当一个线程修改使用的共享对象,其它线程能够看到改变以下面demo为例:public class NoVisibility { private static boolean ready; private static int number;

2022-04-29 15:50:41 1179 1

原创 JAVA并发编程实战-线程安全学习记录

目录1 线程安全性2 原子性2.1 竞争条件3 锁3.1 内部锁3.2 重进入4 用锁保护状态1 线程安全性当多个线程访问一个类,不用考虑这个线程所处环境,并且不需要调用方额外的代码做出协调,这个类仍然可以保持正确性,则称这个类为线程安全。线程安全类如java中Vector许多涉及改变状态的方法都使用了内置锁synchronized如下:Vector作为线程安全类,封装了必要的同步,因此外部使用的客户不需要自己提供额外操作。无状态对象是永远线程安全的如图所示的代码,由于不包含状态也不

2022-04-26 11:05:33 220

原创 Java类文件结构和字节码分析学习

目录前言1. Class类文件结构前言Java源程序被编译为class文件后,加载进虚拟机中,那么虚拟机是如何解析和分析class内容的呢?这里我们将以一个具体的java程序编译后的字节码流进行分析,学习Class类文件的结构。1. Class类文件结构...

2022-04-24 22:18:13 250

原创 设计模式——Visitor(访问者)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Java实际应用举例——以ASM技术为例4.1 被访问对象——ClassReader4.2 Visitor——ClassVisitor4.3 具体visitor——ClassParser4.4 测试demo——AsmReadClassInfo5 总结参考文献前言当我们需要对一个对象中所有元素进行代码检查或者赋值检查等操作,或者想添加一些新的功能,但是当该对象对于产品已经很成熟,可能直接修改对象的类会产生新的缺陷。这时访问者可以帮助我们增添

2022-04-23 18:07:01 3327

原创 设计模式——Template Method(模板方法)

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring应用举例4.1 AbstractClass——AbstractApplicationContext4.2 ConcreteClass——GenericWebApplicationContext5 总结参考文献前言当需要定义一个算法的框架,但是有些步骤,可能需要随着情景发生变化时,如果借助子类可能来封装可能产生大量子类重复代码。而模板方法可以帮助我们抽象公共逻辑,子类实现特定逻辑。1 定义Template Method(模板

2022-04-22 16:03:04 725

原创 设计模式——Strategy(策略)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 实际应用举例4.1 Context——List列表和StuContext4.2 具体策略:ConcreteStrategyA和ConcreteStrategyB4.3 测试demo5 总结参考文献前言当我们对一个对象的某个操作,比如文本分析或者对象排序有多种算法,但是如果硬编码进它们的类中,将导致出现后续扩展困难,复杂度较高等。策略模式提出了一种方法解决这种情况。1 定义Strategy(策略)模式:定义一系列算法,并把它们独立封装到

2022-04-22 11:44:48 1273

原创 设计模式——State(状态)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 应用举例4.1 State——TcpState4.2 Context——TcpConnection4.3 ConcreteState——ListeningTcpState、EstablishedTcpState和CloseTcpState4.3.1 ListeningTcpState4.3.2 EstablishedTcpState4.3.3 CloseTcpState4.4 测试5 总结参考文献前言考虑一个对象对于不同阶段,不同状态有不

2022-04-21 22:29:56 806

原创 设计模式——Observer(观察者)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 应用举例4.1 Subject——Observable4.2 ConcreteSubject——ClockSubject4.3 Observer——Observer4.4 ConcreteObserver——ObserverOne、ObserverTwo4.5 测试程序——Client5 总结参考文献前言当一个对象与其它对象紧密关联,如果直接引用的话可能导致紧密耦合,如何描述这种一对多的关联关系?本文的观察者模式是一种思路。1 定义O

2022-04-21 17:10:09 2301 1

原创 设计模式——Memento(备忘录)模式

目录前言1 定义2 适用情况3 结构3.1 结构图3.2 参与者4 应用举例4.1 Memento和MementoCare4.2 Orginator——UrlEntity4.3 Client——ClientTest5 总结参考文献前言有时有必要记录一个对象的内部状态,以方便用户从错误中恢复过来。比如访问浏览器要求实现后退和撤销功能等。1 定义Memento(备忘录)模式:在不破坏封装性前提下,获取对象内部状态并外部保存,以方便日后恢复对象状态。2 适用情况当需要保存一个对象的内部状态,以方便后

2022-04-20 21:20:51 1540

原创 设计模式——Mediator(中介者)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 应用举例——以房产中介为例4.1 Mediator——HouseMediator4.2 具体Mediator——BeijingHouseMediato4.3 Colleague4.4 具体Colleague——ConcreteColleagueOne、ConcreteColleagueTwo5 总结参考文献前言将一个系统分割为多个对象可以增强复用性,但是对象之间相互连接又会降低复用性。如果使用一个中介对象来改变这总交互关系将增强系统健壮性

2022-04-20 17:06:29 1032

原创 设计模式——Iterator(迭代器)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Java应用举例4.1 Iterator4.2 Collection4.3 AbstractList5 总结参考文献前言一个聚合对象,如容器列表,应该提供一种方法让别人可以访问自己的元素,而又不暴露自己的内部结果。同时可能有不同的需求,需要提供不同的遍历过程。1 定义Iterator(迭代器)模式:提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部结构。2 适用性访问一个聚合对象的内部而不暴露内部结构。支持对

2022-04-20 12:14:12 440

原创 设计模式——Interpreter解释器模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 应用举例4.1 定义Context4.2 Interpreter定义4.3 具体解释器ValueInterpreter、AndInterpreter和OrInterpreter4.3.1 ValueInterpreter4.3.2 AndInterpreter4.3.3 OrInterpreter4.4 Client5 总结参考文献前言当一个特定类型的问题发生的概率很高,那么可以将该问题解释为简单的表达式,这样我们定义一个解释器,处理这一

2022-04-20 10:40:41 681

原创 设计模式——Command命令模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 Command——JdbcTemplate4.2 Receiver——StatementCallback5 总结参考文献前言当我们需要对各种请求进行参数化,模板化,但是不清楚被请求的执行者或操作者的信息时,可以使用Command命令模式。1 定义Command命令模式:将请求封装为对象,从而使你可以使用不同的请求对客户进行参数化,对请求进行排队或者记录请求日志,以及支持可以撤销的操作。2 适用性抽

2022-04-19 18:30:26 610

原创 设计模式——Chain of Responsibility职责链模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 职责链——MockFilterChain4.2 Handler——Filter4.3 ConcreteHandler——HttpFilter5 总结参考文献前言当有多个对象都有机会处理一个请求时,如果将每个对象都嵌在请求对象中,可能会产生加大的耦合,比如多个if else处理情况。职责链的模式便可以解耦请求对象和处理对象。1 定义Chain of Responsibility模式:当多个对象都有机会处理

2022-04-19 16:59:51 204

原创 设计模式——Proxy(代理)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 Proxy——JdkDynamicAopProxy5 总结参考文献前言当我们需要控制一个对象的访问,或者需要对一类方法做一些增强时,代理模式便可以很好的实现我们的需求。1 定义Proxy模式:为对象提供一种代理,以实现对这个对象访问的控制。2 适用性当需要控制对象的访问。当需要对对象的功能做一些增强。当我们需要做一些切面功能如:日志、登录拦截等。3 结构3.1 结构图3.2 参与者

2022-04-19 11:54:41 356

原创 设计模式——Flyweight(享元)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例5 总结参考文献前言当我们需要使用大量细粒度对象时,如果每个都需要创建实例,可能会浪费大量空间。如果这些对象有共同的内部状态,我们可以考虑使用Flyweight模式。1 定义Flyweight:运用共享技术支持大量细粒度的对象。2 适用性程序使用了大量的对象。使用大量对象造成了存储开销。对象的大多数状态都可以变为外部状态。如果不考虑对象的外部状态,可以使用共享对象代替大量重复的实例对象。应用程序不

2022-04-19 10:48:35 1344

原创 设计模式——Facade(外观)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 Client——我们定义的启动类4.2 Facade——SpringApplication.run()方法4.3 subSystem——ResourceLoader5 总结参考文献前言我们通常会遇到调用一个复杂子系统,而当这个子系统进行更新或其它改进时,将不可避免的影响我们的代码。而Facade就是一种可以帮助我们对复杂子系统进行解耦的一种模式。1 定义Facade模式:为子系统中的一组接口提供一个一

2022-04-18 10:19:54 6913

原创 设计模式——Decorator(装饰)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 Component——InputStream4.2 Decorator——FilterInputStream4.3 ConcreteDecorator——BufferedInputStream5 总结参考文献前言当需要对对象增加一些职责,不需要改变对象的内核构成时,可以使用装饰器模式1 定义装饰器:动态的给对象增加一些职责,比通过子类增加功能更加灵活。2 适用性不影响其他对象情况下,动态、透明的给

2022-04-17 20:30:30 348

原创 设计模式——Builder(生成器)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例4.1 Director——AnnotationAwareAspectJAutoProxyCreator4.2ConcreteBuilder——BeanFactoryAspectJAdvisorsBuilder(工具类)5 总结参考文献前言当我们需要构造一个复杂对象时,可以将对象表示和具体的构建过程进行分离,可以使用Builder模式。1 定义Builder模式:将复杂对象的构建和它的表示分离,从而使得同样的构

2022-04-17 12:36:21 540

原创 设计模式——Bridge(桥接模式)

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Java实际应用举例4.1 Abstraction——DriverManager4.2 Implementer——java.sql.Driver4.3 ConcreteImplementer——com.mysql.cj.jdbc.Driver5 总结参考文献前言如果实现一个跨平台的软件,那么如何处理与平台有关的部分和与平台无关部分,也就是抽象和实现的关系,这里就涉及到Bridge桥接模式了。1 定义将抽象部分和实现部分分离,使他们可以

2022-04-17 12:02:40 666

原创 设计模式——Adapter(适配器、wrapper包装器)

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例前言当客户使用的接口和希望使用的接口不一致时,我们应该如何处理使得原本不兼容的接口可以进行协调工作?适配器就是用于解决这种需求的。1 定义将一个类2 适用性3 结构3.1 结构图3.2 参与者4 Spring实际应用举例...

2022-04-17 11:23:03 755

原创 设计模式-Composite模式

目录前言定义适用性结构结构图参与者Spring实际应用举例前言定义适用性结构结构图参与者Spring实际应用举例

2022-04-17 10:10:41 841

原创 Java学习:SPI机制

目录1 是什么1.1 服务1.2 服务提供者接口1.3 服务提供商1.4 服务加载器2 源码学习2.1 ServiceLoader.load(Driver.class)处理逻辑2.2 加载实现类3 扩展实例3.1 接口模块3.2 实现类模块3.3 打包和安装到本地仓库3.4 测试模块参考文献1 是什么Java Service Provider Interface(Java spi,Java服务提供程序接口),是在Java 6引入的用于发现和加载指定接口匹配实现类的功能,简称服务程序提供接口。主要好处:

2022-04-07 22:12:00 517

原创 Spring源码学习:BeanPostProcessor注册和执行时机

目录前言1 BeanPostProcessors作用2 源码分析2.1 BeanPostProcessors注册时机2.1.1 注册beanPostProcessorChecker2.1.2 各种优先级BeanPostProcessor进行排序注册2.1.3 重新注册ApplicationListenerDetector2.2 BeanPostProcessors执行时机3 扩展示例总结前言后置处理器是Spring框架提供的对外扩展点,通过实现对应接口,可以对bean进行各种操作(bean定义bd进行修

2022-04-05 16:39:49 1860 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除