单例模式完全版
应用资源管理器 属性管理器 多例是为了存储数据的,单例是为了共享可以减少资源消耗 饿汉式–JVM保证线程安全(简单推荐)因为JVM可以保证每个类只加载一次,所以设置为static就可以保证对象只会被new一次,static是在加载链接初始化中的初始化就会赋值的,只执行一次。 多线程都没关系 但是用到与否,类加载就已经实例化 12345678910111213141516171819202122232425262728package com.deltaqin.designPattern.d01_singleton;/** * @author deltaqin * @date 2021/3/26 1:39 下午 */public class Single01 { private static final Single01 INSTANCE = new Single01(); public static Single01 getInstance() { return INSTANCE; } public void m(...
命令模式
解耦:通过命令对象解耦,而不是直接操作想要操作的对象。 这样的好处就是在修改被操作的对象的方法的时候,只需修改中间的调用者这一个地方,而不是把之前的所有的调用者都修改一遍 增加命令的时候只需增加命令类即可,命令类就是对编辑器操作的包装,基础功能早就在上面写好了。命令类就是起到了解耦,增加命令(组合命令)方便 将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。 命令模式适合用在需要将请求调用者和请求的执行者进行解耦的场景。 需要请求的撤销操作时也是可以使用命令模式的。 1.优点:命令模式可以将请求的调用者和请求的执行者进行解耦。(调用者可能是键盘鼠标一个按钮,他们都要和receiver对线) 2.缺点:命令模式因为需要将命令封装成对象,所以每有一个命令就需要创建一个对象,这样造成命令对象这些小类特别多。 编辑器设计 有些命令会改变编辑器的状态 (例如剪切和粘贴),很多操作对应的是同一个命令,所以直接封装为对象,调用对象就好,而不是直接操作Editor,不然的话Editor有个...
备忘录模式memento
序列化反序列使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。 案例Gender类,是一个枚举类型,表示性别 123public enum Gender { MALE, FEMALE } 每个枚举类型都会默认继承类java.lang.Enum,而该类实现了Serializable接口,所以枚举类型对象都是默认可以被序列化的。 123456789101112131415161718192021222324252627282930313233343536public class Person implements Serializable...
多数据源热切换(请求级别)spring+druid+mybatis-plus
删除旧租户的数据库DROP DATABASE ?; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657### 租户的多数据源切换的aop```java/** * 租户的多数据源切换的aop */@Aspectpublic class TenantSourceExAop implements Ordered { private final Logger log = LoggerFactory.getLogger(this.getClass()); /** * 拦截控制器层 */ @Pointcut("execution(* *..controller.*.*(..))") public void cutService() { } @Around("cutService()") public Obje...
大数据概述
大数据( Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决海量数据的额存储和分析计算 特点:大量,高速,多样,低价值密度, 应用场景:物流仓储,分析用户零售,智慧旅游,广告推荐,保险预测,人工智能 大数据生态 1)Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySql)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 2)Flume:Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据; 3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统; 4)Storm:Storm用于“连续计算”,对数据流做连续查询,在计算时就将结果以流的形式输出给用户。 5)Spark:Spark是当前最流...
分布式锁最佳实践
在单体的应用开发场景中涉及并发同步的时候,大家往往采用 Synchronized(同步)或者同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。 超卖问题复现现象存在如下的几张表: 商品表 订单表 订单item表 :::danger 商品的库存为1,但是并发高的时候有多笔订单。 ::: 错误案例一:数据库 update 相互覆盖直接在内存中判断是否有库存,计算扣减之后的值更新数据库,并发的情况下会导致相互覆盖发生: 123456789101112131415161718192021222324252627@Transactional(rollbackFor = Exception.class)public Long createOrder() throws Exception { Product product = productMapper.selectByPrimaryKey(purchaseProductId); ...
布隆过滤器
布隆过滤器布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。当我们在写入数据库数据时,在布隆过滤器里做个标记,这样下次查询数据是否在数据库时,只需要查询布隆过滤器,如果查询到数据没有被标记,说明不在数据库中。 第一步,使用 N 个哈希函数分别对数据做哈希计算,得到 N 个哈希值; 第二步,将第一步得到的 N 个哈希值对位图数组的长度取模,得到每个哈希值在位图数组的对应位置。 第三步,将每个哈希值在位图数组的对应位置的值设置为 1; 查询的时****候只要有一个为 0,就认为数据 x 不在数据库中。 没有的一定没有,有的也可能没有 黑名单,爬虫去重 只有加入和查询,不要求删除, 极大减少内存, 但是必须允许一定程度的失误率,会误杀好人,但是不会漏杀坏人 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你** “某样东西****一定不存在或者可能存在****”。** 如果存在那就是可能存在(hash的碰撞) 如果不存在那就一定不存在 相比于传统的...
存储器
存储器的类型有哪些? 随机存储器(random access memory,RAM):RAM是易失性存储器 静态随机存储器(SRAM)。静态RAM只要电源供电不断就可以维持所需要的数据。 动态随机存储器(DRAM)。动态RAM由一个小电容构成,因为电容会泄露电荷,因此每隔几毫秒就需要为DRAM充电, SRAM速度更快,价格更高。DRAM的存储密度更高(单块芯片存储更多的位数),消耗功耗更低,产生的热量小得多。通常将两种技术组合,DRAM用作主存储器(primary memory可读写存储器)。SRAM用作高速缓存存储器。 只读存储器(read-only memory,ROM):ROM为非易失性存储器,采用硬连线,可长久保持所存放的数据,也可应用于嵌入式系统、计算机外围设备等,基本的ROM可分五种不同类型:ROM、PROM、EPROM、EEPROM和闪存。计算机里面有小rom用于存放启动计算机所必须的程序 PROM:可编程只读存储器,内部有熔断丝,通过烧断熔断丝对芯片编程,一旦编程完成所有数据和指令都不能更改。 EPROM:可擦除PROM,用发射紫外线的特殊工具将原有芯片内容擦...
工厂方法+抽象工厂设计模式
基本的多态的使用 简单工厂随便一个东西,简单create方法就是简单工厂 单例可以看做是简单的工厂 可扩展性不好。每次添加都要新的方法 工厂方法模式 Factory 接口:工厂方法模式的核心接口之一。使用方会依赖 Factory 接口创建 Product 对象实例。 Factory 实现类( FactoryImpl 1 和 FactoryImpl 2):用于创建 Product 对象。不同的 Factory 实现会根据需求创建不同的 Product 实现类。 Product 接口:用于定义业务类的核心功能。Factory 接口创建出来的所有对象都需要实现 Product 接口。使用方依赖 Product 接口编写其他业务实现,所以使用方关心的是 Product 接口这个抽象,而不是其中的具体实现逻辑。 Product 实现类( ProductImpl 1 和 ProductImpl 2):实现了 Product 接口中定义的方法,完成了具体的业务逻辑。 灵活的方式指定不同的 族系 基于多态 抽象工厂:(电脑公司)定义抽象方法。方法返回值是抽象产品 存在意义:调用者可以有...
并发给ConcurrentHashMap赋值
低性能使用 ConcurrentHashMap 来统计,Key 的范围是 10。 使用最多 10 个并发,循环操作 1000 万次,每次操作累加随机的 Key。 如果 Key 不存在的话,首次设置值为 1。 12345678910111213141516171819private Map<String, Long> normaluse() throws InterruptedException { ConcurrentHashMap<String, Long> freqs = new ConcurrentHashMap<>(10); ForkJoinPool forkJoinPool = new ForkJoinPool(10); forkJoinPool.execute(() -> IntStream.rangeClosed(1, 10000000) .parallel().forEach(i -> { String key...