一、说说如何实现分布式锁
常见的实现分布式锁有两种方式
基于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", "*");