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 缓存穿透
阐明: 用户高并发环境下,频繁拜访数据库中不存在的数据.导致用户申请间接拜访数据库.重大时导致数据库服务器宕机.
解决方案:
- 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