1.Redis![](https://i-blog.csdnimg.cn/blog_migrate/fd6c8cd78165fe7b10a1f553487e4eb9.png)
1.1.场景问题
缓存穿透
方案一
方案二 布隆过滤器![](https://i-blog.csdnimg.cn/blog_migrate/650f76458db7bc102cd95fea69f9e775.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cdf5652cb948dee4b398effa440ba28b.png)
又可能会产生误判,如下图:
总结:![](https://i-blog.csdnimg.cn/blog_migrate/2869f69cc98090757882770944c3c81b.png)
缓存击穿![](https://i-blog.csdnimg.cn/blog_migrate/bb192d8a14606fbf36f6a713116f5ebb.png)
互斥锁(分布式锁)![](https://i-blog.csdnimg.cn/blog_migrate/4bc78584322a05ac919e6815c74a1afe.png)
逻辑过期![](https://i-blog.csdnimg.cn/blog_migrate/e76152849ef9024730214dafd74d27c9.png)
总结:![](https://i-blog.csdnimg.cn/blog_migrate/2bf196d6d5a6d45307c8b5c5a7e1f0ef.png)
缓存雪崩![](https://i-blog.csdnimg.cn/blog_migrate/042d5584acf13b32eb9cfb6908266b9a.png)
redis和mysql 如何保证数据同步(双写一致性)![](https://i-blog.csdnimg.cn/blog_migrate/1e07f287f348f74708d2e7fa42b5172e.png)
延时双删:会有脏数据的风险![](https://i-blog.csdnimg.cn/blog_migrate/90debcbe01bcd405eca673d03d997b8f.png)
强一致性(性能较低)
分布式锁解决方案(性能低)![](https://i-blog.csdnimg.cn/blog_migrate/a15fe992f6669d9952ca5afa7d961fd8.png)
读写锁解决方案(性能较分布式锁高一点)![](https://i-blog.csdnimg.cn/blog_migrate/743fc72cb336659c25c8d4890f9899eb.png)
最终一致性(异步通知)
mq
总结![](https://i-blog.csdnimg.cn/blog_migrate/531d44623a70ba6099368eec0f9530fc.png)
Redis持久化
RDB
什么是RDB
RDB执行原理![](https://i-blog.csdnimg.cn/blog_migrate/4e2983ad8f4d7d3dff42e5755f8f7fb6.png)
AOF
什么是AOF![](https://i-blog.csdnimg.cn/blog_migrate/1ddbcf15b7d4ca5683f8be058d4e0cc1.png)
RDB和AOF对比
redis的key的过期策略(惰性删除和定期删除两种策略配合使用)![](https://i-blog.csdnimg.cn/blog_migrate/29410673f3ed2d0907ec0ed1200513a6.png)
惰性删除![](https://i-blog.csdnimg.cn/blog_migrate/b3aa1bd0eaed3d214ad63c409fb15fb1.png)
定期删除![](https://i-blog.csdnimg.cn/blog_migrate/8a09b49f49774aeab0d68f42e42f6133.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/61fd1fe0186c6521ee58d6931879deb2.png)
Redis淘汰策略
分布式锁 ![](https://i-blog.csdnimg.cn/blog_migrate/c3f6ab5d1df1a3dc9481dd25f8f41a10.png)
上图单体结构没有问题,使用synchronized,但是分布式情况下还是会有问题
上图分布式锁完美解决了这些问题
setnx![](https://i-blog.csdnimg.cn/blog_migrate/e5f0089e3367201ca3d0284b4ddc95c8.png)
redisson![](https://i-blog.csdnimg.cn/blog_migrate/71bb8d60ecd994869df62dc709ec1863.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7d6794f64e77322a2b9b55c889d22e89.png)
redisson实现分布式锁-可重入![](https://i-blog.csdnimg.cn/blog_migrate/1957abeac0f6a1bcbc0d5fff2788b952.png)
rediss能实现的分布式锁-主从一致
图解:当主节点redis宕机,哨兵会选择另一个从节点作为主节点,但是两个线程都在进行获取锁的操作,并且都获取到了,所以就失去了锁互斥的作用(解决方法如下,红锁)
替代红锁:zookeeper的cp思想能保证数据的强一致性
总结![](https://i-blog.csdnimg.cn/blog_migrate/7d07302eac550e7a1f8d2bc14da3b8fa.png)
1.2.Redis集群方式(主从复制,哨兵模式,分片集群)![](https://i-blog.csdnimg.cn/blog_migrate/0042f97a9d432b13b46d005202555d1b.png)
主从节点同步原理
主从全量同步
主从增量同步(slave重启或者后期数据变化)![](https://i-blog.csdnimg.cn/blog_migrate/eae46db3fcacd144e7f7f6dc4a63c2a6.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/6902b59a986c9350b3f0644d0ef04c53.png)
哨兵模式![](https://i-blog.csdnimg.cn/blog_migrate/1d0100b43a1355e92c19958285ca920b.png)
脑裂问题
图解:
图1,由于网络或者其他问题导致监控访问不到主节点(master),从而会指定一个从节点(slave)作为新的主节点,但是客户端(client)还在持续的向老的主节点同步数据
图2,当老节点的网络恢复,会被强制认定为从节点,从而清空自己的数据,然后去同步新的主节点的数据。导致断开时间段客户端同步的数据丢失
解决
redis中两个参数配置
总结![](https://i-blog.csdnimg.cn/blog_migrate/84bc15fcb751693bc245b750170ed6a9.png)
分片集群
分片集群结构![](https://i-blog.csdnimg.cn/blog_migrate/573bd690042422a15c8f4d4719293418.png)
分片集群结构-数据读写
总结![](https://i-blog.csdnimg.cn/blog_migrate/a191e40e2fb39671cc0c6e894a58050b.png)
Redis是单线程,为什么还这么快呢?![](https://i-blog.csdnimg.cn/blog_migrate/98c28424ced28177d9b5017c8551ca59.png)
I/O多路复用模型
用户空间和内核空间
阻塞IO![](https://i-blog.csdnimg.cn/blog_migrate/ca9ccdadf0e53a5b345ea27890aa5aa1.png)
非阻塞IO![](https://i-blog.csdnimg.cn/blog_migrate/46e79c439287cddd777536bcc8424d46.png)
IO多路复用![](https://i-blog.csdnimg.cn/blog_migrate/1b6f9a8e9f791995296baa8f25d9b196.png)
mysql
如何定位慢查询
方案一:开源工具![](https://i-blog.csdnimg.cn/blog_migrate/457cb9a4e9947a7be98c7f57e82d0426.png)
方案二:MySQL自带慢日志
总结![](https://i-blog.csdnimg.cn/blog_migrate/4da0137e7a3c2dac3b6f0e1726636387.png)
SQL语句执行很慢,如何分析
什么是索引![](https://i-blog.csdnimg.cn/blog_migrate/eee0c22fc6e222d8818b5ff1d2b0f0ec.png)
数据结构对比![](https://i-blog.csdnimg.cn/blog_migrate/4bbc29629fc212cb7bf9a35a3d0c61ae.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/3a6a046df85866b087d5c1f697a94a95.png)
什么是聚簇索引什么是非聚簇索引
或者什么是聚集索引,什么是二级所以(非聚集索引)
什么是聚簇索引![](https://i-blog.csdnimg.cn/blog_migrate/33f168e25fcdc3efb3502fba0aa1e86d.png)
什么是二级索引![](https://i-blog.csdnimg.cn/blog_migrate/0aa58e6c0aaf2ce1bc05191b7a307698.png)
回表查询![](https://i-blog.csdnimg.cn/blog_migrate/5a938618537cb8ff33c26fc6b6cbb1ce.png)
什么叫覆盖索引![](https://i-blog.csdnimg.cn/blog_migrate/016ab4b4ef916c0c2a674e4a1c472627.png)
MySQL超大分页怎么处理![](https://i-blog.csdnimg.cn/blog_migrate/bd3b3fbc076dbb5088923652681f3c33.png)
解决
索引创建的原则有哪些![](https://i-blog.csdnimg.cn/blog_migrate/049a783ef24aa99efb9a6166a385029b.png)
什么情况下索引会失效![](https://i-blog.csdnimg.cn/blog_migrate/d71c4755f65f0ca0464138ebef8f6b53.png)
SQL优化的经验
表设计优化![](https://i-blog.csdnimg.cn/blog_migrate/3138f332587e7da1f648dc58c4fdf2d9.png)
SQL语句的优化![](https://i-blog.csdnimg.cn/blog_migrate/adee8c010c0fb9c3c030612f5a3500b9.png)
主从复制、读写分离![](https://i-blog.csdnimg.cn/blog_migrate/be348ee24ccbe2d4bfb61908b6120786.png)
事物的特性是什么(ACID)![](https://i-blog.csdnimg.cn/blog_migrate/ad8a9dca9b9b29a2cf0ecff4b6e1bd10.png)
ACID详解![](https://i-blog.csdnimg.cn/blog_migrate/bafda76a37863002eb4adb96d54df359.png)
图解:A向B转1000块钱:
原子性:A减1000,B新增1000两个操作要么同时成功,要么同时失败
一致性:A减1000,B必须增加1000
隔离性:A向B的转账过程中不受其他事物的影响
持久性:事物提交之后,要把数据持久化
并发事物带来哪些问题?怎么解决这些问题?MySQL的默认隔离级别是什么?
并发事物问题![](https://i-blog.csdnimg.cn/blog_migrate/25a9cc221688dc725f7e280c4a6fdad0.png)
怎么解决并发事物问题![](https://i-blog.csdnimg.cn/blog_migrate/442b84bfbaffdf766eadad37b2cff460.png)
undo log和redo log的区别![](https://i-blog.csdnimg.cn/blog_migrate/a7c5fadc13f0357f3bd93f66aec8c970.png)
redo log ![](https://i-blog.csdnimg.cn/blog_migrate/aeff7eba1217594eebcfe844d01ae74f.png)
undo log![](https://i-blog.csdnimg.cn/blog_migrate/b04df89b53df34869eece9798f079ce8.png)
MySQL的主从原理![](https://i-blog.csdnimg.cn/blog_migrate/793ee81f84dd2b467bc2e2a799e747a5.png)
分库分表![](https://i-blog.csdnimg.cn/blog_migrate/6cb93dca62d16c27d8adcbcf2cc0d73b.png)
拆分策略
垂直分库
垂直分表![](https://i-blog.csdnimg.cn/blog_migrate/dbe8a7c44c93e5c807da5e180a17ada9.png)
水平分库![](https://i-blog.csdnimg.cn/blog_migrate/6f59e3b20bfe4dc9b87ba509ddeedb54.png)
水平分表![](https://i-blog.csdnimg.cn/blog_migrate/39fd9d671df9dd093c9fade90b4745b8.png)
分库分表带来的问题已经解决![](https://i-blog.csdnimg.cn/blog_migrate/6d20cd9f769021d514cb752f5e471558.png)
框架篇面试题
Spring中的Bean是单例的吗?
是的,但是可以设置多例
Spring中的单例Bean是线程安全的吗?
不是线程安全的
什么是AOP,项目中有使用到AOP吗?![](https://i-blog.csdnimg.cn/blog_migrate/d30f02dc347e4c9b008f4e54b07d9326.png)
Spring中事务是怎样实现的![](https://i-blog.csdnimg.cn/blog_migrate/d87af95168f01889dc000099657446bc.png)
Spring事物失效的场景又哪些
情况一:异常捕获处理 ![](https://i-blog.csdnimg.cn/blog_migrate/f6fd24b681b58d7c5c322d6a5751a867.png)
抛出检查异常![](https://i-blog.csdnimg.cn/blog_migrate/f49e66626b24159b65d21b8fa7adb1f1.png)
非public方法导致事务失效
Spring Bean的生命周期
BeanDefinition![](https://i-blog.csdnimg.cn/blog_migrate/99c1afa6b76e0087165be2adf3807a27.png)
生命周期![](https://i-blog.csdnimg.cn/blog_migrate/680e6a5ae7809f25e03cab0be9d76a6f.png)
Spring Bean的循环依赖(循环引用)
三级缓存解决循环依赖问题(都是解决set方法出现的循环依赖)
一级缓存![](https://i-blog.csdnimg.cn/blog_migrate/f884f634636da9972681476f2eeb3070.png)
一级缓存配合二级缓存解决循环依赖问题![](https://i-blog.csdnimg.cn/blog_migrate/86de027cb940fd888f1a6e61d0ae8fb1.png)
能解决大部分循环依赖的问题,但是如果A对象是一个被增强(代理)的对象,循环依赖问题依然存在
三级缓存解决循环依赖(对象工厂)![](https://i-blog.csdnimg.cn/blog_migrate/975580d9ec3da4885a34115f85bb6e15.png)
三级缓存解决不了构造方法出现的循环依赖问题![](https://i-blog.csdnimg.cn/blog_migrate/8b8f5e3c530aee3b34af42142b84001f.png)
@Lazy:延迟加载,什么时候需要对象,我再去加载对象
总结
Spring MVC执行流程
视图阶段(JSP)![](https://i-blog.csdnimg.cn/blog_migrate/b757ec8f6d3bd1f4ace9a9dbddffdb46.png)
前后端分离(接口开发,异步请求(没有ModelAndView而是JSON串))![](https://i-blog.csdnimg.cn/blog_migrate/05183ef28b8eb18a54ed350f4947de72.png)
总结
SpringBoot自动配置原理
组合注解@SpringBootApplication
@EnableAutoConfiguration![](https://i-blog.csdnimg.cn/blog_migrate/2282ea204658414899e9dad7b6f9eb0c.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/6016d12819663e34c6b378673bf58eeb.png)
Spring框架常见的注解
Spring的常见注解有哪些![](https://i-blog.csdnimg.cn/blog_migrate/fe3603b009423dbbd5fdb041eb5daae7.png)
SpringMVC常见的注解有哪些![](https://i-blog.csdnimg.cn/blog_migrate/a642d3f5c73e21e0a84a02a1b6eb5175.png)
Springboot常见注解有哪些![](https://i-blog.csdnimg.cn/blog_migrate/8ebace8fc80a001b575bac121536c15b.png)
JDK动态代理和CGLIB动态代理的区别
1、JDK 动态代理只能对实现了接口的类生成代理,而不能针对类。
2、CGLIB 是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法最好不要声明成 final。
@Autowired和@Resource的区别
@Autowired 是Spring提供的,@Resource 是J2EE提供的。
@Autowired只按type装配,@Resource默认是按name装配。
Mybatis
Mybatis执行流程 ![](https://i-blog.csdnimg.cn/blog_migrate/2223360616d42dc4e329e999ebb32aac.png)
Mybatis是否支持延迟加载
什么是延时加载![](https://i-blog.csdnimg.cn/blog_migrate/c7d58137216ae02137d707ea7ca17603.png)
延迟加载的原理![](https://i-blog.csdnimg.cn/blog_migrate/f30a17e68b6620f53e961d24631e779c.png)
MyBatis的一级缓存和二级缓存![](https://i-blog.csdnimg.cn/blog_migrate/ef42e2aec4b452f844225031ca02acb3.png)
一级缓存![](https://i-blog.csdnimg.cn/blog_migrate/af5899534ae083482ad0c02e8567e1c2.png)
二级缓存![](https://i-blog.csdnimg.cn/blog_migrate/d5335d9a1c26e92a36de38be0f15e5af.png)
SpringCloud
SpringCloud五大组件有哪些
注册中心
Nacos和eureka的区别![](https://i-blog.csdnimg.cn/blog_migrate/0d22d9fbcf1b96d6e118cdb2d10ac73c.png)
负载均衡(Ribbon)
Ribbon的工作流程![](https://i-blog.csdnimg.cn/blog_migrate/aa21dd6d63fda36bd9037b8c59ad6939.png)
负载均衡策略有哪些![](https://i-blog.csdnimg.cn/blog_migrate/70fc0c6c0b064ffd948799ecbcfe0353.png)
自定义负载均衡策略如何实现![](https://i-blog.csdnimg.cn/blog_migrate/6787d1a6c4fa10e24c583676d26d022d.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/2509ae12e663b760fbc321aea91432c2.png)
什么是服务雪崩,怎么解决这个问题![](https://i-blog.csdnimg.cn/blog_migrate/515dbebeb817d019b041fce8132744f9.png)
解决:熔断降级 Hystix 限流(只能预防)
服务降级![](https://i-blog.csdnimg.cn/blog_migrate/e9c9d9074a0d97f2dcb5ba85b1b05043.png)
服务熔断![](https://i-blog.csdnimg.cn/blog_migrate/fdf3f17700f6530b38d21dfd4d6d19ff.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/5404eea94fbef942686df17ba30eaac9.png)
微服务是怎么监控的 ![](https://i-blog.csdnimg.cn/blog_migrate/ff6172e23194f7685ce69d04f06d2e4d.png)
项目中限流怎么做的![](https://i-blog.csdnimg.cn/blog_migrate/51ddf32bb7d752a9c8ec409831b07c92.png)
Nginx限流
控制速率(突发流量)
漏桶算法![](https://i-blog.csdnimg.cn/blog_migrate/fd3840183825746b768b8b3b53304ec2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f2283591fd51cd86f8ba92fa702c6d61.png)
控制并发连接数![](https://i-blog.csdnimg.cn/blog_migrate/1e052a433c4e40b9e1d03e3d63e63470.png)
网关限流
令牌桶算法![](https://i-blog.csdnimg.cn/blog_migrate/74050c3848240f1c5f61dca4cd277cef.png)
CAP和BASE
CPA![](https://i-blog.csdnimg.cn/blog_migrate/a1b72183cf2ffda6b51ed62cbaada148.png)
结论:![](https://i-blog.csdnimg.cn/blog_migrate/c8100287d90759ed5c5dfd575ed8d956.png)
BASE理论![](https://i-blog.csdnimg.cn/blog_migrate/6f407316e420cf89c632ad43fc15296e.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/3b800f364e235641f836601c6af964fe.png)
分布式事务解决方案 (MQ)
异步,性能好,保证事务的最终一致性
分布式服务接口幂等性![](https://i-blog.csdnimg.cn/blog_migrate/43e349a002fbedb1d17cd1f4a238ba8b.png)
接口幂等![](https://i-blog.csdnimg.cn/blog_migrate/f80c65ecf0bd9c1728103e24a2d1690c.png)
token + redis解决幂等![](https://i-blog.csdnimg.cn/blog_migrate/3ff943f72f691ba4d5e5e6e80f575e65.png)
分布式锁解决幂等![](https://i-blog.csdnimg.cn/blog_migrate/8992fe6d988029bd7a11fbbdddfa560f.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/fb031cdc453918e21c762263a7a52796.png)
分布式任务调度(xxl-job)
RabbitMQ
RabbitMQ五种消息类型
一、基本消息模型(一对一)
基本消息模型就是:
一个生产者丶默认交换机丶一个队列丶一个消费者。
二、work消息模型
work消息模型就是:
一个生产者丶默认交换机丶一个队列丶多个消费者。
三丶fanout广播模式/发布/订阅模式
fanout消息模型就是:
多个消费者,每一个消费这都有自己的队列,每个队列都绑定到交换机
生产者发送消息到交换机-交换机发送到哪个队列
四丶Routing路由模式(direct)
Routing路由模式模型就是:
在某种场景下,我们希望不同的消息被不同的队列消费
这个时候我们就要用到direct类型的exchange
生产者向交换机发送消息—交换机根据路由key发送给队列-队列的消费者接收消息
五丶Topics(主题模型)
Routing路由模式模型就是:
Topics模式和direct路由模式类似,
区别在于Topic类型的交换机可以匹配通配符
符号(通配符):#表示匹配一个或者多个词
*表示匹配一个词
RabbitMQ如何保证消息不丢失![](https://i-blog.csdnimg.cn/blog_migrate/99423f898661976aa26ec968e40fb597.png)
生产者往路由发的过程中消息丢失(生产者确认机制)![](https://i-blog.csdnimg.cn/blog_migrate/01c368abcc1e17fbf87634028d0c5200.png)
MQ内部消息丢失![](https://i-blog.csdnimg.cn/blog_migrate/37dcaa4a9db852821c9ad269116ee85c.png)
消费者消息丢失
总结![](https://i-blog.csdnimg.cn/blog_migrate/67284a6827b7f12d30e53b7c2fc7b28a.png)
RabbitMQ重复消费消息
RabbitMQ中的死信交换机(延迟队列= 死信队列+TTL)
死信交换机![](https://i-blog.csdnimg.cn/blog_migrate/51c2a639cb25cc5b57379637a36c8715.png)
TTL![](https://i-blog.csdnimg.cn/blog_migrate/f350b432e83bb16c7077126a1d0ac96e.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/1aeafbe73580af9c6c13707e274b8107.png)
RabbitMQ消息堆积怎么处理
解决![](https://i-blog.csdnimg.cn/blog_migrate/d7c6e27ffee34b63c5395960977b7de2.png)
惰性队列,扩大容积![](https://i-blog.csdnimg.cn/blog_migrate/0b8e9adaad0be9016cb050b407b69a28.png)
RabbitMQ如何保证消息顺序消费
总结![](https://i-blog.csdnimg.cn/blog_migrate/1268bd1dfb870238f70818f8363c4c29.png)
RabbitMQ集群
普通集群![](https://i-blog.csdnimg.cn/blog_migrate/27b54752be62d60f8084d191acf7047c.png)
镜像集群![](https://i-blog.csdnimg.cn/blog_migrate/78297890f7e7be9f090e3457c63e93c2.png)
缺点:数据同步过程中,节点宕机,导致数据丢失(情况很少见)
仲裁队列![](https://i-blog.csdnimg.cn/blog_migrate/0296a608ee74592399983c4a61c1cd96.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/58711fe84c4b002ed1a220876728ba6b.png)
集合
数据结构
算法复杂度分析
评估代码总计时:
图解:
3n:i<=n,i++,sum=sum+1这三行代码。n执行多少次,这三行代码就要执行多少次
3:int sum=0,int i =1,return sum这三行固定代码
图解:O是指时间,n是指代码循环次数
常见复杂度表示形式![](https://i-blog.csdnimg.cn/blog_migrate/e608c98df33147dbdaac4eefe9a2525a.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/5428a63aef6f4a9c64bba3c19acb1fd0.png)
ArrayList源码分析
ArrayList底层的实现原理是什么
new ArrayList(10)中的list扩容几次![](https://i-blog.csdnimg.cn/blog_migrate/db895337738a0776d061ce24e4d399cc.png)
如何实现数组和List之间的转换![](https://i-blog.csdnimg.cn/blog_migrate/68bc3f44cd3f358e2b505ec3d9c044f2.png)
链表
单向链表![](https://i-blog.csdnimg.cn/blog_migrate/27083892f2b56f2b74709d5798b13f2f.png)
双向链表![](https://i-blog.csdnimg.cn/blog_migrate/22da06da09e7f926ff61b6e9cd48be1a.png)
总结![](https://i-blog.csdnimg.cn/blog_migrate/1efe183614718fa727c9e1aba4fa96f6.png)
ArrayList和LinkedList的区别![](https://i-blog.csdnimg.cn/blog_migrate/742cae1fc5c71e06966e55f6d2e0538d.png)
二叉树![](https://i-blog.csdnimg.cn/blog_migrate/544c754a1d3edaae28a0a4b11740079d.png)
二叉搜索树![](https://i-blog.csdnimg.cn/blog_migrate/2f0e8c3bf6ea1b5a9b2b389c61113da7.png)
红黑树![](https://i-blog.csdnimg.cn/blog_migrate/827838dc85d0a898ff1945fe8ed182f2.png)
散列表![](https://i-blog.csdnimg.cn/blog_migrate/d95a55d24bddbb738f2b1ff718c60423.png)
HashMap底层原理![](https://i-blog.csdnimg.cn/blog_migrate/803603b01b27c8d3e93b4cd1ee8f3ad8.png)
HashMapJDK1.7和1.8有什么区别