首先了解域名: 域名是以英文符号“."来隔开,顶级域名是固定的,如.com/.cn/.net等等。在购买域名的时候选择自己想要的顶级域名,然后再从顶级域名左边输入自己想要注册的二级域名,组成一个完整的域名。
跨域问题来自于javaScript 的同源测略, 只有相同主机+端口+ 协议的资源, 才能够互相访问
但为什么JavaScript会有这样的策略呢,: 因为JavaScript是可以直接操纵web文档资源的, 如果不加以限制, 那我登陆A网站, 却可以获取访问 B网站的数据, 那就会很混乱, 没有安全可言
有两种解决方案,
一种是被调用方解决问题
-
在响应头中添加字段, 告诉浏览器支持跨域访问 Access-Control-Allow-Origin 跨域访问的解决方案的安全基础是基于"JavaScript无法控制该HTTP头"
-
httpClient内部转发, 服务器执行完传递过来的请求返回结果, 效率低
-
nginx搭建企业级接口网关方式 统一通过公司的域名访问转接但具体项目名
另一种是在调用方解决问题
-
jsonp 只支持get请求不支持post请求 dataType : "jsonp",//数据类型为jsonp 一般服务端返回都是json数据, 但是jsonp返回回来的是javasrcipt代码, 动态加载<script>标签的src属性, 参数通过url方式传递所以只能是get方法
redis持久化 AOF 持久化, 保存每一条执行语句
RDB 持久化, 保存在硬盘上
缓存雪崩是同一时刻大量key值失效, 大量请求到服务器db造成死机, 解决办法是 key失效时间设置成随机值
缓存穿透, 访问redis 和数据库中都没有的数据, 解决: 做参数校验, 不合理的id请求直接return 或者直接设置此key的值为null
缓存击穿, 热点key值永久不过期
但是你没对分页参数的大小做限制,调用的人万一一口气查 Integer.MAX_VALUE 一次请求就要你几秒,多几个并发你不就挂了么?是公司同事调用还好大不了发现了改掉,但是如果是黑客或者竞争对手呢?在你双十一当天就调你这个接口会发生什么,就不用我说了吧。这是之前的Leader跟我说的,我觉得大家也都应该了解下
熔断:当这个接口不可用了,然后下次掉服务的时候就不会再访问到这个节点了,然后后台还有一个程序,去实时监控这个服务节点,等他好了,你又可以访问了。简单理解就是——比方说排队买票,有3个窗口,其中一个窗口与排了很多人,然后那个售票员有事走开了,那群人不可能一直等,就去别的窗口买了,然后那个售票员回来了,会通知买票的人,这里可以买票了。
降级:简单理解就是——比方说返回很多人再买票,还有人在问路,或者在咨询问题,那些问路的,咨询问题的就不处理了,只处理买票。
布隆过滤器: 布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
Bloom Filter 原理
布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。
分布式锁 : setnx 加锁..key值不存在 解锁是设置过期时间或者删除 为了防止忘记解锁, 好像可以设置成一条语句
RDB的原理是什么?
你给出两个词汇就可以了,fork和cow。fork是指redis通过创建子进程来进行RDB操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
Memcache与Redis的区别都有哪些?
1)、存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
Redis有部份存在硬盘上,这样能保证数据的持久性。
2)、数据支持类型
Memcache对数据类型支持相对简单。
Redis有复杂的数据类型。
3)、使用底层模型不同
它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4),value大小
redis最大可以达到1GB,而memcache只有1MB
redis采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,
那他是单线程的,我们现在服务器都是多核的,那不是很浪费?
是的他是单线程的,但是,我们可以通过在单机开多个Redis实例嘛。
既然提到了单机会有瓶颈,那你们是怎么解决这个瓶颈的?
我们用到了集群的部署方式也就是Redis cluster,并且是主从同步读写分离,类似Mysql的主从同步,Redis cluster 支撑 N 个 Redis master node,每个master node都可以挂载多个 slave node。
这样整个 Redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点,每个 master 节点就能存放更多的数据了
主从数据一致, 启动一个slave时候, 第一次连接master, 会触发一个全量复制, 启动一个线程专门生成RDB文件, 给slave
但是你让这个master机器去写,数据同步给别的slave机器,他们都拿去读,分发掉大量的请求那是不是好很多,而且扩容的时候还可以轻松实现水平扩容。