面试题
1.集合中的hashmap 底层原理 扩容时…
哈希表
本质上就是一个数组,通过哈希函数计算出一个唯一的下标,然后使用链表解决hash冲突,如果有多个元素对应一个下标就通过链表连接起来
0.75扩容因子,重新计算hashcode将哈希表打散,提高hashcode的查询效率
数组+链表+红黑树
通过哈希函数对任意一个Key生成一个数组下标hash code
如果多个key对应一个数组下标,就使用链表,JDK1.7是后插入的元素直接放在链表首部,JDK1.8是后插入的元素放在链表尾部
当链表长度大于8的时候转化为红黑树形式保存
默认初始容量为16,哈希因子为0.75
hashmap的扩容分为三种情况
1.默认构造方法初始化
扩容容量默认为16,最大元素数为12
2.指定初始容量构造方法初始化
和你指定有关
3.不是第一次扩容
每次都扩容为原来的两倍
注:HashMap是先插入数据在进行扩容,但是如果是第一次扩容则是先扩容在插入数据
2.缓存穿透
当用户循环访问不存在的数据的时候,会造成缓存中间件失效,导致每次查询都需要去数据库查询
解决方案
1.布隆过滤:
将所有可能存在的数据哈希存储到一个足够大的bitmap中,则每次查询就先去bitmap中查询,不存在的数据就会被拦截掉
2.缓存空对象,将null变成一个值
如果一个查询返回的数据为空,就将空结果缓存,但是过期时间会很短,最长五分钟左右
但是会有两个问题
a)空值缓存导致内存空间浪费,虽然过期时间很短
b)缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
缓存雪崩
缓存集中在一段时间内失效,发生缓存穿透,所有的查询都落在的数据库上造成了缓存雪崩
并没有完美的解决方案,只可能通过分析用户行为,散列缓存失效时间
大多数系统设计者考虑加锁或者队列方式保证缓存单进程写,进而避免失效时并发请求全部落到了底层存储系统上
3.Dubbo,配置?提供者配什么?消费者配什么
Dubbo配置
提供者需要配置
1.提供者名称
2.ZooKeeper暴露服务的地址
3.Dubbo协议以及端口20880
3.timeout连接超时时间
dubbo:
application:
name: service_provider
registry:
address: zookeeper://192.168.184.130:2181
protocol:
port: 20880
name: dubbo
consumer:
timeout: 60
消费者需要配置
1.消费者名称
2.Zookeeper注册中心暴露服务的地址
3.timeout连接超时时间
4.check: false解耦合
dubbo:
application:
name: shop_back_consumer
registry:
address: zookeeper://192.168.184.130:2181
check: false
timeout: 60
1.首先得配置后台启动设置为yes
2.根据自己的要求和应用场景,配置持久化方案,如果是单纯的作为数据缓存服务器可以关闭RDB和AOF
3.配置内存回收策略
noeviction内存溢出就拒绝访问
lru最近最少使用
ttl失效时间最短
random随机
allkey所有的key都参加
volitail设置了失效时间的才参加
注:回收策略是一种近视算法,默认为5
4.redis,配置文件应该配什么?redis索引
配置文件直接配置host
spring:
redis:
host: 192.168.184.130
redis索引?
redis并不直接支持索引,需要通过自己来维护。
对于非范围唯一索引,我们可以简单的把索引也存成KV对,v保存主key即可,
而范围检索,或者非唯一索引,则要使用redis 的 zset来实现。
5.mysql数据库,mysql读写分离中间件,类似于mycat,有哪些,原理?
mysql读写分离后,会出现一个问题,我们程序的数据源不知该配置哪个数据库,因此我们需要使用读写分离中间件,常用的有mycat等…
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
6.mysql优化?方式
mysql优化方式
1.数据类型优化,选择尽量简单合适的数据类型,比如性别使用tiny int unsigned最为合适
2.索引优化
索引优化是mysql优化操作性空间最大的一个优化方式,主要针对我们的sql语句进行优化,首先可以开启慢日志先找出超出阈值的mysql语句,然后通过expire观察其执行计划,通过sql_type,index,extra,rows等字段对sql语句进行优化,比如说type类型一般都要达到range级别,rows可能操作的行数越少越好,如果实在不行的话只能考虑分库分表了
索引优化里面我们尽量使用覆盖索引,能够大大的提高sql语句的性能,避免了聚簇索引的使用
3.分库分表
根据数据的某些范围进行分库分表
比如日志数据可以根据天数月份区分
7.ZooKeeper,注册中心下面有哪些数据?在linux中的一些节点
ZooKeeper注册中心下面有
服务注册的地址,注册中心的配置信息等
- /dubbo节点,是dubbot在ZooKeeper上创建的根节点
- 服务节点,代表Dubbo的一个服务
- providers服务提供者的根节点
- 具体的提供者地址1
- 具体的提供者地址2
- consumers,服务消费者的根节点
- 具体的消费者地址1
- 具体的消费者地址2
- configurations配置文件信息
- routers
- providers服务提供者的根节点
- 服务节点,代表Dubbo的一个服务
8. Linux基本命令
- 文件查找
- find
- !(not) -a(and) -o(or)
- 查看文件
- ls -a -l
- 查看内容
- cat
- less
- more
- head
- tail
- 查看日志最后n行
- tail -f 10(n)
- 查看内存
- top
PID:当前运行进程的ID
USER:进程属主
PR:每个进程的优先级别
NInice:反应一个进程“优先级”状态的值,其取值范围是-20至19,一
共40个级别。这个值越小,表示进程”优先级”越高,而值越
大“优先级”越低。一般会把nice值叫做静态优先级
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示
该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
9.SpringBoot底层源码(重点)
10.rabbitmq消息队列,6中工作模式
- 1.生产者消费者模式
- 一个提供者,一个消费者,一个消息队列
- 2.工作模式
- 一个提供者,一个消息队列,多个消费者
- 3.最常见的
- 一个提供者,一个路由,多个消息队列,多个消费者
- 4.根据路由的类型分类 fanout
- 不支持路由键
- 5.direct
- 支持指定路由键,不支持*号
- 6.topic
- 支持路由键,支持*号