其它

作者: lingnanlu | 来源:发表于2016-09-17 20:19 被阅读14次

    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)

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

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

    相关文章

      网友评论

          本文标题:其它

          本文链接:https://www.haomeiwen.com/subject/swrwettx.html