关于java:京淘项目day15

35次阅读

共计 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 形式

正文完
 0