CGB2004

1.Redis集群

1.1 Redis分区说明

Redis分区只负责 数据应该存储到哪里的问题.至于是否能存储的下 完全由Redis内存决定.
在这里插入图片描述
特点:
1.hash(key1)%16384 = 3000
2.hash(key2)%16384 = 3000 key1和key2 都归第一个节点进行管理.

1.2 Redis hash槽与一致性 hash算法的区别

1.运算位置不同.
1.redis分片机制在业务服务器中完成的运算.
2.redis分区算法在连接Redis之后,由redis进行计算.
2.算法不同 一致性hash算法/hash槽算法.
3.redis分片可以随意的进行数据的保存. redis分区不能随机存储.分区中只能保存属于我的key.

1.3 Redis面试题

1.Redis集群中的主机最多 多少台? 16384个.
Redis集群内存多少最多可以扩展到原有redis多少倍.
2.Redis中存储的数据最多16384个??? 不对的. 16384只是分区的大小.至于能存储多少数据,完全由内存决定.

1.4 Redis集群宕机条件说明

说明: redis集群中 只要有一台Redis 主机宕机. 则整个Redis集群崩溃(可以进行高可用)
问题分析:
1.如果有6台Redis搭建集群,问: 最少宕机多少台Redis集群崩溃??? 宕机2台集群崩溃
2.如果搭建9台Redis.3台主机, 问 :最少宕机Redis台 集群奔溃??? 宕机5台集群崩溃

补充说明:如果想让集群尽可能不宕机,则适当增加从节点的数量. 2-3个从即可.

1.5 什么是脑裂现象

说明:在集群的机制中,由主机进行选举,当主机在进行选举时如果连续3次出现平票的结果时,则可能引发脑裂现象.
问题:出现脑裂现象的概率是多少? 答: 1/8=12.5%

如何有效降低脑裂现象: 可以通过增加主机的数量来有效降低脑裂的发生

1.6Spring整合Redis集群

1.6.1 编辑pro配置文件

1# 配置单台redis 2#redis.host=192.168.126.129 3#redis.port=6379 4 5# 配置多台redis 6#redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381 7 8# 配置Redis集群 9redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005 10

1.6.2 编辑配置类

1package com.jt.config; 2 3import org.springframework.beans.factory.annotation.Value; 4import org.springframework.context.annotation.Bean; 5import org.springframework.context.annotation.Configuration; 6import org.springframework.context.annotation.PropertySource; 7import redis.clients.jedis.*; 8 9import java.util.ArrayList; 10import java.util.HashSet; 11import java.util.List; 12import java.util.Set; 13 14@Configuration //标识我是配置类 15@PropertySource("classpath:/properties/redis.properties") 16public class RedisConfig { 17 18 /** 19 * 引入redis集群配置 20 */ 21 @Value("${redis.nodes}") 22 private String nodes; //node,node,node 23 24 @Bean 25 public JedisCluster jedisCluster(){ 26 String[] strNodes = nodes.split(","); //[node1,nod2,nod3.....] 27 Set<HostAndPort> set = new HashSet<>(); 28 for(String node : strNodes){ //node=host:port 29 String host = node.split(":")[0]; 30 int port = Integer.parseInt(node.split(":")[1]); 31 set.add(new HostAndPort(host,port)); 32 } 33 34 return new JedisCluster(set); 35 } 36 37 38 39 40 41 42 43 /* @Value("${redis.nodes}") 44 private String nodes; //node,node,node 45 46 *//** 47 * spring整合redis分片机制 48 *//* 49 @Bean 50 public ShardedJedis shardedJedis(){ 51 //1.获取每个节点的信息 52 String[] strNodes = nodes.split(","); 53 List<JedisShardInfo> shards = new ArrayList<>(); 54 //2.遍历所有node.为list集合赋值 55 for(String node :strNodes){ //node=ip:port 56 String host = node.split(":")[0]; 57 int port = Integer.parseInt(node.split(":")[1]); 58 JedisShardInfo info = new JedisShardInfo(host,port); 59 shards.add(info); 60 } 61 62 ShardedJedis shardedJedis = new ShardedJedis(shards); 63 return shardedJedis; 64 }*/ 65 66 67 68 69 70 /* @Value("${redis.host}") 71 private String host; 72 @Value("${redis.port}") 73 private Integer port; 74 75 //SpringBoot管理 Spring框架的优化的API 76 @Bean 77 public Jedis jedis(){ 78 79 return new Jedis(host,port); 80 }*/ 81} 82

1.6.3 修改CacheAOP注入项

说明:在CacheAOP中 注入RedisCluster 对象
在这里插入图片描述

2. JT-WEB服务器构建

2.1 分布式环境搭建流程

在这里插入图片描述

2.2 创建JT-WEB

2.2.1 创建项目

在这里插入图片描述

2.2.2 添加继承/依赖/插件

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <!--继承父级--> 6 <parent> 7 <artifactId>jt</artifactId> 8 <groupId>com.jt</groupId> 9 <version>1.0-SNAPSHOT</version> 10 </parent> 11 <modelVersion>4.0.0</modelVersion> 12 <artifactId>jt-web</artifactId> 13 <!--指定打包类型--> 14 <packaging>war</packaging> 15 16 <!--添加依赖信息--> 17 <dependencies> 18 <dependency> 19 <groupId>com.jt</groupId> 20 <artifactId>jt-common</artifactId> 21 <version>1.0-SNAPSHOT</version> 22 </dependency> 23 </dependencies> 24 25 <!--添加插件--> 26 <build> 27 <plugins> 28 <plugin> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-maven-plugin</artifactId> 31 </plugin> 32 </plugins> 33 </build> 34</project>

2.2.3 导入web资源

说明:将课前资料中的文件导入IDEA中即可
在这里插入图片描述

2.2.4 编辑IDEA启动项

在这里插入图片描述

2.2.5启动效果

在这里插入图片描述

2.2.6关于主启动类的注解说明

说明:该报错信息由SpringBoot启动时报的.
1).在jt. pom.xml文件中引入数据源的jar包文件.当SpringBoot程序启动时,必然要加载数据源.
2).但是jt-web服务器yml配置文件中没有添加数据源,所以启动报错!!!
在这里插入图片描述
1).pom.xml文件包信息

1<!--引入数据库驱动 --> 2 <dependency> 3 <groupId>mysql</groupId> 4 <artifactId>mysql-connector-java</artifactId> 5 <scope>runtime</scope> 6 </dependency> 7 8 <!--springBoot数据库连接 --> 9 <dependency> 10 <groupId>org.springframework.boot</groupId> 11 <artifactId>spring-boot-starter-jdbc</artifactId> 12 </dependency> 13

2).YML配置信息

1server: 2 port: 8092 3spring: #定义springmvc视图解析器 4 mvc: 5 view: 6 prefix: /WEB-INF/views/ 7 suffix: .jsp 8

3).解决方案 说明:在主启动类中添加该注解即可.
在这里插入图片描述

2.3 nginx实现反向代理

2.3.1 规则

说明: 要求用户使用http://www.jt.com:80的方式来访问localhost:8092服务器.

2.3.2 修改hosts文件

1# 京淘配置 2#左侧写IP地址 右侧写域名 中间使用空格分隔 3#为了实现Linux发布修改如下 4#192.168.126.129 image.jt.com 5#192.168.126.129 manager.jt.com 6127.0.0.1 image.jt.com 7127.0.0.1 manager.jt.com 8127.0.0.1 www.jt.com 9127.0.0.1 sso.jt.com

2.3.3 修改nginx配置文件

说明: 修改windows中的nginx服务器.

1# 配置前台服务器 2 server { 3 listen 80; 4 server_name www.jt.com; 5 6 location / { 7 proxy_pass http://localhost:8092; 8 } 9 }

在这里插入图片描述

2.4 关于web服务器网址访问报错说明

2.4.1 解決浏览器使用https的方法

1).在浏览器中键入 "chrome://net-internals/#hsts:“
在这里插入图片描述

2.5 实现伪静态

2.5.1 导入配置类

说明: 将课前资料中的配置类导入项目中.
在这里插入图片描述
2).导入项目
在这里插入图片描述

2.5.2 京东商城商品页面分析

思考: 当前的页面是在后端服务器中真实存在的,还是由一个页面动态填充数据实现的!!!
说明: 经过分析 京东的商品的展现由一个页面动态的填充. 只要服务器接收商品ID即可.并且应该拦截.html为后缀的页面请求.

在这里插入图片描述

2.5.3 什么是伪静态

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结: 以.html为结尾的展现的动态页面的脚本技术.

2.5.4 搜索引擎工作原理(铺垫)

在这里插入图片描述

2.5.5 当前使用场景

大前端技术发展比较火. 完全的前后端分离 node.js 作为脚手架 存.html的页面 .jsp技术可能落后了. 通过vue/jquery 动态实现页面数据回显. VUE

3. 京淘跨域问题实现

3.1 实现用户登录/注册跳转

登录路径: http://www.jt.com/user/login.html
注册路径: http://www.jt.com/user/register.html

3.2 编辑UserController

1package com.jt.controller; 2 3import org.springframework.stereotype.Controller; 4import org.springframework.web.bind.annotation.PathVariable; 5import org.springframework.web.bind.annotation.RequestMapping; 6 7@Controller 8@RequestMapping("/user") 9public class UserController { 10 11 /** 12 * 业务说明:要求用一个方法实现页面的通用跳转. 13 * http://www.jt.com/user/login.html 跳转页面 login.jsp 14 * http://www.jt.com/user/register.html 跳转页面register.jsp 15 * 自己完成该功能!!!! 16 */ 17 @RequestMapping("/{moduleName}") 18 public String moduleName(@PathVariable String moduleName){ 19 20 return moduleName; 21 } 22 23 24 25 26} 27

3.3 跨域问题说明

3.3.1 用户注册业务说明

业务说明:当用户输入用户名时,应该向后端服务器获取数据库信息.校验数据库中是否存在该数据.
并且给用户友好的提示.
问题: 如何实现由jt-web服务器 访问jt-sso呢???
解决方案: 利用ajax形式实现远程数据调用!!! (http)
讨论: 利用ajax是否实现远程数据的访问呢???
在这里插入图片描述

3.3.2 ajax跨域访问测试(一)

说明:测试时 挑选在jt-manager中的页面和数据进行ajax测试
1).页面结构如下

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>测试JSON跨域问题</title> 6<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script> 7<script type="text/javascript"> 8 $(function(){ 9 $.get("http://manage.jt.com/test.json",function(data){ 10 alert(data.name); 11 }) 12 }) 13</script> 14</head> 15<body> 16 <h1>JSON跨域请求测试</h1> 17</body> 18</html>

2).访问的数据类型

{"id":"1","name":"tom"}

3).测试效果
在这里插入图片描述
页面网址: http://manager.jt.com/test.html
页面中ajax请求网址: http://manager.jt.com/test.json
结论: ajax访问同一个域名的数据,访问正常!!!

3.3.3 ajax跨域访问测试(二)

测试说明: 由jt-web的页面 发起ajax请求.访问jt-manager中的text.json数据.
特点: 页面的访问网址 http://www.jt.com/test.html 与ajax访问的网址http://manager.jt.com/test.json 网址不同.
1).页面信息

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>测试JSON跨域问题</title> 6<script type="text/javascript" src="http://manager.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script> 7<script type="text/javascript"> 8 /*$(){}结构必然是jQuery函数类库导入后才能正确执行*/ 9 $(function(){ 10 alert("我执行了AJAX"); 11 //利用jQuery发起AJAX请求 12 $.get("http://manager.jt.com/test.json",function(data){ 13 alert(data.name); 14 }) 15 }) 16</script> 17</head> 18<body> 19 <h1>JSON跨域请求测试</h1> 20</body> 21</html>

测试结论: 发现在不同的域名中访问.请求不能正常的进行.,报错信息如下
在这里插入图片描述

3.3.4 同源策略说明

说明:浏览器中规定 Ajax请求 协议://域名:端口三者必须全部相同时,才能实现数据访问(同域请求),如果违反上述规则中的任意一个则该请求就是跨域访问.
如果浏览器进行跨域访问,则浏览器不予解析返回值.

3.4 跨域实现-jsonp

3.4.1 JSONP跨域访问入门案例

核心思路:
1.利用javaScript中的src属性进行跨域!!!.

1<script type="text/javascript" src="http://manager.jt.com/test.json"></script> 2 3 4补充说明:一般src属性负责资源的加载.如果 需要使用数据,则需要函数进行调用才行. 5 62.自定义回调函数 7 8 9<script type="text/javascript"> 10 /*JS是解释执行的语言 */ 11 /*定义回调函数 */ 12 function hello(data){ 13 alert(data.name); 14 } 15 </script> 16 17 183.将返回值的结果 进行特殊的格式封装!!! 19 20 21hello({"id":"1","name":"tom"})

整体页面JS分析

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>测试JSON跨域问题</title> 6 <script type="text/javascript"> 7 /*JS是解释执行的语言 */ 8 /*定义回调函数 */ 9 function hello(data){ 10 alert(data.name); 11 } 12 </script> 13 <!--该json一直保存到浏览器中等待调用,但是没有函数名称无法调用 --> 14 <script type="text/javascript" src="http://manager.jt.com/test.json"></script> 15 <script type="text/javascript" src="http://manager.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script> 16 </script> 17</head> 18<body> 19 <h1>JS跨域问题</h1> 20</body> 21</html>

3.4.2 JSONP介绍

艺名:json"胖"
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

3.4.3 jQuery实现JSONP

需求:jsonp的方式如果采用原生的调用方式,则配置繁琐 1.javascript 2.自定义回调函数 3.特殊格式封装.
则jQuery负责封装JSONP.像常规ajax调用一样的方便.
页面封装:

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>JSONP测试</title> 6<script type="text/javascript" src="http://manager.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script> 7<script type="text/javascript"> 8 $(function(){ 9 alert("测试访问开始!!!!!") 10 $.ajax({ 11 url:"http://manager.jt.com/web/testJSONP", 12 type:"get", //jsonp只能支持get请求 src只能进行get请求. 13 dataType:"jsonp", //dataType表示返回值类型 必须标识 14 //jsonp: "callback", //指定参数名称 15 //jsonpCallback: "hello", //指定回调函数名称 16 success:function (data){ //data经过jQuery封装返回就是json串 17 alert(data.id); 18 alert(data.name); 19 } 20 }); 21 }) 22</script> 23</head> 24<body> 25 <h1>JSON跨域请求测试</h1> 26</body> 27</html>

页面请求网址:
在这里插入图片描述

3.4.4 编辑jt-manager中的Controller

1package com.jt.web.controller; 2 3import org.springframework.web.bind.annotation.RequestMapping; 4import org.springframework.web.bind.annotation.RestController; 5 6@RestController 7public class JSONPController { 8 9 /** 10 * 完成JSONP的调用 11 * url:http://manager.jt.com/web/testJSONP?callback=jQuery111101021758391465013_1597656788213&_=1597656788214 12 * 规定:返回值结果,必须经过特殊的格式封装.callback(json) 13 */ 14 @RequestMapping("/web/testJSONP") 15 public String jsonp(String callback){ 16 17 return callback+"({'id':'100','name':'tomcat猫'})"; 18 } 19 20}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )