1.Redis集群说明

1.1 分片/哨兵有哪些缺点

1.分片缺点: 分片的主要的功能是实现内存的扩容的. 但是没有高可用的效果.
2.哨兵缺点: 数据没有扩容,哨兵本身没有高可用机制
需求: 既可以实现内存数据的扩容,同时实现高可用机制(不用第三方).

1.2 Redis集群搭建

1.2.1 Redis集群搭建问题说明

1.首先关闭所有的Redis服务器
15-Redis集群 京淘项目前台系统 - 图1
2.检查配置文件编辑是否正确.
3.删除多余的配置文件
15-Redis集群 京淘项目前台系统 - 图2
4.重启redis服务器
15-Redis集群 京淘项目前台系统 - 图3
5.搭建redis集群

  1. 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 集群入门案例

  1. @Test
  2. public void testCluster(){
  3. Set<HostAndPort> sets = new HashSet<>();
  4. sets.add(new HostAndPort("192.168.126.129", 7000));
  5. sets.add(new HostAndPort("192.168.126.129", 7001));
  6. sets.add(new HostAndPort("192.168.126.129", 7002));
  7. sets.add(new HostAndPort("192.168.126.129", 7003));
  8. sets.add(new HostAndPort("192.168.126.129", 7004));
  9. sets.add(new HostAndPort("192.168.126.129", 7005));
  10. JedisCluster jedisCluster = new JedisCluster(sets);
  11. jedisCluster.set("jedis", "集群赋值");
  12. System.out.println(jedisCluster.get("jedis"));
  13. }

1.4 面试题

1.redis集群中一共可以存储16384个KEY? 不对的
答: 16384只是槽位的数量 只负责规划这个数据归谁管理的问题.至于数据如何存储,是由redis内存决定的.
hash(key1) = 3000,
hash(key2) = 3000;
2.Redis集群中最多可以有多少台主机? 16384台主机.
3.Redis中如果遇到多线程操作,是否有线程安全性问题 ? 没有
因为:redis服务器是单进程单线程操作. 每次操作都是由一个线程执行,所以不会有线程安全性问题.
4.Redis如何实现内存数据的优化? LRU/LFU/随机算法/TTL

1.5 SpringBoot整合Redis集群

1.5.1 编辑properties文件

说明:将redis集群的节点写入pro配置文件中

  1. # 配置单台redis服务器
  2. #redis.host=192.168.126.129
  3. #redis.port=6379
  4. ##配置redis分片
  5. #redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381
  6. # redis集群配置
  7. 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 编辑配置类

  1. package com.jt.config;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.PropertySource;
  6. import redis.clients.jedis.*;
  7. import java.util.ArrayList;
  8. import java.util.HashSet;
  9. import java.util.List;
  10. import java.util.Set;
  11. @Configuration //标识我是配置类
  12. @PropertySource("classpath:/properties/redis.properties")
  13. public class RedisConfig {
  14. //实现redis集群操作
  15. @Value("${redis.nodes}")
  16. private String nodes; //node,node,node
  17. @Bean
  18. public JedisCluster jedisCluster(){
  19. Set<HostAndPort> nodeSet = new HashSet<>();
  20. String[] nodeArray = nodes.split(",");
  21. for (String node : nodeArray){ //host:port
  22. String host = node.split(":")[0];
  23. int port = Integer.parseInt(node.split(":")[1]);
  24. nodeSet.add(new HostAndPort(host,port));
  25. }
  26. return new JedisCluster(nodeSet);
  27. }
  28. /*@Bean
  29. public ShardedJedis shardedJedis(){
  30. List<JedisShardInfo> shards = new ArrayList<>();
  31. String[] nodeArray = nodes.split(",");
  32. for (String node : nodeArray){ //node=ip:port
  33. String host = node.split(":")[0];
  34. int port = Integer.parseInt(node.split(":")[1]);
  35. //准备分片节点信息
  36. JedisShardInfo info = new JedisShardInfo(host, port);
  37. shards.add(info);
  38. }
  39. return new ShardedJedis(shards);
  40. }*/
  41. /* @Value("${redis.host}")
  42. private String host;
  43. @Value("${redis.port}")
  44. private Integer port;
  45. @Bean
  46. public Jedis jedis(){
  47. return new Jedis(host, port);
  48. }*/
  49. }

1.5.3 编辑AOP配置

在AOP中注入Redis缓存对象
15-Redis集群 京淘项目前台系统 - 图4

2.京淘前台项目搭建

2.1 京淘架构图设计

15-Redis集群 京淘项目前台系统 - 图5

2.2 JT-WEB项目创建

2.2.1 创建JT-WEB服务器

15-Redis集群 京淘项目前台系统 - 图6

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. <modelVersion>4.0.0</modelVersion>
  7. <artifactId>jt-web</artifactId>
  8. <!--打war包-->
  9. <packaging>war</packaging>
  10. <!--父级工程-->
  11. <parent>
  12. <artifactId>jt2007</artifactId>
  13. <groupId>com.jt</groupId>
  14. <version>1.0-SNAPSHOT</version>
  15. </parent>
  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. <!--4.添加maven插件-->
  25. <build>
  26. <plugins>
  27. <plugin>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-maven-plugin</artifactId>
  30. </plugin>
  31. </plugins>
  32. </build>
  33. </project>

2.2.3 导入静态资源文件

说明:将课前资料中的文件src目录导入到jt-web中
15-Redis集群 京淘项目前台系统 - 图7

2.2.4 关于主启动类说明

说明:jt-web服务器启动时会加载数据源的自动化配置,但是web服务器没有配置数据源,所以报错.
15-Redis集群 京淘项目前台系统 - 图8
启动类上添加数据源启动.
15-Redis集群 京淘项目前台系统 - 图9

2.2.5 配置工作目录

15-Redis集群 京淘项目前台系统 - 图10

2.3 域名反向代理

需求: 要求用户通过http://www.jt.com 访问localhost:8092服务器.

2.3.1 修改hosts文件

15-Redis集群 京淘项目前台系统 - 图11

2.3.2 修改Nginx配置文件

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

修改之后,重启nginx服务器
15-Redis集群 京淘项目前台系统 - 图12

2.3.3 页面效果展现

15-Redis集群 京淘项目前台系统 - 图13

2.4 谷歌浏览器禁用HTTPS

键入地址:

  1. chrome://net-internals/#hsts:

15-Redis集群 京淘项目前台系统 - 图14
修改完成之后,先清空缓存之后重启浏览器

2.5 开启后缀类型匹配

说明: 由于京东商城的商品展现时通过
url:https://item.jd.com/10021377498920.html,京东的访问是根据.html进行拦截,之后通过restFul结构动态获取商品的ID号,之后查询数据库进行的回显.所以需要对后缀进行拦截.有了如下的配置.

  1. @Configuration
  2. public class MvcConfigurer implements WebMvcConfigurer{
  3. //开启匹配后缀型配置
  4. @Override
  5. public void configurePathMatch(PathMatchConfigurer configurer) {
  6. configurer.setUseSuffixPatternMatch(true);
  7. }
  8. }

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方法.实现通用页面的跳转?

  1. package com.jt.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. @Controller
  6. @RequestMapping("/user")
  7. public class UserController {
  8. /**
  9. * 实现用户登录/注册页面的跳转
  10. * url1: http://www.jt.com/user/register.html
  11. * url2: http://www.jt.com/user/login.html
  12. */
  13. @RequestMapping("/{moduleName}")
  14. public String module(@PathVariable String moduleName){
  15. return moduleName;
  16. }
  17. }

3.2 伪静态

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

4.总结

本节内容主要熟悉redis集群的搭建,应用在springboot项目中,增强项目的功能扩展,构建项目前台系统。