赞
踩
特点:
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离
基础:
ridis:全称 Remote Dictionary Server ,是一个基于内存的高性能 Key-Value 数据库。
非关系型数据库:作为关系型数据库的良好补充。
分类 | 特点 | 代表产品 |
---|---|---|
键值存储 | 数据一般存在内存中,读写速度快(10w/s),适合作为缓存服务 当成map即可 | redis |
文档型数据库 | 数据结构要求不严格,适合存储结构不确定或者价值较低的数据 | mongodb |
列存储数据库 | 查找速度快,更容易进行分布式扩展,适合作为文件存储服务 | Hbase |
图形数据库 | 使用“图结构”进行存储,适合做社交网络计算等等 | Neo4j |
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化(RDB和AOF),可以同时使用。
RDB(快照方式)【默认方式】
在一定的间隔时间中,检测key的变化情况,然后持久化数据
.文件名称:dump.rdb
rdb默认的快照规则:在redis.windwos.conf文件
save 900 1 当15分钟之内有1个key发生变化就拍照
save 300 10 当300秒之内有10个key发生变化就拍照
save 60 10000 当60秒之内有1w个key发生变化就拍照
重启服务器后,默认是从rdb文件中恢复数据到内存中
AOF(追加命令到文件中),需要手动开启的,文件名称:appendonly.aof
以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
可以每一次命令操作后,持久化数据
appendfsync always 每执行一个命令,就会把命令追加到文件中,和关系型数据库相似
appendfsync everysec 每一秒钟,把所有的操作命令追加到文件中
appendfsync no 不同步,等同于rdb
启动的时候需要指定配置文件启动,修改配置文件redis.windows.conf中 appendonly no
将他的值改成yes,重启服务器就生效,
虽然开启了aof,但是rdb依然能用.只不过是,当服务器重启的时候,从aof文件将数据恢复到内存中.
当我们正常关闭redis服务器的时候,他会通过不同的方式将内存中的数据保存到硬盘文件中.再次启动的时候,会去文件中把数据恢复到内存中.
若我们把redis作为缓存使用,建议使用rdb方式,高效; 若数据需要不时的持久化,建议使用aof方式.
缓存是允许有数据丢失.
- bg save 做镜像全量持久化,AOF 做增量持久化。因为 bgsave 会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要 AOF 来配合使用。
- 在 Redis 实例重启时,会使用 bgsave 持久化文件重新构建内存,再使用 AOF 重放近期的操作指令来实现完整恢复重启之前的状态。
- 对方追问那如果突然机器掉电会怎样?
- 取决于 AOF 日志的属性的配置,如果不要求性能,在每条写指令时都 sync 一下磁盘文件,就不会丢失数据。但是在高性能的要求下每次都 sync 是不现实的,一般都使用定时sync ,比如
1 秒 1 次
,这个时候最多就会丢失 1 秒的数据。- 对方追问 bgsave 的原理是什么?
- 你给出两个词汇就可以了,fork 和 cow 。
- fork 是指 Redis 通过创建子进程来进行 bgsave 操作。
- cow 指的是 copy on write ,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据。
方案一:set 指令
方案二:redlock
对比 Zookeeper 分布式锁
- 从可靠性上来说,Zookeeper 分布式锁好于 Redis 分布式锁。
- 从性能上来说,Redis 分布式锁好于 Zookeeper 分布式锁。
jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理【jedis连接资源的创建与销毁是很消耗程序性能】。一般不直接使用jedis,而是在其上在封装一层,作为业务的使用。如果用spring的话,可以看看spring 封装的 redis [Spring Data Redis]
在官方网站里列一些Java的客户端,有Jedis
、Redisson
、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis
jedis对redis 相当于 jdbc对关系型数据库
SOA:即面向服务的架构。有如下几个特点:分布式、可重用、扩展灵活、松耦合。
RPC:远程调用 ,是一个过程,不是一种技术.例如a服务器调用b服务器的过程. 例如比较出名的RPC框架有:dubbo和spring cloud(项目二中应用)
在dubbo中还有一个监控中心,可以记录下消费者和提供者的一些信息,也可以设置权重和负载均衡的策略
提供者:dubbo应用名称,注册中心地址,协议端口和注解支持
消费者:dubbo应用名称,注册中心地址和注解支持
【额外的其他配置(check属性检查有无对应的提供者,推荐false)(retries属性重试次数)(timeout属性超时时间)】
1.提供者的配置【在对应的service的配置文件中】
如:applicationContext_company_provider.xml
<!--dubbo的配置 都用阿里的-->
<!--注册中心地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--应用的名称-->
<dubbo:application name="dubbo_provider"/>
<!--协议和端口号 name:协议的名称 port:端口号,建议从20880开始写-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--注解支持-->
<dubbo:annotation package="cn.lee.service"/>
2.消费者的配置【web层的springmvc.xml】
<!--dubbo消费者配置-->
<!--注册中心-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--应用名称-->
<dubbo:application name="export_web_manager"/>
<!--注解支持-->
<dubbo:annotation package="cn.lee.web"/>
<!--其他配置
check属性:启动的时候是否要检查有无对应的提供者.默认值是true.开发中一般设置为false
retries属性:重试的次数,一般设置为0次
timeout属性:连接的超时时间,超过此时间就会报错 单位:毫秒-->
<dubbo:consumer check="false" retries="0" timeout="3000"/>
查看有哪些提供者和消费者,查看调用的次数(需要配置),调节提供者的权重(负载均衡)
SSM传统项目:并发压力有限 tomcat8.0 (1000)
Dubbo:基于RPC远程调用的长连接,不是Http协议的(每次发送内容没有head头信息),效率高
1.基于长连接
2.效率高
3.必须是Java的
zookeeper注册中心一般是奇数,因为有选举机制(偶数效率低)
SpringCloud的注册中心
SpringCloud:基于Http远程调用的短链接,效率低,兼容性
1.基于http短链接
2.相比dubbo效率低
3.兼容性好
Http协议:head(请求方式,json/text) body,http协议是基于TCP协议的
TCP调用:三次握手,四次挥手
Socket:套接字是指通过ip地址+端口号,在流中发送和接收数据的这种交互方式
长连接:握手后不断开,服务器可以找到客户端
短链接:客户端发起请求,服务器响应后,断开本次请求,服务器无法再次找到客户端
SpringCloud:Spring 公司开源的微服务框架,SpirngCloud 定位为微服务架构下的一站式解决方案(微服务生态)。
Dubbo:阿里巴巴开源的 RPC框架,Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。
我们只需要找到想要的图形,将它的option复制过来,然后让后台组织对应的数据即可.
对于基本图形来说,需要的数据就是json数组,每个json对象只需要name和value两个属性即可
要求我们的controller只需要返回List
再次我使用ajax方式去查询页面上需要的数据.
POI是用JAVA语言编写的免费的开源的跨平台API, 可以对微软的word、Excel、PPT进行操作。
涉及的数据量比较大,我们这里采用 POI 给我们提供的支持07 版本的 SXSSFWork 对象实现导入导出, 但是不能使用模板打印,不能使用太多的样式
POI里边提供了两种模式, 用户模式(系统默认)和事件模式。
这两个的区别是:用户模式:相当于xml中dom解析,一次性将所有的数据读取到内存中,再处理
事件模式:相当于xml中sax解析,逐行扫描解析,大量数据的话不会造成oom异常【内存溢出】【用于这种百万数据导出导入】
使用事件模式解析的步骤:
创建一个公用的解析器【Excel 解析器】[公司提供]
创建一个行解析器(自己创建)【sheet解析器】【是基于 SAX 解析】
RabbitMQ 是一款开源的,Erlang编写的,基于 AMQP协议的,消息中间件。
消息队列中间件是分布式系统中重要的组件,主要解决**应用解耦,异步消息,流量削锋
**等问题,实现高 性能,高可用,可伸缩和最终一致性架构。
queues队列 :这个东西就是一个队列,一个存储消息的队列,并且可以持久化,而且这个队列中的消息可以被消费,如果出现死信则是死信队列,死信队列也是可以被处理的
规范:
搭建 RabbitMQ 集群。一般小型,中型项目搭建3 台够用了。数据量在500万内。
消息不可靠的情况可能是消息丢失,劫持等原因。丢失又分为:生产者丢失消息、消息列表丢失消息、消费者丢失消息。
confirm
模式:一旦 channel 进入 confirm 模式,所有在该信道上发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后。RabbitMQ 就会发送一个ACK 给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了.如果rabbitMQ没能处理该消息,则会发送一个 Nack消息给你,你可以进行重试操作。 这里顺便说一下吧,其实也很容易,就下面两步:
1.将 queue 的持久化标识 durable 设置为 true,则代表是一个持久的队列。
2.发送消息的时候将 deliveryMode=2。这样设置以后,即使rabbitMQ 挂了,重启后也能恢复数据。
手动回执
】消息持久化
、设置为自动回执
持久化还怕宕机=
RabbitMQ提供了持久化的机制,将内存中的消息持久化到硬盘上,即使重启 RabbitMQ,消息也不会丢失。
持久化队列和非持久化队列的区别是: 持久化队列会被保存在磁盘中,固定并持久的存储,当 Rabbit 服务重启后,该队列会保持原来的状态在 RabbitMQ
中被管理, 而非持久化队列不会被保存在磁盘中,Rabbit 服务重启后队列就会消失。非持久化比持久化的优势就是,由于非持久化不需要保存在磁盘中,所以使用速度就比持久化队列快。即是非持久化的性能要高于持久化。
而持久化的优点就是会一直存在,不会随服务的重启或服务器的宕机而消失。
TCC
:补偿性事务(一般采用) try-confirm-concel异步确保
:利用 mq 实现分布式事务。rabbitmq基于以上两种模式进行扩展:
work
)模式【一个生产者,多个消费者】[Work发送后,可以多个消费者处理生产出来的消息,消息被消费后消失]
角色功能:
- 生产者:向队列发送消息
- 消费者:需要绑定队列
- 队列:存储生产者的消息
订阅模式(广播)【一个生产者,多个消费者】
一般广播模式-fanout
【Fanout发送后,全部消费者收到消息】
路由【定向】模式-direct
【Direct发送后,路由相同的消费者收到消息】
生产者 :确定交换机已声明后,向交换机发送消息,发送时指定路由
消费者 :确定队列已绑定交换机并在绑定时指定路由,从队列获取消息
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, “insert”);
例:队列1key:buy,对应的消费者只能接受buy信息
队列2key:back 对应的消费者接受back信息
主题模式-topic
【Topic发送后,路由相同的消费者收到消息,不过可以采用通配符的方式】
生产者 :确定交换机已声明后,向交换机发送消息,发送时指定路由
消费者 : 确定队列已绑定交换机并在绑定时指定路由,从队列获取消息
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, “item.*”);
例:队列1key: buy.*,对应的消费者1可以收到buy信息,不能接受back信息
队列2key:back.* buy.*,对应的消费者2可以接受back信息,能接受back信息
key的匹配操作,一般使用.隔开key
支持两种通配符
①buy.* :一层目录任意字符 匹配 buy.a buy.b; 但是buy.a.a 匹配不到
②buy.# :任意层目录任意字符 匹配 buy.a buy.b buy.a.a
角色功能:
- 生产者:向交换机发送消息
- 消费者:需要绑定队列
- 交换机:发给绑定过的所有队列
- 队列:需要绑定到交换机
简称ACK
有两种方式:
自动回执:一旦消费者收到信息,马上发送回执.
手动回执:需要在代码中通过api发送回执,对消息要求比较高的时候建议使用手动回执
解决消息丢失 ::
①开启持久化
交换机定义消息队列,durable:是否持久化,如果想在RabbitMQ退出或崩溃的时候,不会失去所有的queue和消息,需要同时标志队列(queue)和交换机(exchange)是持久化的,即rabbit:queue标签和rabbit:direct-exchange中durable=true
②消费者手动确认消息【设置消息回执为手动】
避免消息堆积::可以设置多消费者监听,实现消息争抢
消息有序性::要顺序就要放弃效率,确定队列只有单一消费者
消息重复::在消费端通过业务判断是否已执行,比如将处理过的消息在数据库做标识处理
基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务
除此之外:
job:任务
detail:任务详情,具体的描述任务信息
trigger:触发器,包含任务详情和触发的时间 【七子表达式】
schdule:调度器,调度所有的触发器
如果使用Jasper Report技术进行pdf文件导出,可以使用Jaspersoft Studio工具(软件)设计pdf文件的模板
其他PDF技术:
设计(Design)阶段、执行(Execution)阶段以及输出(Export)阶段。
ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。由于 ZooKeeper 的开源特性,后来我们的开发者在分布式锁的基础上, 摸索了出了其他的使用方法: 配置维护.组服务.分布式消息队列.分布式通知/协调等。
Zookeeper的核心是**原子广播
**,这个机制保证了各个 Server 之间的同步。
实现这个机制的协议叫做Zab 协议。Zab 协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数 Server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 Server 具有相同的系统状态。
每个 Server 在工作过程中有三种状态:
LOOKING:当前 Server 不知道 leader 是谁,正在搜寻
LEADING:当前 Server 即为选举出来的 leader
FOLLOWING:leader 已经选举出来,当前 Server 与之同步
n(奇数) 台服务器和 n+1台服务器都最多允许 相同的(n-1)/2 台服务器挂掉,才能维持半数以上服务器通过。那多一台服务器不是钱???
在分布式锁服务中,有一种最典型应用场景,就是通过对集群进行Master选举,来解决分布式系统中的单点故障。什么是分布式系统中的单点故障:通常分布式系统采用主从模式,就是一个主控机连接多个处理节点。主节点负责分发任务,从节点负责处理任务,当我们的主节点发生故障时,那么整个系统就都瘫痪了,那么我们把这种故障叫作单点故障。
传统解决方案
传统方式是采用一个备用节点,这个备用节点定期给当前主节点发送 ping包,主节点收到 ping 包以后向备用节点发送回复 Ack,当备用节点收到回复的时候就会认为当前主节点还活着,让他继续提供服务。
当主节点挂了,这时候备用节点收不到回复了,然后他就认为主节点挂了接替他成为主节点但是这种方式就是有一个隐患,也就是说我们的主节点的并没有挂,只是在回复的时候网络发生故障,这样我们的备用节点同样收不到回复,就会认为主节点挂了,然后备用节点将他的Master实例启动起来,这样我们的分布式系统当中就有了两个主节点也就是-双 Master,出现 Master以后我们的从节点就会将它所做的事一部分汇报给了主节点,一部分汇报给了从节点,这样服务就全乱了。
Zookeeper解决方案:
Master启动:
在引入了 Zookeeper以后我们启动了两个主节点,“主节点-A"和"主节点-B"他们启动以后,都向 ZooKeeper 去注册一个节点。我们假设"主节点-A"所注册地节点是"master-00001”, “主节点-B"所注册的节点是"master-00002”,注册完以后进行选举,编号最小的节点将在选举中获胜获得“锁”并且成为主节点,也就是我们的"主节点-A"将会获得“锁”成为主节点,然后"主节点-B"将被阻塞成为一个备用节点。那么,通过这种方式就完成了对两个 Master 进程的调度。
⑴ Master故障
如果"主节点-A"挂了,这时候他所注册的节点将被自动删除,ZooKeeper 会自动感知节点的变化,然后再次发出选举,这时候"主节点-B"将在选举中获胜,替代"主节点-A"成为主节点。
⑵ Master恢复
如果“主节点-A”恢复了,他会再次向 ZooKeeper注册一个节点,这时候他注册的节点将会是"master-00003",ZooKeeper会感知节点的变化再次发动选举,由于编号最小的节点将在选举中获胜获得“锁”并且成为主节点,这时候"主节点-B"在选举中会再次获胜继续担任"主节点","主节点-A"会担任备用节点。
项目开发中使用的是基于 webService 的一套框架CXF,Cxf 是基于 SOA 总线结构,依靠 spring 完成模块的集成,实现 SOA 方式。底层就是基于servlet开发的
灵活的部署: 可以运行在 Tomcat,Jboss,Jetty(内置),weblogic 上面。
分别指的是 JAX-RS,JAX-WS,JAX-WS&SAAJ(废弃)
JAX-RS:
jax-ws:(了解)
SOAP,WSDL,UDDI
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。