前言
在java学习中,虽然底层原理并不影响你的日常开发,但是却是面试时要重点关注的要点,而且底层原理可以说是和我们开发息息相关。那么废话不多说,直接上题。
一、redis的持久化机制
redis是一个key-value的内存非关系型数据库,因为它的数据是保存在内存中的,所以这也是一般开发时使用它作为缓存的原因。而因为数据是保存在内存中的,所以当redis重启的时候,之前的数据就会丢失。那么来聊一聊它的持久化机制。
1、RDB持久化方式:
在指定的时间间隔之内,将内存中的数据集快照写入磁盘。对子进程fork,之后dump。
2、AOF快照方式:
将redeis每次写的操作都记录到日志中,重启redis时,会将日志中的操作恢复。
二、hashMap的底层原理
这里简单说一下put和get方法好了:
put:首先判断键值对数组table是否为空,为空则以默认初始化容量resize。根据键值对key获得hash得到数组下标位置,判断处理hash冲突是以红黑树还是链表方式进行处理。
链表方式:下标为空则添加,下标有值则和数组上的每个链表进行equal。false则添加到单向链表的末尾,true则覆盖key值所在位置。
红黑树方式:使用treeMap,左节点值小于或等于根节点,右节点大于或等于根节点。
hashMap的默认初始容量是16,负载因子是0.75,扩容机制是*2。当数组上的链表超过8时,转换成红黑树,之后当小于6时又变回链表。
三、Nginx如何做负载均衡、常见的负载均衡算法有哪些?
nginx是http反向代理服务器,因为它具有很好的处理静态资源的效率所以一般用nginx对客户端做反向代理。简单来说就是客户端不能直接访问真实的内部服务器,通过代理方式转发到内部。
那么常见的负载均衡算法:
轮询:每个请求按时间顺序逐一分配到不同的后端服务。如果某个后台服务故障,自动剔除,使用户访问不受影响。
weight(轮询权值):weight权重的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
ip_hash:每个请求按访问ip的hash结果分配。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
url_hash:根据请求的url的hash值将请求分到不同的机器中。当后台服务器为缓存的时候效率高。
fair:根据后台响应时间来分发请求,响应时间短的分发的请求多。
总结
每天三条面试题,希望大家学习进步,遇到什么困难也迎刃而解。并且保持一颗进步向上的心。