• STAND ALONE COMPLE...
    2020-08-07
    okCache实现很巧妙,通过链表实现了o(1)复杂度的删除节点,同时通过哈希表避免了链表随机访问o(n)的时间复杂度。这里同时对okCache发现可以优化的点,对于链表的加锁操作可以细粒度化,比如,头节点和尾节点比较特殊,可以单独搞把cas锁,就是还没有想到如何保证数据的一致性,比如,删除指定节点,并添加到头节点这是一个原子操作,不允许中间状态。

    作者回复: 是的,okCache还有优化空间,锁的粒度还可以细化。但是目前对于SessionServer来说,它的性能已经足够了,瓶颈已经不在Cache层,而是在网络传输/序列化层,所以单独优化okCache对提升SessionServer总体性能影响不大。

    
    1
  • 人在江湖飘
    2020-09-10
    老师 map来存放list中的节点,如果存在hash冲突怎么办呢?

    作者回复: 看后面的代码样例: private Map<K, Node<K, V>> map; 这里的Node节点是作为值Value存在Map中的,前面的K是Key,如果Key有hash冲突,那么根据Java中的HashMap做法是会用链表法来存储key冲突的Value(也就是Node)。

    
    
  • 飞翔
    2020-08-04
    老师 为啥guava cache 用deque实现呀 用双向列表 可以移动任何元素到末尾, deque只能前后端移除元素呀 我要有一个中间的元素要移除 deque实现 不就是o(n) 的时间复杂度了嘛?

    作者回复: 请看代码实现: https://github.com/spring2go/okcache/blob/master/src/main/java/com/spring2go/okcache/impl/SegmentAccessQueue.java SegmentAccessQueue扩展自AbstractDeque,对很多方法进行了重载,实现复杂度是O(1)的。

    
    
  • tt
    2020-08-03
    听完这节课,是不是可以对SessionServer座如下理解? SessionServer的定位应该就是普通业务系统中的本地缓存,存放极热点的数据,后面还要接容量更大的集中式缓存。 只是正好因为在本章的上下文中,当前的“业务”是保存具有一定全局属性的会话,所以给“当前业务本地缓存”的设计带来了特殊性。

    作者回复: SessionServer主要用于集中存放用户的Web Session会话数据。SessionServer的设计挑战在高性能/高可用/可扩展性。它的高性能设计采用内存LUR缓存 + 可持久化缓存两级缓存机制。后台DB的主要作用是备份,通过后台DB可以实现故障恢复,保障高可用性。SessionServer通过客户端浏览器cookie记住SessionServer IP地址的方式,可以实现简单的集群按需扩展。

    
    
  • 青阳
    2022-07-12
    力扣算法题就是一个HashMap(O(1)判断是否存在),加上一个双向链表(O(1)的头尾添加和删除)实现
    
    
  • 白小龙
    2021-01-28
    读代码的时候不刻意去看给谁赋值,而是把=理解为让指向会更容易理解
    
    