软件开发缓存应用方法都有哪些

  缓存功能的应用在许多软件开发项目中都是非常常见的一个功能应用,下面我们就通过案例分析来了解一下,软件开发缓存应用方法都有哪些。

  缓存热身

  空缓存会直接导致不命中,从而影响一次读的性能。如果大并发访问空缓存(类似缓存雪崩),很容易导致大量并发请求直接打到DB上,使得DB压力陡增。

  缓存热身即是预先把一些数据加载到缓存,提升一次访问的性能,同时防止一次访问面临大并发时会将后台打出问题。比如在应用启动后,可以将一些TOPN商品异步加载到缓存(不能影响应用启动);商家做活动前,把一些活动商品和活动信息数据加载到缓存(可配置化);把一些极少变动的静态数据加载到缓存。

  缓存替换策略

  缓存总有未命中的情况:

  空不命中:总是不会命中,亦称冷缓存。避免冷缓存的方法是进行“缓存热身”。将k+1层的缓存块放到k层的策略称为放置策略。通常采用取模的方式:j=iModN,即:将k+1层的i个块对N取模后,放到k层的i个块里。

  冲突不命中:比如按取模的放置策略,有可能在缓存未满的情况下,总是对k层的同一个块进行替换。比如jmod4,当j=0,4,8,12时,总是会放在到0块上。缓存抖动是一种特殊的冲突不命中,指高速缓存反复加载或驱逐相同的高速缓存块/组/行。

  容量不命中:缓存容量满了。

  缓存替换策略是指当缓存未命中,且缓存容量已满时,判断要替换哪个块的缓存数据。原则上,应该淘汰:1.只访问过一次的数据;2.相比其他数据更少访问的;3.在一段时间内没有再访问的。

  缓存替换策略主要有FIFO,LRU,LFU。

  FIFO:先进入缓存的先被淘汰。队列实现。或者使用双向链表,新进入元素添加到链表尾,丢弃链表头的元素。FIFO适合丢弃那些只有一次访问的数据。

  LRU:近少使用淘汰。使用链表实现,若缓存命中,则将节点移至部,淘汰尾部节点。LRU适合热点数据访问。LRU无法识别哪些缓存是多被访问的。偶发性、周期性的批量操作可能导致缓存被大量替换,造成缓存污染,使得LRU的效率大幅下降。实际采用LRU-K算法,将缓存分为两级,数据在较短时间被访问K次以上,则进入二级缓存。两级都采用LRU策略。

  LFU:少次数使用淘汰。引用计数+优先级队列(堆)。

  缓存清理策略

  当缓存对应的原始数据更新后,缓存里的数据就与原始数据不一致了,即缓存失效了。这时候需要及时清理缓存,避免读到过期数据以及过期数据占用过大的内存。缓存清理策略是指什么时候清理过期或失效缓存。

  TTL:设置过期时间。TTL一般以数据变化频繁度为依据来设置。不同业务数据的过期时间不一样。

  写时失效:写失效、写更新。写失效-标记缓存数据已过期,读时清理或替换;写更新-在更新数据时就替换缓存项。

  读时失效:写时只标注失效信息,读时判断是否失效并加载新数据。如果有大量缓存对象要更新,可以采用读时失效将写更新成本分摊到每一个读上。缓存对象时,同时存储相应的版本号或时间戳。需要展示数据时,通过对比版本号来判断是否缓存已失效。

  缓存击穿/雪崩/穿透

  缓存击穿。热点问题。大并发集中对热点key进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。基本方案:多级缓存(不同失效时间)+热点散列+热点识别、熔断降级、互斥锁、不过期+异步更新。

  缓存雪崩。大量key同时失效,导致大量请求打到DB,造成巨大DB压力和系统不稳定。基本方案:过期时间+随机化。

  缓存穿透。大量不存在的key的非法访问请求,同样会使得大量请求打到DB。使用布隆过滤器过滤大量非法请求。还有一种方法是空值缓存,失效时间设置小一些,应对短时间内无效重复key的大量查询。

  缓存命中统计、缓存监控。




转载请注明:http://www.xcqg58.com/lsqy/lsqy/26846754.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了