后台开发知识点总结(六)大型网站架构

什么叫正向代理?什么叫反向代理?

正向代理是一种客户端主动使用的代理方式。它需要用户在客户端设置,对服务器透明。反向代理是一种服务器端使用的代理方式,它不需要用户在客户端进行设置,对客户端透明。譬如翻墙软件就是一种正向代理,而nginx是典型的反向代理,可以为服务器提供缓冲。

反向代理服务器与负载均衡服务器的区别?

反向代理服务器将静态资源存储到服务器上,以便用户能够更快地获得资源。负载均衡服务器之转发用户请求,不存储资源。

Redis的可排序集与集合的区别是什么?是怎么实现的?

可排序集在排序上拥有更高的效率(集合排序的时间复杂度为O),可排序集是借助跳表实现的。

什么是跳表?

跳表是一种可以用来替代树的数据结构,它的效率和AVL树不相上下。跳表由很多层构成,每一层都是一个有序链表。最下层包含了链表的所有元素,在上层出现的元素,下层还会出现。跳表使用上层来作为下层的索引,每个节点包含两个指针,一个指向后一个节点,一个指向下面的节点。跳表的空间复杂度期望为2n,其查找、插入和删除的时间复杂度均为O(log(n))。

跳表如何进行插入和删除?

跳表的插入比较复杂,首先要确定插入的元素所在的层数(用丢硬币的方法,丢到正面继续丢,丢到反面则停止。抛硬币的次数就是层数),如果层数超过当前层数,则在最上面添加新的层。跳表的删除比较简单,直接按照链表的方式删除即可。

介绍一下你所知道的缓存算法?

1.LRU 和 LFU:
LRU(按照上次使用时间排序)、LFU(按照使用频率排序)、LRU2(按照倒数第二次使用时间排序)。
2.LRU 升级版:
2Q(Double Queues,两个LRU队列,比例1:3,当对象被第二次访问,移入第二级队列),ARC(adaptive Replacement cache,LFU 的2Q版,两个队列,一个是最近被访问一次,另一个是最近被访问两次)。
3.基于 FIFO:
FIFO(先进先出)、Second Chance(带标记位的FIFO)、Clock(环形队列的Second Chance)。
4.基于时间:
绝对时间周期(相同寿命)、相对时间周期(相同时刻)、从上次访问开始算起的时间周期
5.移除最常用:
MRU(移除最近最多访问元素,因为找出最近最少被访问的时间复杂度高)。

Redis的优势在于哪?

首先,Redis支持多种数据类型(字符串、列表、哈希、集合、有序集合)以及它们的原子性操作。另外,Redis支持数据的持久化和 Master-Slave 模式的数据备份。

负载均衡服务器的三大特性?

负载均衡算法(轮询、最小连接数、最快响应时间、比率、优先权、哈希、基于策略(自定义)、基于数据包)、健康检查(Ping、TCP、UDP、HTTP、FTP、DNS等,七层网络中的三到七层)和会话保持(同一用户访问到相同服务器)。

线程的状态有几种?

新建、就绪、运行、阻塞、死亡。

终止线程有几种方式?

通过标志位控制退出(while(volatileexit))、通过stop的方法来终止线程(thread.stop())、通过中断的方法终止进程(thread.interuped())。

什么叫缓存穿透?怎么预防?

缓存穿透指的是访问一个不存在的数据,由于这样缓存不可能命中,缓存就会去数据库中直接读这个数据,给数据库造成压力。预防的方式是使用一个布隆过滤器,即把数据库中所有可能的值 hash 到一个足够大的 bItmap 上去,请求到达时先用过滤器检测是否由该数据,如果有再去缓存中读取。
不同缓存系统中的缓存算法分别是怎样的?
Redis2.6/ Encache/ Hazelcast:随机找3条/ 8条/ 25条,删去其中空闲时间最长的数据。
Redis3.0:随机找五条,插入一个长度为16按空闲排序的队列里,每次删去最老的元素。
MemCached/ Guava Cache:纯粹的LRU,维持一个双向链表,插入到链表头,删除时把前后两个元素连接起来。

不同缓存系统对于过期键是怎么删除的?

所有缓存系统对于过期键都采用惰性删除的方式,也就是说,并不是数据一过期就删除(因为执行检查的线程耗费cpu),而是只有元素被访问时,才会检查它是否超时了。为了防止不被访问的数据永远不被清理,不同缓存系统提供了不同的策略去清理这样的数据:
Redis:每100ms抽取20条进行检查。如果有超过1/4过期,那么立即进行下一轮检查。
MemCached:有一个检查线程从双链表队尾往前检查,每隔一段时间(默认100ms)执行一次。
Guava Cache:由于在这个系统中,同一个Cache里所有数据同时过期,因此只需要从队尾向前检查直到不过期为止。每次写入数据都会调用此方法。
Ehcache:只有惰性检查,没有主动过期。

设计缓存算法需要考虑的因素有哪些?

成本:如果对象获取成本不同,难以获取的元素需要尽可能的保存。
容量:先清除大对象,这样就可以把更多的小对象换进内存。
时间:如果系统缓存着过期时间,那么对过期的数据进行清理。

Redis 和 Memcached 分别是怎么实现的?

http://blog.csdn.net/u014743697/article/details/53442512

Select、poll 和 epoll 的区别?

http://www.cnblogs.com/Anker/p/3265058.html

数据库分区与分库分表(Sharding)的区别是什么?

http://blog.csdn.net/heirenheiren/article/details/7896546

数据库分库分表(Sharding)的步骤是什么?

http://blog.csdn.net/bluishglc/article/details/6161475

多级缓存是怎么实现的?

http://blog.csdn.net/huashen1621y/article/details/51594148