共计 5228 个字符,预计需要花费 14 分钟才能阅读完成。
1. Redis 集群阐明
1.1 分片 / 哨兵有哪些毛病
1. 分片毛病: 分片的次要性能是实现内存的扩容的, 然而没有高可用的成果.
2. 哨兵毛病: 数据没有扩容, 哨兵自身没有高可用机制
需要: 既能够实现内存的扩容同时实现高可用机制(不必第三方).
1.2 Redis 集群搭建
1.2.1 Redis 集群搭建问题阐明
1. 首先敞开所有的 Redis 服务器
2. 查看配置文件编辑是否正确.
3. 删除多余的配置文件
4. 重启 redis 服务器
5. 搭建 redis 集群
redis-cli --cluster create --cluster-replicas 1 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
1.3 集群入门案例
@Test
public void testCluster(){Set<HostAndPort> sets = new HashSet<>();
sets.add(new HostAndPort("192.168.126.129", 7000));
sets.add(new HostAndPort("192.168.126.129", 7001));
sets.add(new HostAndPort("192.168.126.129", 7002));
sets.add(new HostAndPort("192.168.126.129", 7003));
sets.add(new HostAndPort("192.168.126.129", 7004));
sets.add(new HostAndPort("192.168.126.129", 7005));
JedisCluster jedisCluster = new JedisCluster(sets);
jedisCluster.set("jedis", "集群赋值");
System.out.println(jedisCluster.get("jedis"));
}
1.4 面试题
1.redis 集群中一共能够存储 16384 个 KEY?? 不对
答:16384 只是槽位的数量只负责布局这个数据归谁治理的问题. 至于数据如何存储, 是由 redis 内存决定的.
2.Redis 集群中最多能够有多少台主机? 16384 主机.
3.Redis 中如果遇到多线程操作, 是否有线程安全性问题 ? 没有
因为:redis 服务器是单过程单线程操作. 每次操作都是由一个线程执行, 所以不会有线程安全性问题.
4.Redis 如何实现内存数据的优化? LRU/LFU/ 随机算法 /TTL
1.5 SpringBoot 整合 Redis 集群
1.5.1 编辑 properties 文件
阐明: 将 redis 集群的节点写入 pro 配置文件中
# 配置单台 redis 服务器
#redis.host=192.168.126.129
#redis.port=6379
## 配置 redis 分片
#redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381
# redis 集群配置
redis.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
1.5.2 编辑配置类
package com.jt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
import java.util.Set;
@Configuration // 标识我是配置类
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
// 实现 redis 集群操作
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean
public JedisCluster jedisCluster(){Set<HostAndPort> nodeSet = new HashSet<>();
String[] nodeArray = nodes.split(",");
for (String node : nodeArray){ //host:port
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
nodeSet.add(new HostAndPort(host,port));
}
return new JedisCluster(nodeSet);
}
/* *//**
* SpringBoot 整合 Redis 分片, 本质:ShardedJedis 对象, 交给容器治理
*//*
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean
public ShardedJedis shardedJedis(){List<JedisShardInfo> shards = new ArrayList<>();
String[] nodeArray = nodes.split(",");
for(String node : nodeArray){ //node=ip:port
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
// 筹备分片节点信息
JedisShardInfo info = new JedisShardInfo(host,port);
shards.add(info);
}
return new ShardedJedis(shards);
}*/
/* @Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Bean
public Jedis jedis(){return new Jedis(host,port);
}*/
}
1.5.3 编辑 AOP 配置
在 AOP 中注入 Redis 缓存对象
2. 京淘前台我的项目搭建
2.1 京淘架构图设计
2.2 JT-WEB 我的项目创立
2.2.1 创立 JT-WEB 服务器
2.2.2 增加继承 / 依赖 / 插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 我的项目坐标 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>jt-web</artifactId>
<!-- 打 war 包 -->
<packaging>war</packaging>
<!-- 父级工程 -->
<parent>
<artifactId>jt2007</artifactId>
<groupId>com.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 增加依赖项 -->
<dependencies>
<dependency>
<groupId>com.jt</groupId>
<artifactId>jt-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--4. 增加 maven 插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.3 导入动态资源文件
阐明: 将课前材料中的文件 src 目录导入到 jt-web 中
2.2.4 对于主启动类阐明
阐明:jt-web 服务器启动时会加载数据源的自动化配置, 然而 web 服务器没有配置数据源, 所以报错.
启动类上增加数据源启动.
2.2.5 配置工作目录
2.3 域名反向代理
需要: 要求用户通过 http://www.jt.com 拜访 localhost:8092 服务器.
2.3.1 批改 host 文件
2.3.2 批改 Nginx 配置文件
# 配置前台服务器
server {
listen 80;
server_name www.jt.com;
location / {proxy_pass http://localhost:8092;}
}
批改之后, 重启 nginx 服务器
2.3.3 页面成果展示
2.4 谷歌浏览器禁用 HTTPS
键入地址:
批改实现之后, 先清空缓存之后重启浏览器
2.5 开启后缀类型匹配
阐明: 因为京东商城的商品展示时通过
url:https://item.jd.com/100213774…
URL 地址小结:
1.http://www.jt.com/index 该申请会被 Controller 进行拦挡
2.http://www.jt.com/index.html 该申请默认条件下示意获取资源文件, 不会被拦挡
个别条件下:Controller 只拦挡前缀类型的申请. 如果须要拦挡后缀类型的申请须要独自配置.
3 登录注册页面的跳转
3.1 实现通用的页面跳转
url1:http://www.jt.com/user/login.html 跳转页面 login.jsp
url2:http://www.jt.com/user/register.html 跳转页面 register.jsp
需要: 是否利用一个 Controller 办法. 实现通用页面的跳转?
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 实现用户登录 / 注册页面的跳转
* url1: http://www.jt.com/user/register.html
* url2: http://www.jt.com/user/login.html
*/
@RequestMapping("/{moduleName}")
public String module(@PathVariable String moduleName){return moduleName;}
}
3.2 伪动态的体现
伪动态是绝对实在动态来讲的,通常咱们为了加强搜索引擎的敌对性 ,都将文章内容生成动态页面,然而有的敌人为了实时的显示一些信息。或者还想使用动静脚本解决一些问题。不能用动态的形式来展现网站内容。然而这就损失了对搜索引擎的敌对性。怎么样在两者之间找个两头办法呢,这就产生了 伪动态技术。伪动态技术是指展现进去的是以 html 一类的动态页面模式,但其实是用 ASP 一类的动静脚本来解决的。
总结: 以.html 结尾的一种动静页面的模式
作业
1. 预习什么是跨域?
1.JSONP 2.CORS 形式