设计模式-单例模式
什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。
关键代码:构造函数是私有的。
特点
某个类只能有一个实例
它必须自行创建这个实例
它必须自行向整个系统提供这个实例
作用
控制资源的使用,通过线程同步来控制资源的并发访问;
控制实例产生的数量,达到节约资源的目的。
作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
适用场景
系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点, ...
设计模式-代理模式
什么是代理模式 在软件开发中,也有一种设计模式可以提供与代购网站类似的功能。由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。
代理模式是一种应用很广泛的结构型设计模式,而且变化形式非常多,常见的代理形式包括远程代理、保护代理、虚拟代理、缓冲代理、智能引用代理等,后面将学习这些不同的代理形式。
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。
为什么要用代理模式
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设 ...
设计模式-策略模式
JAVA设计模式-策略模式
什么是策略模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。
在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。
如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加 ...
Redis企业实战
企业实战架构设计组件选择/多级缓存的设计要分多个层次,在不同的层次上选择不同的缓存,包括JVM缓存、文件缓存和Redis缓存
JVM缓存JVM缓存就是本地缓存,设计在应用服务器中(tomcat)。 通常可以采用Ehcache和Guava Cache,在互联网应用中,由于要处理高并发,通常选择Guava Cache。 适用本地(JVM)缓存的场景:
1、对性能有非常高的要求。
2、不经常变化
3、占用内存不大
4、有访问整个集合的需求
5、数据允许不实时一致
文件缓存 这里的文件缓存是基于http协议的文件缓存,一般放在nginx中。 因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请 求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。
server {
listen 80 default_server;
server_name localhost;
root /mnt/note/;
location / {
...
Redis大厂面试汇总
缓存雪崩、缓存穿透、缓存击穿答题思路:
三者的概念,发生场景、解决方案
三者的区别和影响
涉及知识点:Redis第七章:缓存问题—缓存穿透、缓存雪崩、缓存击穿穿透:不存在的key雪崩:大量的key失效击穿:一个key或一些key 热点key
大Key,热点Key的处理Hot Key答题思路:
hot key的概念,场景,问题
hot key的发现
hot key的处理
涉及知识点:Redis第七章:缓存问题—hot key
Big Key答题思路:
big key的概念、场景,影响 String > 10k list大于5000个
big key的发现
big key的处理
涉及知识点:缓存问题—big key
数据库一致,缓存失效,数据并发竞争数据库一致答题思路:
Catch Aside Pattern
数据源不一致
场景的适用性(互联网)
保证最终一致,一致的时间处理
涉及知识点:Cache Aside Pattern数据不一致
缓存失效答题思路:缓存失效带来的问题:缓存穿透、缓存雪崩、缓存击穿(高并发)会让数据库压力过大而宕机redis ...
Redis-高可用
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。CAP的A AP模型单机的Redis是无法保证高可用性的,当Redis服务器宕机后,即使在有持久化的机制下也无法保证不丢失数据。所以我们采用Redis多机和集群的方式来保证Redis的高可用性。单进程+单线程 + 多机 (集群)
主从复制Redis支持主从复制功能,可以通过执行slaveof(Redis5以后改成replicaof)或者在配置文件中设置slaveof(Redis5以后改成replicaof)来开启复制功能。
(一主一从)
(一主多从)
(传递复制)主对外从对内,主可写从不可写主挂了,从不可为主
主从配置主Redis配置无需特殊配置
从Redis配置修改从服务器上的 redis.conf 文件:
# slaveof <masterip> <masterport>
# 表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。
replicaof 127.0.0.1 6379 ...
Redis扩展功能
发布与订阅Redis提供了发布订阅功能,可以用于消息的传输Redis的发布订阅机制包括三个部分,publisher,subscriber和Channel
发布者和订阅者都是Redis客户端,Channel则为Redis服务器端。发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。
频道/模式的订阅与退订subscribe:订阅 subscribe channel1 channel2 ..Redis客户端1订阅频道1和频道2
127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2
publish:发布消息 publish channel message Redis客户端2将消息发布在频道1和频道2上
127.0.0.1:6379> publish ch1 hello
(integer) 1
127. ...
Redis持久化
为什么要持久化Redis是内存数据库,宕机后数据会消失。Redis重启后快速恢复数据,要提供持久化机制Redis持久化是为了快速的恢复数据而不是为了存储数据Redis有两种持久化方式:RDB和AOF注意:Redis持久化不保证数据的完整性。当Redis用作DB时,DB数据要完整,所以一定要有一个完整的数据源(文件、mysql)在系统启动时,从这个完整的数据源中将数据load到Redis中数据量较小,不易改变,比如:字典库(xml、Table)通过info命令可以查看关于持久化的信息
# Persistence
loading:0
rdb_changes_since_last_save:1
rdb_bgsave_in_progress:0
rdb_last_save_time:1589363051
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:1
aof_rewrite_in_progress:0
a ...
redis-通讯协议及事件处理机制
通信协议Redis是单进程单线程的。应用系统和Redis通过Redis协议(RESP)进行交互。
请求响应模式Redis协议位于TCP层之上,即客户端和Redis实例保持双工的连接。
串行的请求响应模式(ping-pong)串行化是最简单模式,客户端与服务器端建立长连接连接通过心跳机制检测(ping-pong) ack应答客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务器端再响应。
telnet和redis-cli 发出的命令 都属于该种模式特点:有问有答耗时在网络传输命令性能较低
双工的请求响应模式(pipeline)批量请求,批量响应请求响应交叉进行,不会混淆(TCP双工)
pipeline的作用是将一批命令进行打包,然后发送给服务器,服务器执行完按顺序打包返回。通过pipeline,一次pipeline(n条命令)=一次网络时间 + n次命令时间 通过Jedis可以很方便的使用pipeline
Jedis redis = new Jedis("192.168.1.111", 6379);
redis.auth("12345678");//授权密码 对 ...
Redis-数据类型与底层数据结构
Redis数据类型和应用场景Redis是一个Key-Value的存储系统,使用ANSI C语言编写。key的类型是字符串。value的数据类型有:常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型。不常见的:bitmap位图类型、geo地理位置类型。Redis5.0新增一种:stream类型注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)
Redis的Key的设计
用:分割
把表名转换为key前缀, 比如: user:
第二段放置主键值
第三段放置列名比如:用户表user, 转换为redis的key-value存储
userid
username
password
email
9
zhangf
111111
zhangf@lagou.com
username 的 key: user:9:username{userid:9,username:zhangf}email的key user:9:email表示明确:看key知道意思不易被覆盖 ...
分布式事务总结
分布式事务-简介事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制
数据库本地事务
说到数据库事务就不得不说,数据库事务中的四大特性,ACID
A:原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。
C:一致性(Consistency) 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
I:隔离性(Isolation) 指的是在并发 ...
HashMap实现原理
HashMap实现原理
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下面就来分析HashMap的存取。
定义 HashMap实现了Map接口,继承AbstractMap。其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最大限度地减少实现此接口所需的工作,其实AbstractMap类已经实现了Map。
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
//序列号,序列化的时候使用。
private static final long serialVersionUID = 362498820 ...