12.13面试

面试题
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
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
    • 支持路由键,支持*号
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流放Oo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值