其它

2016-09-17  本文已影响14人  lingnanlu

1. Cookies与Session的区别

结合用户登录中两者的角色去说

因为Http是无状态的, 而有时就需要保持状态, 这时就使用Session机制来保持状态信息

最典型的就是用户登录后要保持状态。

当用户第一次访问站点时,服务器为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。

当用户第二次访问该站点时,浏览器会带着本地存放的cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。

如果该session表示用户是登录的, 那么就相当于记住了用户的登录状态。

当cookies过期后,session就失效了, 需要用户重新登录得到新的session ID

Session原理简述

2. 各种设计模式

谈是什么以及在各个框架中的应用

  1. 访问者模式, 将数据结构与算法分离, 树的遍历, 语法树的改写,详细介绍Walk与Visit
  2. 代理:AOP,Log,在不改变已有类的情况下, 为其添加功能
  3. 单例
  4. 工厂: 利用反射生成对象
  5. 模板:Netty中抽象类的使用
  6. 适配器:将不适配的接口变成适配的接口
  7. 装饰模式与代理模式的区别:代理模式往往是代理类代替用户去创建代理类, 也就是用户往往是直接使用代理类, 而装饰用户需要用户显示的创建被装饰类以及装饰类。(对此保持疑问)
  8. 观察者模式, 发布-订阅, Model-View, EventBus中使用了
  9. 拦截过渡器模式: Netty中的Pipeline

装饰模式与代理模式的区别(转载)

4. select与epoll的区别

https://segmentfault.com/a/1190000003063859#articleHeader17

5. TCP协议仔细看一遍

一个IP包只能有一个TCP segment, 不能有多个, 这是因为TCP头部并没有关于整个Segment长度的字段, 但是一个TCP segment可以分成多个, 每一个添加一个头部, 分为多个IP字段传送.

12. 针对3次握手的恶意攻击,如何应对

6. 缓存算法 FIFO, LRU, LFU

在缓存空间有限的情况下, 以上算法仅仅是替换策略和访问策略的不同

6.1 各缓存算法的替换策略与实现

FIFO: 这个最简单, 利用一个队列, 替换掉队头的元素, 为了快速访问到元素, 可以利用HashMap保存Key在队列中的位置

LRU:如果一个数据在最近一段时间没有被访问到, 在将来它被访问到的可能性也很小。

实现, 可以利用一个链表, 从链表头到链表尾代表访问时间越来越久远, 链表头的是最近访问的, 表尾的是很久没有访问的。如果访问了一个节点, 就将其放入到链表头部。

为了加快各中操作的效率, 见如下文章

  1. LRU cache实现 (Java)
  2. LRU Cache(C++)

LFU:最近最少使用, 注意与LRU的不同, LRU是基于访问时间的, LFU是基于访问次数的, 所以LFU算法要想办法记住一个条目最近的访问次数

实现

  1. 利用一个数组存储数据项, 利用HashMap存储数据项在数组中的位置, 然后为每个数据项设计一个访问频次, 当数据项命令中, 访问频次自增, 在淘汰时淘汰访问频次最少的数据, 因为要找到访问频次最少的数据需要遍历数组, 所以淘汰的时间复杂度为O(n)。插入和访问操作都是O(1)

  2. 因为每一个都要淘汰一个访问最少的数据, 所以可以利用小顶堆+hashmap, 这样, 插入和淘汰操作都是O(logN)

6.2 对缓存算法的选择:结合实际的场景,选择命中率高的。

举例:Android中List所使用图片的缓存算法.

想想List中对图片的使用, 总是期待保留最近看过的, 如当在第100页时, 很可能回到第99页, 而不太可能回到第1页, 那么这里就选择LRU, Android中的LRUCache就是这样做的

参见

缓存算法-FIFO、LFU、LRU

8. 进程间通信几种方式

  1. 管道:速度慢,容量有限,只有父子进程能通讯
  2. 命名管道:不相关进程间也可以通讯
  3. FIFO:任何进程间都能通讯,但速度慢
  4. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  5. 信号量:不能传递复杂消息,只能用来同步
  6. 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

9. 常用的Hash算法

Hash函数构造方法

  1. 直接定址法:取关键字或关键字的某个线程函数值为哈希地址
  2. 数字分析法:取关键字的若干数位组成哈希地址
  3. 除留余数法:除某一个数得到的余数作为Hash地址

处理冲突的方法

  1. 开放定址法:就是不断探测冲突地址后的位置是否有空的
  2. 再哈希法:当冲突时, 利用另一个哈希函数计算地址
  3. 链地址法:最常用。

17. GET, POST, PUT以及幂等性

GET用来获取资源, 不应该有副作用, 是幂等的

POST用来提交数据, 肯定有副作用, 不是幂等的

PUT用来更新数据, 有副作用, 是幂等的

纠正自己以前错误的认识, 以RFC为准

What is the difference between POST and GET?

浅谈HTTP中Get与Post的区别

post 和get请求的区别(html)

系统幂等以及常用实现方式

不能只从网上听说, 这也是知识只从网上听说导致的弊端.

上一篇下一篇

猜你喜欢

热点阅读