小滴课堂后端面试题(1)~持续更新中

一、说说如何实现分布式锁

常见的实现分布式锁有两种方式

基于redis实现分布式锁:核心思想是获取锁的时候,使用setnx加锁,并使用expire命令为锁添

加一个超时时间,超过该时间则自动释放锁

基于zookeeper的实现方式,核心思想在zk中是为每个线程生成一个有序的临时节点,为确保有

序性,在排序一次全部节点,获取全部节点,每个线程判断自己是否最小,如果是的话,获得

锁,执行操作,操作完删除自身节点。如果不是第一个的节点则监听它的前一个节点,当它的前

一个节点被删除时,则它会获得锁,以此类推。特别注意,这里新建节点必须要是临时节点,确

保获取到锁的客户端宕机也不影响其他客户端获取锁

使用redis的优点是性能高,缺点是特定情况下master宕机,数据没完成同步,其他客户端可以继

续获取到锁

使用zk的优点是能保证一致性,缺点是频繁读写,性能较差

二、域名配置中cname和a记录的作用是

一个http请求基本流程

客户端通过发起域名资源请求 -> DNS解析获得IP -> 寻找服务器获得资源

域名和ip的关系,DNS作用

DNS:Domain Name Server 域名服务器 域名虽然便于人们记忆,但网络中的计算机之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS 就是进行域名解析的服务器

什么是cname和a记录

  • a记录

用户可以在此设置域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器

(也叫ip指向域名配置)

  • cname

别名指向,可以为一个主机设置别名。比如设置open1024.com,用来指向一个主机

xdclass.net 那么以后就可以用open1024.com来代替访问 xdclass.net 了

www.xdclass.net --> xdclass.net

三、说说什么时候会产生死锁,以及程序中发生死锁如何排查

要产生死锁,必须满足以下几个条件

1、资源互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

4、循环等待,即存在一个等待队列:A占有B的资源,B占有A的资源这样就形成了一个等待环路。

程序发生死锁时,可以使用jstack命令查看线程快照,可以看到线程的状态是死锁状态

四、说下分布式缓存和本地缓存的区别,如何选择

什么是缓存

1、程序经常要调用的对象存在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化

设备中查询,主要就是提高性能

2、DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存

分布式缓存

1、与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用,多个应用可直接的共享缓存

2、常见的分布式缓存 Redis、Memcached等

本地缓存

1、和业务程序一起的缓存,例如myabtis的一级或者二级缓存,本地缓存自然是最快的,但是不

能在多个节点共享

2、常见的本地缓存:ssm基础课程myabtis 一级缓存、mybatis二级缓存;框架本身的缓存;

redis本地单机服务;ehchche;guava cache、Caffffeine等

选择本地缓存和分布式缓存

1、和业务数据结合去选择

2、高并发项目里面一般都是有本地缓存和分布式缓存共同存在的

五、为什么会出现跨域,有什么常见的解决方案

跨域

浏览器同源策略 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行 这个政策。 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网 页"同源"。所谓"同源"指的是"三个相同"

协议相同 http https 
域名相同 www.xdclass.net 
端口相同 80 81 

一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 
浏览器控制台跨域提示: 

No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'null' is therefore not allowed access.
复制代码

解决方法

JSONP

页面这层再包装一层服务,目前最多就是nodejs

Http响应头配置允许跨域

  • nginx代理服务器
  • 后端程序代码配置
程序代码中处理 SpringBoot 通过拦截器配置 
//表示接受任意域名的请求,也可以指定域名 
response.setHeader("Access-Control-Allow-Origin", 
request.getHeader("origin")); 

//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true"); 
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"); 
response.setHeader("Access-Control-Allow-Headers", "*");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值