设计模式:单例模式
概要
单例(Singleton)是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。
核心知识点如下:
(1) 将类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个静态方法返回该类的实例
应用场景:配置文件、工具类、线程池、缓存、日志对象等
Redis主从复制
Master-Slave主从模式
Redis Server可以设置为另一个Redis Server的主机(从机),特殊的,一个从机同样可以设置为一个 Redis Server 的主机,这样一来 Master-Slave 的分布看起来就是一个有向无环图 DAG,如此形成 Redis Server 集群,无论是主机还是从机都是 Redis Server,都可以提供服务,主机数据更新后根据配置和策略,自动同步到从机上。Master以写为主,Slave为读为主。
- Redis使用异步复制。从Redis2.8开始从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度
- 一个主服务器可以有多个从服务器
- 不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构
- 复制功能不会阻塞主服务器:即使有一个或多个从服务器正在进行初次同步,主服务器也可以继续处理请求
- 复制功能也不会阻塞从服务器:只要在 redis.conf文件中进行了相应的设置,即使从服务器正在进行初次同步,服务器也可以使用旧版本的数据集来处理命令查询。不过,在从服务器删除旧版本数据集并载入新版本数据集的那段时间内,连接请求会被阻塞。
- 复制功能可以单纯地用于数据冗余(data redundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability):比如说,繁重的SORT命令可以交给附属节点去运行
- 可以通过复制功能来让主服务器免于执行持久化操作:只要关闭主服务器的持久化功能,然后由从服务器去执行持久化操作即可
Redis持久化
Redis 提供了多种不同级别的持久化方式:
- RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
- AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
- Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
- 你甚至可以关闭持久化功能,让数据只在服务器运行时存在
动态代理
代理模式是设计模式中一个非常重要的模式,代理模式有两个角色,一个是代理类,一个是委托类,委托类也是真正的业务类,两者都有相同的接口;
代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
Spring中的AOP基本原理就是动态代理。
代理模式可以根据代理类创建时期的不同分为两种:
- 静态代理:程序员需要编写特定的源代码,在程序运行前,.class已存在
- 动态代理:在系统运行时,Java反射自动生成
Java基础:Hashcode与equals
equals() 的作用
equals() 的作用是 用来判断两个对象是否相等。
equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。Object源码如下
public boolean equals(Object obj) {
return (this == obj);
}
既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等。但是,使用默认的“equals()”方法,等价于“==”用法。因此,我们通常会重写equals()方法:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。