乐趣区

关于缓存:京淘项目Day15

cgb2010- 京淘我的项目 Day15

1.Redis 集群

具体参见笔记

1.1 Redis 集群宕机条件

宕机条件: Redis 中的主机缺失时, 并且没有从机替补,Redis 内存数据失落. 这时 Redis 集群解体了.

问题 1: 6 台 redis 3 主 3 从 (1 主 1 从分为 3 组). 至多 Redis 宕机几台集群解体. 至多 2 台 集群解体.
问题 2: 9 台 redis 3 主 6 从(1 主 2 从分为 3 组). 至多宕机几台 Redis 集群解体. 至多 5 台 集群解体

集群宕机的条件: 当主机的数量不能保障时集群解体.
特点: 集群中如果主机宕机, 那么从机能够持续提供服务,
当主机中没有从机时, 则向其它主机借用多余的从机. 持续提供服务. 如果主机宕机时没有从机可用, 则集群解体.
答案:9 个 redis 节点, 节点宕机 5 - 7 次时集群才解体.

1.2 Redis 分区算法

1.2.1 集群测试入门案例

1.2.2 hash 槽算法

Hash 槽算法 分区算法.
阐明: RedisCluster 采纳此分区,所有的键依据哈希函数 (CRC16[key]%16384) 映射到 0-16383 槽内,共 16384 个槽位,每个节点保护局部槽及槽所映射的键值数据. 依据主节点的个数, 平衡划分区间.
算法: 哈希函数: Hash()=CRC16[key]%16384

当向 redis 集群中插入数据时, 首先将 key 进行计算. 之后将计算结果匹配到具体的某一个槽的区间内, 之后再将数据 set 到治理该槽的节点中.

1.3 对于算法面试题

1.3.1 对于集群 / 分片算法阐明

问题: 一个数据很大. 一个槽位不够存怎么办??? 谬误?? A 逻辑谬误 B. 有情理
解答:
1. 一致性 hash 算法 hash(key) 43 亿 依照顺时针方向找到最近的节点 进行 set 操作.
2.Hash 槽算法 crc16(key)%16384 (0-16383) 计算的后果归哪个节点治理, 则将数据保留到节点中.
外围常识: 一致性 hash 算法 /hash 槽算法 都是用来确定 数据归谁治理的问题. 最终的数据都会存储到 node 节点中.

1.3.2 面试题 1

问: Redis 集群中一共能够存储 16384 个数据? A 对 B 错 为什么???
小明猜测: 因为 redis 中共有 16384 个槽位, 所以每个槽位存储一个 key. 那么不就是 16384 个 key 吗??
答案: 谬误
起因: Redis 集群中的确有 16384 个槽位. 然而这些槽位是用来 划分数据归谁治理的. 不是用来存储数据的. 并且依据 hash 计算的规定肯能呈现碰撞的问题. 比方
hash(key1)%16384=3000
hash(key2)%16384=3000

 ` 阐明 key1 和 key2 归同一个 node 治理.
                        node.set(key1,value1);
                        node.set(key2,value2);
        因为槽位只是用来辨别数据, 数据到底能存储多少个实现由 redis 内存决定.` 



1.3.3 面试题 2

问题: 为 Redis 集群中最多有多少台主机?? 16384 台 主机

1.4 缓存相干面试题

1.4.1 缓存穿透

阐明: 用户高并发环境下,频繁拜访数据库中不存在的数据 . 导致用户申请间接拜访数据库. 重大时导致数据库服务器宕机.

解决方案:

  1. IP 限流操作 API 网关中设置 设定用户拜访的下限 规定每个 IP 单位工夫内只能发送 N 次申请. 3-5

治标不治本 (IP 代理服务器: 1 分钟变动一个 IP)

`2. 布隆过滤器



1.4.1.1 布隆过滤器

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器能够用于检索一个元素是否在一个汇合中。它的长处是空间效率和查问工夫都比个别的算法要好的多,毛病是有肯定的误识别率和删除艰难。

外围知识点:
用法: 由二进制向量,hash 函数组合.
作用: 判断一个元素是否存在于汇合中 .
长处: 占用空间更小 / 效率更高
毛病: 有肯定的误判率(hash 碰撞), 删除艰难.

1.4.1.2 长处阐明

问题: 如果有 1000 万的热点数据须要保留到 redis 缓存中. 问: 是否可行?
计算: 1000 万的数据如果须要存储 大概须要 20G 左右的空间…
常识铺垫:
1 Byte = 8 bit (二进制)。
1KB (Kilobyte 千)=1024B,
1MB (Megabyte 兆)=1024KB,
1GB (Gigabyte 吉)=1024MB,
1TB (Trillionbyte 太)=1024GB,

转变: 假如能够通过 0/ 1 的形式, 判断数据是否存在. 同时占用的空间较小. 那么这个问题就解决了.
计算 2: 假如 1 个数据占用 1 个 bit 问占用空间多大? 1.19M

1.4.1.3 布隆过滤器利用场景

阐明: 当用户查问服务器时, 首先查问布隆过滤器, 如果查问存在该数据, 则执行后续的流程,
如果查问没有该数据, 则间接返回. 无需执行后续流程.

1.4.1.4 布隆过滤器算法介绍

1.4.1.5 对于布隆过滤器优化阐明

1. 依据 hash 准则 数据存在 hash 碰撞的概率. 则应用布隆过滤器容器造成误判. 如何解决?

1.4.1.6 优化 hash 碰撞概率 - 减少二进制向量

1.4.1.7 优化 hash 碰撞概率 - 减少 hash 函数个数

1.4.1.8 对于布隆在我的项目中应用过程

1.4.2 缓存击穿

阐明: 在高并发环境下 某个热点数据因为删除 / 超时导致该数据在缓存中生效 . 这时有大量的申请间接拜访数据库.
导致数据库宕机.

如何优化:
1. 定期更新热点数据的超时工夫.
2. 减少多级缓存机制.

1.4.3 缓存雪崩

概念: 因为Redis 中大量的内存数据生效. 导致用户拜访缓存的命中率太低. 大量的申请间接拜访数据库. 导致数据库宕机.

命令: flushDB/flushAll 这样的命令慎用…
解决方案:
1. 设定不同的超时工夫 / 动静更新超时工夫
2. 设定多级缓存.

1.5 SpringBoot 整合 Redis 集群

1.5.1 编辑 pro 配置文件

`# 筹备 redis 节点信息
#redis.host=192.168.126.129
#redis.port=6379

# 筹备 3 台 redis
#redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

#筹备 6 个 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 编辑配置类

1.5.3 编辑 CacheAOP

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">
    <parent>
        <artifactId>jt</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>jt-web</artifactId>
    <!-- 因为增加的是动静 web 资源所以打包临时用 war-->
    <packaging>war</packaging>

    <!-- 增加依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.jt</groupId>
            <artifactId>jt-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!-- 增加插件 -->
    <!-- 增加插件 有 main 办法时 须要增加插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>` 

2.2.3 导入配置文件

2.2.4 编辑启动配置项

2.2.5 页面成果展示

2.2.6 对于主启动中注解阐明

阐明: 该启动项中的配置 示意 springboot 启动时, 不会加载数据源相干的配置.
起因: springBoot 容器中有开箱即用的规定. 然而前端我的项目不须要应用数据源. 所以通过如下的配置, 能够失常的启动我的项目

2.3 增加 nginx 配置

2.3.1 配置要求

用户通过 http://www.jt.com 的形式拜访 http://localhost:8092 服务器.

2.3.2 编辑 Hosts 文件

2.3.3 编辑 Nginx 配置文件

`# 配置京淘前台服务器
    server {
        listen 80;
        server_name www.jt.com;

        location / {proxy_pass http://localhost:8092;}
    }

2.3.4 成果展示

2.3.5 对于谷歌浏览器 Https 协定报错阐明

1). 对于 Http/https 之间的关系

2). 解决策略
1. 浏览器中键入: chrome://net-internals/#hsts:

3 预习

1. 预习什么是跨域
2. 什么是同源策略
3. 什么是 JSONP
退出移动版