概述
spring boot
springboot的简介
- 本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
spring boot的优缺点
优点
- 纯JAVA的配置方式,很简单,很方便
- 配合各种starter使用,基本上可以做到自动化配置
- 配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运行还是蛮简单的。
缺点
- 从原来的xml配置方式转换到JAVA配置方式变化有点大,可能一下子转换不过来
- 感觉Spring Boot 比较适合做微服务,不适合做比较大型的项目。
shiro
基本介绍
Apache Shiro 是一个强大易用的java安全框架,提供了认证、授权、加密和会话管理等功能。
Shiro基本架构:
- Subject:Subject 代表当前“用户”。与 Subject 的所有交互都会委托给 SecurityManager;Subject 其实是一个门面,SecurityManager 才是实际的执行者;
- SecurityManager:安全管理器;Shiro框架的核心。Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
- Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限)。从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作。
架构流程
- 应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;
- 我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。
Shiro身份验证的基本流程
- 创建当前登录操作用户
Subject subject = SecurityUtils.getSubject(); - 创建token令牌,token中有用户提交的认证信息即账号和密码
UsernamePasswordToken token = new UsernamePasswordToken(user.getNickname(),
user.getPswd()); - 调用 Subject.login 进行登录,如果失败将得到相应的 AuthenticationException 异常,根据异常提示用户错误信息;否则登录成功。
subject.login(token);
shiro自定义Realm
- 创建自定义的 Realm 类
继承org.apache.shiro.realm.AuthorizingRealm 类,
实现doGetAuthorizationInfo()授权管理和 doGetAuthenticationInfo() 登陆验证方法
Eharts
基本介绍:
- ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),提供直观,生动,可交互,可高度个性化定制的数据可视化图表。
图表类型:
- ECharts 提供了常规的折线图,柱状图,散点图,饼图,K线图,用于统计的盒形图,用于地理数据可视化的地图,热力图,线图,用于关系数据可视化的关系图,treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
Echarts操作过程
1.在GitHub或者官网上下载Echarts最新版本
2.在页面中引入Echarts的文件,即js文件,同时还需要引入Jquery
3.绘制图表
3.1 在绘图前我们需要为 ECharts 准备一个具备高宽的 DIV容器。
3.2 在script中,基于准备好的dom,初始化echarts实例
3.2.1var myChart = echarts.init(document.getElementById(‘main’));
3.3 初始化之后,指定Echarts图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
3.3.1配置项目可能包括但不限于图表名称,图表类型,主题等等等等。
3.3.2数据是从通过ajax查询后台数据,返回json格式。
3.4 使用刚指定的配置项和数据显示图表。
3.4.1myChart.setOption(option);
高并发以及高负载
服务器常见代理模式
正向代理
客户端通过代理服务器访问原始服务器。对于客户端而言,正向代理所代理的是客户端, 那么客户端必须要进行一些特别的设置。
反向代理
客户端发送请求到代理服务器, 然后代理服务器将请求转发给内部网络上的其他服务器(原始服务器), 并将从原始服务器上得到的结果返回给客户端,此时代理服务器就是代理的服务端, 客户端无须进行特别的设置, 对外就表现为一个反向代理服务器
JavaWEB高并发的处理措施
- 程序设计上运用队列缓存,动态网页静态化等技术
- 项目部署架构上运用服务器集群达到分布式负载均衡效果
负载均衡
- 负载均衡是指将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于均匀,均衡的分摊压力。而现实最简单的方式就是服务器集群架构(Cluster)。
- 常见负载均衡技术:DNS轮询、IP负载均衡和CDN
Web服务器集群
Nginx
Nginx介绍
- 免费开源的反向代理Web服务器软件
- 聚焦于高性能,高并发和低内存消耗问题。
- 并且具有多种Web服务器功能特性:负载均衡,缓存,访问控制,带宽控制,以及高效整合各种应用的能力,这些特性使Nginx很适合于现代网站架构。
Nginx详细配置
- 修改conf 目录下 nginx.conf 文件
JVM内存管理机制和垃圾回收机制,内存调优
Java的垃圾回收机制
- 垃圾回收器作为一个单独的低级别线程运行,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
- 垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。
Java的类加载机制
- 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。
SOA
什么是WebService?
- WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。
- WebService实现不同语言间的调用,是依托于一个标准,webservice是需要遵守WSDL(web服务定义语言)/SOAP(简单请求协议)规范的。
WebService的实现技术和作用?
在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
- XML:描述数据的标准方法.
- SOAP:表示信息交换的协议.
- WSDL:Web服务描述语言.
- UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
WebService如何实现的?
WebService的优点:
- 可以让异构的程序相互访问(跨平台)
- 松耦合
- 基于标准协议(通用语言,允许其他程序访问)
WebService的基本原理:
- Service Provider采用WSDL描述服务
- Service Provider 采用UDDI将服务的描述文件发布到UDDI服务器(Register server)
- Service Requestor在UDDI服务器上查询并 获取WSDL文件
- Service requestor将请求绑定到SOAP,并访问相应的服务。
SVN/GIT
SVN和GIT的区别
1.首先两者都是版本控制系统。但是Git是分布式的,而SVN不是分布式,是集中式的。
- 好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;
2.GIT和SVN的分支概念不同。GIT中任意开启分支,且不会影响其他分支的代码运行。
- 查看分支:git branch
- 创建分支:git branch 分支名称
- 切换分支:git checkout 分支名称
- Fast forward合并某个分支:git merge 分支名称
3.Git没有一个全局版本号,而SVN有:目前为止这是跟SVN相比Git缺少的最大的一个特征。
4.SVN提交(Commit),当直接记录到中央版本库。并且如果和服务器的网络中断,将根本无法提交。而GIT提交完全属于本地版本库的活动。你只需要推送(git push)到主要主要版本库就可以。
5.总结:管理项目用svn,管理代码用git。
SVN的优缺点
优点
- 管理方便,逻辑明确,符合一般人思维习惯。
- 易于管理,集中式服务器更能保证安全性。
- 代码一致性非常高。
- 适合开发人数不多的项目开发。缺点
缺点
- 服务器压力太大,数据库容量暴增。
- 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
- 不适合开源开发。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
GIT的优缺点
优点
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
缺点
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
数据库
数据库三大范式
- 第一范式(1NF):字段具有原子性,不可再分。数据库表中的字段都是单一属性的,不可再分。
- 第二范式(2NF)在第一范式(1NF)的基础上。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
- 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
什么是索引以及索引的优缺点
- 索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构。
- 索引的几个基本类型:普通索引、唯一索引、主键索引、全文索引。
- 索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列表,其中包含了各个值的行所存储的位置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。
a) 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
b) 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
c) 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能 - 缺点
a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
b) 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
c) 索引降低了插入、删除、修改等维护任务的速度
什么是存储过程?它有什么优点?
存储过程是一组预编译的SQL语句。
优点:
- 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
- 允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
- 减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
d) 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。
存储过程和函数的区别
- 存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程。
- 而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。实现的功能针对性比较强。
数据库事务概念
事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。
- 原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
- 一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
- 隔离性:由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
- 持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
对mysql乐观锁、悲观锁的理解
- 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
- 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
a) 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
b) 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
几种数据库的分页实现
sql server
select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id
mysql
select * from 表名 limit pages, pageSize;
Oracle
select a.* from ( select rownum num ,t.* from 表名 t where 某列=某值 order by id asc )a where a.num>=startPage and a.num<endPage
Mysql,Oracle,SqlServer的区别
- Mysql属于Oracle旗下公司。SQL Server 是Microsoft 公司旗下。都是属于关系型的数据库,都是目前的主流数据库,其基本操作语法大致相同。
- Mysql安装配置简单,性能优越,开源价格便宜。且适应于所有的平台,为中小型数据库。而Sqlserver是大型数据库,且稳定。海量数据下运行速度明显比MYSQL快N多。
- Mysql有着运行速度快,使用成本低,可移植性强,适用用户广等优点。但是默认引擎是MyISAM不支持事务管理的。Sqlserver当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展,即扩展性强。
数据库优化思路
SQL语句优化
a) 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
b) 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
c) 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
d) 用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
e) 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
索引优化
a) 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
b) 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
数据库结构优化
a) 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
服务器硬件优化
a) 避免频繁创建和删除临时表,以减少系统表资源的消耗。
b) 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
c) 尽量避免大事务操作,提高系统并发能力。
Web服务优化
尽量减少HTTP请求
两种:{
A. 合并脚本跟样式文件,如果可以把多个css文件组成一个,把多个js文件组成一个。
B. CSS Sprites利用CSS background相关元素进行背景绝对定位,把多个图片合成一个图片。
}
使用浏览器缓存
在用户浏览网站的不同页面时,有很多内容是重复的,比如JS,CSS,图片等,如果能建议或强制浏览器在本地缓存这些文件,将大大的降低了页面产生的流量,从而降低页面的载入时间。
- 服务器端告诉浏览器不要缓存此文件,每次到服务器更新文件。
- 服务器端没有给浏览器任何指示
- 服务器端要求缓存此文件,并设置了过期时间,在缓存未到期前,浏览器直接使用本地缓存文件,不会与服务端产生任何通信,我们要做的就是尽量强制浏览器到第四种状态,特别JS,CSS,图片等变动较少的文件。
使用压缩组件
IE和Firefox浏览器都支持客户端GZIP,传输之前,先使用GZIP压缩再传输给客户端,客户端接收之后由浏览器解压,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更高的带宽利用率。对于纯文本来讲,压缩率是相当可观的。如果每个用户节约50%的带宽,那么租用来的那点带宽就可以服务多一倍的客户,并且缩短了数据的传输时间。
图片,JS的预载入
实现预载入图像最简单的方法在javascript中实例一个新的image()对象,需要将需要的载入图像的URL作为参数传入。
function preLoadImg(url) {
var img = new Image();
img.src = url;
}
可以在登录页面预载入JS和图片
将脚本放在底部
- 使用脚本时,对于位于脚本以下的内容,逐步呈现将被阻塞。
- 在下载脚本时会阻塞并行下载
放在底部可能出现JS的问题,当脚本没加载进来,用户就触发脚本事件。
将样式文件放在页面顶部
- 白屏
- 无样式内容的闪烁
使用外部的css和js
精简js去除不必要的,精简css
六、Redis缓存应用
特性:Redis是一款内存数据库,它提供了丰富的数据结结构供用户使用。其次,极低的响应延迟也使它经常被用作Cache层的组件。目前为止,redis官方社区以及很多公司都提供了Redis的分布式版本,解决了单机容量有限的问题,并且大部分为开源项目
能基于对象保存数据?
Redis的数据存储是基于二进制流的,理论上可以保存任何数据,并且提供了丰富的数据结构,例如Hash,List,Set等等使用起来更为方便。
基于用户名实时统计指标?
不太清楚具体要统计何种指标,不太好作答。不过有些场景是可以充分利用Redis中丰富的数据结构来完成相应统计的,例如UV的非精确统计可以使用Redis中Hyperloglog算法来实现。
是否需要按时间汇总?
我们首先要统一下"实时"的理解,是达到"毫秒"级为实时还是"秒"级为实时,根据响应时间要求不同,实现方式也会有所不同。我理解指标的统计原理基本是不会改变的,但使用Redis与传统的方式相比可以实现更快速度,更细的时间粒度。传统方式每五分钟汇总一次,那如果使用Redis甚至可以达秒级的响应延迟,当然这也需要对使用的数据结构进行精心的设计。
对硬件的需求会增加么?
这个是当然的,Redis是纯基于内存的数据库,对内存要求相当大,而且如果有高可用的需求那么至少还会增加一倍的内存容量做主从备份。
以我个人的观点,Redis在大数据处理中,常被用作为分布式的外部存储,更像是数据处理界的"瑞士军刀",依赖其丰富的数据结构可以使原有性能低下的数据处理变得更加快速,实现起来也更为简单。但与此同时带来高昂的内存成本也必须要考虑在内,以最小的成本换去最大的效率提升才是我们追求的目标。
注意点:
并不是所有数据都要放进REDIS缓存,而是针对一些改动性不大或者访问率大的数据进行缓存来减少关系型数据的压力。
缓存对象有三种:
1)数据库中单条的数据(以表名跟ID作为key永久保存在redis),在更新的时候更新缓存
2)对于一些不分页,不需要实时的列表,我们可以将列表结果缓存到redis中,设定一定缓存时间作为该数据的存活时间,用获取该列表的方法名作为key,列表结果作为value;这种情况只使用于不经常更新且不需要实时的情况下。
3)不需要实时的,需要分页列表的,可以把分页的结果列表放在一个map,然后将map放在缓存中,然后给该list设置一个缓存存活时间,这样通过方法名lrange出来就能获取存有分页列表的数据,遍历该list,通过遍历list中的map和key判断该分页数据是否在缓存内,是则返回,不存在则rpush进去,这种做法可以让1-5重新加载,让6-10依然是缓存的数据而导致脏数据的情况。
Mongodb跟redis的区别
Mongodb更类似于mysql,关系型数据库{
A. 擅长查询json数据,但不支持事务
B. 由Liuix系统numap实现,当内存不够时,只将热点数据放入内存,将其它存在磁盘
C. 数据结构单一,但是支持丰富的数据表达,索引,更类似于关系型数据库,支持查询的语言比较丰富。
}
redis非关系型数据库{
A. 从3.0支持集群
B. 数据存在内存,定期写入磁盘,如果磁盘不够,可以选择LRU算法删除数据。
C. 数据结构丰富,包括hash,set,list
}
Mongodb适合于冷数据(超过一天)存储海量数据,redis适合于热数据(比如1天内频繁访问的),响应快
Redis
Redis是什么?
Redis是Remote Dictionary Server缩写,它是一个开源的,高性能的键-值存储。Redis出现补偿了非关系型数据存在的多种不足。
Redis支持存储多种数据类型
String(字符串),list,set,zset,hasp(哈希表),这些类型都支持新增/修改,这些操作要么被执行,要么全部回滚。
在性能方面表现出优异的性能数据。
Redis基础特性:
Redis有很多灵活高效的数据结构,同时还具有持久化,主从负责等很多基础特性。
Redis数据结构:
Redis的value支持5种数据类型:string(字符串),lists(字符串列表),sets(字符集合)Zets(有序字符串集合)和hash
Redis持久化:
四种持久化方式
①. 定时快照方式(RDB)
②.基于语句追加文件的方式(aof)
③.虚拟内存(vm)
④.Diskstore
Redis主从复制:
Redis事务处理:一致性,持久性,隔离性,原子性
Redis优点和缺点:
优点:
1)免费开源
2)易于安装使用,操作简单
3)数据结构丰富灵活,适用场景广泛
4)具有事务性,保持一致性
缺点:
1)持久化不成熟,快照文件必然面临数据丢失,AOF很影响性能
2)存储成本高,纯内存操作,不适合海量数据
3)架构扩展不是很简单
去除重复
使用Redis的set数据结构最合适不过了,我们在新数据增加时,不用管是否重复,set会自动排重。
Redis应用场景:
例如 需要获取最新N条数据记录
某个游戏开发平台 需要最近一个的登陆的用户ID列表,我们通过lists操作就能完成应用场景的设计
将登陆用户的ID及登陆时间添加到列表里
Ret=r.lpush(“login”,uid);
设定列表仅保留N个有效数据
Ret=redis.ltrim(“login:last_login”,0,N-1);
获取当前N个登陆的用户信息
Last_login_list=r.lrange(“login:last_login_times”,0,N-1)
这种数据结构设计在微博中也常用到,例如获取某个用户的所有博文,或获取某个微博的最新N条评论,使用redis的list很容易实现。
最后
以上就是眼睛大镜子为你收集整理的总结1.0spring bootshiroEharts高并发以及高负载JVM内存管理机制和垃圾回收机制,内存调优SOASVN/GIT数据库Web服务优化六、Redis缓存应用Mongodb跟redis的区别Redis的全部内容,希望文章能够帮你解决总结1.0spring bootshiroEharts高并发以及高负载JVM内存管理机制和垃圾回收机制,内存调优SOASVN/GIT数据库Web服务优化六、Redis缓存应用Mongodb跟redis的区别Redis所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复