首页
Search
1
JAVA垃圾回收
993 阅读
2
Kafka、RocketMQ消息队列总结
981 阅读
3
Flink on Kubernetes 计算和存储分离落地实践
970 阅读
4
Linux免密登陆-ubuntu
904 阅读
5
Redis集群部署方案
890 阅读
大数据
Flink
后端
Java
笔记
运维
游客
Search
标签搜索
大数据
Flink
离线
实时
Redis
OpenJDK
Java
笔记
JVM
Elasticsearch
GC
Hadoop
Hudi
Flink CDC
K8S
数据湖
TOTC
累计撰写
307
篇文章
累计阅读
104.3万
次
首页
栏目
大数据
Flink
后端
Java
笔记
运维
页面
搜索到
9
篇与
笔记
的结果
返回首页
2013-08-17
设计模式总结
代理模式 代理对象与目标对象,代理对象是对目标对象的扩展,并会调用目标对象。 不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。静态代理 :编译期加入a.可以做到在不修改目标对象的功能前提下,对目标功能扩展。b.因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多,一旦接口增加方法,目标对象与代理对象都要维护。动态代理 (JDK代理,接口代理):反射,运行时动态加入,目标对象一定要实现接口。 Cglib代理 (子类代理):在内存中构建一个子类对象从而实现对目标对象功能的扩展。a.需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入pring-core-3.2.5.jar即可。b.代理的类不能为final,否则报错。c.目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法。在Spring的AOP编程中:如果加入容器的目标对象有实现接口,用JDK代理;如果目标对象没有实现接口,用Cglib代理。{lamp/}桥梁模式 将抽象化与实现化脱耦,使得二者可以独立地变化,将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联,如JDBC桥连。a.找出变化并封装之b.优先使用聚合而并不是继承{lamp/}工厂模式 简单工厂模式 :就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,提供静态工厂方法,根据参数决定创建出哪种类型的实例,在有限的程度上支持开闭原则,如:DateFormat、SimpleDateFormat。工厂方法模式 :工厂类变成抽象工厂,仅负责给出工厂子类必须实现的部分(返回抽象类型),完全支持开闭原则,如: java.util.Collection中的iterator()方法。抽象工厂模式 :围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。{lamp/}单例模式 :饿汉模式 :类加载时就会创建,构造方法私有(类不能被继承)懒汉模式 {lamp/}原始模型模式 原始模型模式属于对象的创建模式。浅复制:浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。a.通过构造方法实现浅拷贝b.重写clone()方法进行浅拷贝深复制:重写clone()方法进行浅拷贝注:clone()方法1、Object类虽然有这个方法,但是这个方法是受保护的(被protected修饰),所以我们无法直接使用。2、使用clone方法的类必须实现Cloneable接口,否则会抛出异常CloneNotSupportedException。对于这两点,我们的解决方法是,在要使用clone方法的类中重写clone()方法,通过super.clone()调用Object类中的原clone方法。{lamp/}观察者模式 一个对象的行为依赖于另一个对象的状态,或者换一种说法,当被观察对象(目标对象)的状态发生改变时 ,会直接影响到观察对象的行为。如Zookeeper。{lamp/}适配器模式 创建一个Adapter将两个类的功能合到一个,分为类适配器模式、对象适配器模式 如JDBC驱动软件。{lamp/}其他 1.开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”。2.里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
2013年08月17日
1,197 阅读
21 点赞
2013-06-29
JAVA线程池总结
Executors类提供了4种不同的线程池 1.newCachedThreadPool ——SynchronousQueue2.newFixedThreadPool ——LinkedBlockingQueue3.newScheduledThreadPool4.newSingleThreadExecutor ——LinkedBlockingQueue{lamp/}参数 corePoolSize 线程池核心线程大小。maxPoolSize 线程池最大线程数量,如果工作队列满了,才会创建一个新线程。keepAliveTime 空闲线程存活时间。unit 空间线程存活时间单位,keepAliveTime的计量单位。{lamp/}workQueue 工作队列 ArrayBlockingQueue :生产和消费用的是同一个锁;必须指定大小(有界)。LinkedBlockingQueue :锁是分离的;转换为Node<E>进行插入或移除、会生成额外的Node对象、对GC有影响都可以;不指定大小时(无界),生产速度大于消费速度时候,有可能会内存溢出。PriorityBlockingQueue SynchronousQuene ,newCachedThreadPool,操作必须是放和取交替完成。threadFactory,设定线程名、是否为daemon线程,守护线程。allowCoreThreadTimeoutRejectedExecutionHandler 拒绝策略 AbortPolicy ,丢弃任务并抛出异常,默认。DiscardPolicy ,丢弃任务。DiscardOldestPolicy ,丢弃队列最前面的任务,然后重新提交被拒绝的任务。不和优先级队列同时使用。CallerRunsPolicy ,由调用线程处理该任务 导致程序阻塞,性能效率上必然的损失较大。{lamp/}默认配置 corePoolSize = 1 queueCapacity = Integer.MAX_VALUE maxPoolSize = Integer.MAX_VALUEkeepAliveTime = 60秒 allowCoreThreadTimeout = false rejectedExecutionHandler = AbortPolicy(){lamp/}corePoolSize、maxPoolSize根据机器资源配置相同的值根据峰值持续的时间设置allowCoreThreadTimeout = true、keepAliveTime来动态控制存活线程的数量。自定义任务队列,可以根据当前并发量,通过简单的管理页面随时动态调整队列的长度(保证线程安全的前提下)。{lamp/}ThreadLocal 每个线程都会有这个变量的一个副本。Thread类中有两个变量,是ThreadLocal.ThreadLocalMap ThreadLocalMap的key是ThreadLocal的弱引用,在没有其他地方对ThreadLoca依赖时,ThreadLocalMap中的ThreadLocal对象就会被回收掉,但是对应的value不会被回收,Map中就可能存在key为null但是value不为null的项,所以使用完毕及时调用remove方法避免内存泄漏。
2013年06月29日
1,035 阅读
85 点赞
2013-06-08
Redis学习笔记
缓存穿透: 访问不存在的数据时,大量的并发去查询DB,可能会瞬间压垮DB。缓存击穿: 某一热点数据过期。缓存雪崩: 过期策略一样,同时过期。解决方案:a.使用互斥锁 ,缓存中不存在时先上锁,从数据库加载完毕后释放锁,其他线程等待后重试(从缓存中取)。单机用lock,分布式用redis setnx。b.隆过滤器 ,所有可能存在的数据放到布隆过滤器,一定不存在的数据会被拦截掉。同时使用netflix hystrix,隔离每个服务,防止任何单个依赖服务耗尽所有用户线程。{lamp/}持久化 持久化方式有RDB,一种快照式的持久化方法,手动或者定期执行,将某个时间点上的数据库状态保存到一个 RDB 文件中,对于数据恢复的完整性不是非常敏感。AOF是将执行过的写指令记录下来, 可以使用不同的fsync策略:无fsync、每秒fsync、每次写的时候fsync,使用默认的每秒fsync策略,Redis的性能依然很好,一旦出现故障,最多丢失1秒的数据。{lamp/}过期策略 过期策略定时器删除,在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。惰性删除,key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。定期删除,每隔一段时间执行一次删除过期key操作。{lamp/}数据类型 String类型是字节数组的形式存储,类似ArrayList的动态字符串、是二进制安全的,可以把图片和视频文件保存在String中,但最大长度是512M,如果value是个整数,还可以进行自增操作。String可以进行位操作,可用来实现位图。位图的典型应用有数据压缩、海量数据去重、海量数据排序,将出现的数字在位图中对应的位置置为1,数据量大时内存不足以放下所有的数。List可用来实现消息队列、栈,结构是快速链表(LinkList+连续内存块),插入删除非常快,索引定位慢。Hash结构类似HashMap,但是rehash操作是渐进式的(新建一个,将旧的慢慢复制到新的)。Set内部的实现相当于特殊的字典,Value是NULL,键值是无序唯一的。可以存放中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。ZSet内部是跳跃列表,采取一个随机策略来决定新元素可以兼职到第几层。zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。布隆过滤器已经存在的肯定能判断到、不存在的可能会误判。爬虫里,一个网址是否被访问过。超大的位数组和几个哈希函数。HyperLogLog,Redis 的高级数据结构,放入直接返回计数,有误判。基数统计。{lamp/}其他 redis在网络请求模块使用了一个线程(所以不需考虑并发安全性),所有的命令都会进入一个队列中,避免了不必要的上下文切换和竞争条件。部署模式有主从复制模式。哨兵模式,较难支持在线扩容并且每台redis服务器都存储相同的数据。集群模式redis3.0,实现了分布式存储。分布式锁,版本号形式 setnx (setIfAbsent 、getAndSet)。
2013年06月08日
1,051 阅读
50 点赞
2013-05-04
计算机网络笔记
因特网的核心部分电路交换——整个报文的比特流连续地从源点直达终点,已被用户占用的通信线路资源在绝大部分时间里都是空闲的,其线路的传输效率往往很低。报文交换——整个报文先传送到相邻结点,全部存储下来后查找转发表,转发到下一个结点。分组交换——单个分组(这只是整个报文的一部分)传送到相邻结点,存储下来后查找转发表,转发到下一个结点。分组交换则采用存储转发技术,报文划分成为一个个更小的等长数据段,就构成了一个分组(packet)。分组又称为“包”。路由器则是用来分组交换的,先暂时存储一下到内存中,保证了较高的交换速率,这样一步一步地(有时会经过几十个不同的路由器)以存储转发的方式,把分组交付最终的目的主机。若要连续传送大量的数据,且其传送时间远大于连接建立时间,则电路交换的传输速率较快。报文交换和分组交换不需要预先分配传输带宽,在传送突发数据时可提高整个网络的信道利用率。由于一个分组的长度往往远小于整个报文的长度,因此分组交换比报文交换的时延小,同时也具有更好的灵活性。因特网现在采用存储转发的分组交换技术,以及三层因特网服务提供者(ISP)结构。{lamp/}网络体系结构 运输层由于一台主机可同时运行多个进程,因此运输层有复用和分用的功能。主要使用以下两种协议:● 传输控制协议TCP——提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。● 用户数据报协议 UDP ——提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。网络层因特网主要的网络层协议是无连接的网际协议IP,因此因特网的网络层也叫做网际层或IP层。数据链路层在两个相邻结点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻结点间的链路上传送帧。物理层在物理层上所传数据的单位是比特“1”或“0”。在局域网中,硬件地址又称为物理地址或 MAC地址。IEEE 802标准为局域网规定了一种48位的全球地址,是指局域网上的每一台计算机中固化在适配器的ROM中的地址,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。{lamp/}中间设备 物理层使用的中间设备叫做转发器(repeater)。数据链路层使用的中间设备叫做网桥或桥接器(bridge)。网络层使用的中间设备叫做路由器(router)。在网络层以上使用的中间设备叫做网关(gateway)。
2013年05月04日
777 阅读
49 点赞
1
2