
关于缓存
主要介绍缓存的基础知识,了解缓存常用的分类、读写模式,熟悉缓存的七大经典问题及解决应对之策,同时要从缓存组件的访问协议、Client 入手,熟练掌握如何访问各种缓存组件,如 Memcached、Redis、Pika 等。
上班写bug
这个作者很懒,什么都没留下…
展开
-
10.MC是怎么定位key以及如何淘汰冷key和失效key的
key定位哈希表Mc 将数据存储在 Item 中,然后这些 Item 会被 slabclass 的 4 个 LRU 管理。这些 LRU 都是通过双向链表实现数据记录的。双向链表在进行增加、删除、修改位置时都非常高效,但其获取定位 key 的性能非常低下,只能通过链表遍历来实现。因此,Mc 还通过 Hashtable,也就是哈希表,来记录管理这些 Item,通过对 key 进行哈希计算,从而快速定位和读取这些 key/value 所在的 Item,如下图所示。哈希表也称散列表,可以通过把 key 映射原创 2020-09-16 14:29:12 · 724 阅读 · 0 评论 -
09.MC是如何使用多线程和状态机来处理请求命令的
网络模型主线程Mc 基于 Libevent 实现多线程网络 IO 模型。Mc 的 IO 处理线程分主线程和工作线程,每个线程各有一个 event_base,来监听网络事件。主线程负责监听及建立连接。工作线程负责对建立的连接进行网络 IO 读取、命令解析、处理及响应。Mc 主线程在监听端口时,当有连接到来,主线程 accept 该连接,并将连接调度给工作线程。调度处理逻辑,主线程先将 fd 封装成一个 CQ_ITEM 结构,并存入新连接队列中,然后轮询一个工作线程,并通过管道向该工作线程发送通知。工作线原创 2020-09-14 16:29:25 · 937 阅读 · 0 评论 -
08.MC系统架构是如何布局的
系统架构如下图所示,Mc 的系统架构主要包括网络处理模块、多线程处理模块、哈希表、LRU、slab 内存分配模块5部分。Mc 基于 Libevent 实现了网络处理模块,通过多线程并发处理用户请求;基于哈希表对 key 进行快速定位,基于 LRU 来管理冷数据的剔除淘汰,基于 slab 机制进行快速的内存分配及存储。系统架构Mc 基于 Libevent 开发实现了多线程网络模型。Mc 的多线程网络模型分为主线程、工作线程。这些线程通过多路复用 IO 来进行网络 IO 接入以及读写处理。在 Linux原创 2020-09-09 15:19:24 · 1809 阅读 · 0 评论 -
07.MC为何是应用最广泛的缓存组件
Memcached 原理及特性原理Memcached 是一个开源的、高性能的分布式 key/value 内存缓存系统。它以 key/value 键值对的方式存储数据,是一个键值类型的 NoSQL 组件。NoSQL 即 Not SQL,泛指非关系类型数据存储。NoSQL 是通过聚合模型来进行数据处理的。其聚合模型主要分为:key/value 键值对、列族、图形等几种方式。其中 key/value 键值类似我们平常使用的 map,只通过 key 来进行查询和变更操作。我们使用的 Memcached、Red原创 2020-09-02 23:32:11 · 457 阅读 · 0 评论 -
06.Hot Key 和 Big Key 引发的问题怎么应对
Hot Key问题描述对于大多数互联网系统,数据是分冷热的。比如最近新闻、新发表的微博被访问的频率最高,而比较久远的之前的新闻、微博被访问的频率就会小很多。而在突发事件发生时,大量用户同时去访问这个突发热点信息,访问这个 Hot key,这个突发热点信息所在的缓存节点就很容易出现过载和卡顿现象,甚至会被 Crash。原因分析Hot key 引发缓存系统异常,主要是因为突发热门事件发生时,超大量的请求访问热点事件对应的 key,比如微博中数十万、数百万的用户同时去吃一个新瓜。数十万的访问请求同一个 k原创 2020-08-30 11:40:39 · 330 阅读 · 0 评论 -
05.缓存数据不一致和并发竞争怎么处理
数据不一致问题描述同一份数据,可能会同时存在 DB 和缓存之中。那就有可能发生,DB 和缓存的数据不一致。如果缓存有多个副本,多个缓存副本里的数据也有可能会发生不一致现象。原因分析不一致的问题大多跟缓存更新异常有关。比如更新 DB 后,写缓存失败,从而导致缓存中存的是老数据。另外,如果系统采用一致性 Hash 分布,同时采用 rehash 自动漂移策略,在节点多次上下线之后,也会产生脏数据。缓存有多个副本时,更新某个副本失败,也会导致这个副本的数据是老数据。业务场景导致数据不一致的场景也不少。如原创 2020-08-30 10:43:02 · 658 阅读 · 0 评论 -
04.缓存失效、穿透和雪崩问题怎么处理
缓存失效问题描述服务系统查数据,首先会先查缓存,如果缓存数据不存在,就进一步查 DB,最后查到数据回种到缓存并返回。缓存的性能比 DB 高 50~100 倍以上,所以我们希望数据查询尽可能命中缓存,这样系统负荷最小,性能最佳。缓存里的数据存储基本都是以 key 为索引进行存储和获取的。业务访问时,如果大量的 key 同时过期,很多缓存数据访问都会 miss,进而穿透到 DB,DB 的压力就会明显上升,由于 DB 的性能较差,只在缓存的 1% ~ 2% 以下,这样请求的查询效率会明显下降,这就是缓存失效的原创 2020-08-20 20:25:59 · 265 阅读 · 0 评论 -
03.缓存的引入及架构设计
缓存组件选择在设计架构缓存时,首先要选定缓存组件,比如要用 Local-Cache,还是 Redis、Memcached、Pika 等开源缓存组件,如果业务缓存需求比较特殊,还要考虑是否直接定制开发一个新的缓存组件,还是对开源缓存进行二次开发,来满足业务需要。缓存数据结构设计确定好缓存组件后,还要根据业务访问的特点,进行缓存数据结构的设计。对于简单 KV 读写的业务,可以将这些业务数据封装为 String、Json、Protocol Buffer 等格式,序列化成字节序列,然后直接写入缓存中。读取时,原创 2020-08-10 22:44:57 · 194 阅读 · 0 评论 -
02.缓存的读写模式以及缓存的分类
缓存的读写模式缓存有三种读写模式:Cache Aside(旁路缓存)Read/Write Through(读写穿透)Write Bechind Caching(异步缓存写入)Cache Aside如上图所示,Cache Aside 模式中,业务应用方对于写,是更新 DB 之后,直接将 key 从 cache 中删除,然后由 DB 驱动缓存数据的更新;而对于读,是先读 cache,如果 cache 没有,则读 DB ,同时将从 DB中读取的数据回写到 cache。这种模式的特点是,业务端原创 2020-08-09 15:58:09 · 598 阅读 · 1 评论 -
01.缓存的原理
缓存的定义缓存最初的含义,是指用于加速CPU数据交换的RAM,及随机存取存储器,通常这种存储器使用更昂贵但快速的静态RAM(SARAM)技术,用以对DRAM进行加速。这是一个狭义缓存的定义。而广义缓存的定义则更宽广,任何可以用于数据高速交换的存储介质都是缓存,可以是硬件也可以是软件。缓存存在的意义就是通过开辟一个新的数据交换缓冲区,来解决原始数据获取代价太大的问题,让数据得到更快的访问。缓存原理缓存的基本思想缓存构建的基本思想是利用时间局限性原理,通过空间换时间来达到加速数据获取的目的,原创 2020-08-02 00:13:54 · 301 阅读 · 0 评论