小白科普:缓存

一、什么是缓存?

缓存,英文名为Cache,指在目标数据节点上将传输过来的节点数据进行暂存。每个节点的数据如何存储应该是可配置和可控制的,比如,设置数据目标位置的IP地址及目录,数据存储的方法,数据的保留时间、自动清理等。

缓存的类型分很多种,在不同的场景有着不同的意义,采用的技术手段也不一样。

例如,CPU缓存,分为L1 Cache(一级缓存)和L2 Cache(二级缓存);Linux操作系统的文件缓存;浏览器缓存,也称为客户端缓存,可以是对静态页面中的元素进行缓存,也可以是动态页面对静态页面的缓存,比如点击浏览器中的“后退”,页面就是从浏览器缓存中调出并立即显示出来。

二、缓存的作用和原理?

数据库连接资源很“昂贵”(I/O,TCP连接),基本都使用连接池,但是连接池的数量有限,如果用户过多,会造成交易等待,那么客户端在接受到系统数据时呈现页面所需的时间会延迟,影响用户体验;其次是在关系型数据库中进行读写操作需要加锁, 所以在多用户、大并发的场景下是不可取的。

这一问题的解决方法,就是缓存。

缓存的数据放在内存中,当CPU要读取一个数据时,首先将内存地址传递给一级数据缓存,一级数据缓存会检查它是否有这个内存地址对应的缓存段,如果没有则从二级或三级缓存中继续查找,找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度在内存中读取并送给CPU处理,同时将数据所在的数据块加载到缓存中,那么以后就可以从缓存中读取数据,节省了CPU直接读取内存的时间。

图片来源:《码农翻身》

从上图我们可以看到,CPU读取速度是最快的,其次是缓存,如果CPU读取需要1秒,那么内存就要6分钟,网络更是非常慢,要19年。所以将数据存储在缓存中,不仅能降低应用服务器对数据库的访问频率,减轻数据库压力,而且还能提高系统性能,缩短访问时间。

小知识点

数据库连接:

1.应用程序的数据访问层请求DataSource来获取一个数据库连接;

2.DataSource使用数据库驱动来打开一个数据库连接;

3.创建数据库连接,同时打开了一个TCP socket;

4.应用程序进行数据库的读写;

5.连接已经不再需要了,因此关闭它;

6.关闭socket。

三、缓存里放什么格式的数据?

◇语言专有(java ,序列化,反序列化)

把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。

◇语言独立(protobuf)

protobuf是Google开发一种数据描述格式,能够将结构化数据序列化,可用于数据存储,通信协议等方面。

◇XML ? JSON?

XML和JSON都是一种数据传输格式,对平台没有限制,按规则格式解析即可。

◇字符串?(key,value)

Key和Value代表键和值,如果说Key对应客户,那么Value就对应客户号。

◇基本的数据结构

如Map,就是以方式组织成的数据结构,可以理解成一张表。

四、缓存空间满了这么办?

◇缓存服务器在启动时,会设置缓存大小

◇LRU(least recently used)算法

◇清除最近最少使用的缓存数据

五、缓存机制举例?

◇查询

如通过账号ac查账户基本信息表acinfo,每当要查数据时,操作流程是:

1.先从缓存中查记录(ac→acinfo);

2.若缓存中有记录,则返回结果并结束;

3.若缓存中无记录,则查数据库并将信息保存到缓存中,再返回。

◇插入

分为两种,一是先写数据库再淘汰缓存,二是先淘汰缓存再写数据库。

但在并发的场景下,都有可能会出现数据库与缓存中数据不一致的情况。比如用户A发起交易查数据库,得到一个旧值,用户B发起交易将新值写入数据库,并且删除缓存,用户A将从数据库中查到的旧值写入缓存,那么就会出现数据不一致。

在核心系统中,通常按应用模块、交易、事务的维度作为开始和结束。以交易的维度为例,常见的操作流程是:

1.通过Key找Map;

2.往Map写入记录;

3.写入数据库并结束。

写缓存又分为直写(write-through)和回写(write-back)。直写是指数据写到下一级缓存或直接到内存中,如果对应的段被缓存了则会更新缓存中的内容;回写是指不会立即把写操作传递到下一级,而是仅修改本级缓存中的数据,最后一次性的写入到内存中,而不是对同一块地址反复写,可以提高效率。

◇删除

删除没什么特别的,通过Key找到Map删除记录,同时删除数据库中的记录。

关于缓存的话题很大,比如应用程序如何访问缓存?如何实现分布式存储?一个缓存服务器的内存满足不了系统的要求怎么办?用什么算法让数据相对“平均”的存储?数据库与缓存双写一致性方案等等,如果你感兴趣,可以查查相关资料。

在过几天就要过大年咯~

在这里,提前祝大家 新年快乐!

开开心心,恭喜发财,一帆风顺!

(0)

相关推荐

  •  缓存行填充与@sun.misc.Contended注解

     缓存行填充与@sun.misc.Contended注解

  • 「13月亮历」【星之奇旅历法小白科普专栏】新手如何查找自己的13月亮历生日?

    新手如何查找自己的13月亮历生日? 作者:冯晶晶  责任编辑:碗 排版:PandaYung  图:来自星之奇旅设计部 我们公众号经历过一次搬迁,搬迁以后,原来的海量文章都在旧的微信系统,不利于大家找到 ...

  • 「13月亮历」【星之奇旅历法小白科普专栏】每个人星系印记中隐藏的动力场关系(十分重要建议收藏)

    每个人星系印记中隐藏的动力场关系 作者:冯晶晶  责任编辑:碗 排版:PandaYung  图:来自星之奇旅设计部 五大神谕力量让每个人天赋绽放 我相信很多人遇见13月亮历法之后,最关心的仍旧是自己的 ...

  • 耳机小白科普之——耳机的结构

    先絮叨一下公众号名称的由来."歌德巴赫的天空",歌德算是所有耳机品牌中名字最具有诗意的,以此代表音响,巴赫就是指音乐啦.歌德耳机声音比较犀利,热情:巴赫则极其和谐,规整:这水与火的 ...

  • 财税小白科普:银行存款增加记哪方

    企业在经营时,为了保证资金的安全,需要把"管钱的"和"管账的"的职责分离开来.毕竟,一人为私两人为公.当然了,企业的财务工作还是很多的.下面虎虎大家分享一下,& ...

  • 「13月亮历」【星之奇旅历法小白科普专栏】星系印记中的隐藏恒定值给我们的启发

    星系印记中的隐藏恒定值给我们的启发 作者:冯晶晶  责任编辑:碗 排版:PandaYung  图:来自星之奇旅设计部 星系印记中的恒定值 在上周的科普连载中我们讲述了星系印记到底代表什么,以及每个人星 ...

  • GRE考试是什么?丨GRE小白科普文

    打算备考GRE的同学,备考之前应该要知己知彼,这样才能百战百胜.有些同学在没有了解清楚GRE考试的前提之下就去看看别人是怎么备考的,刷什么题,要用什么方法等等.但其实,最重要的第一步就是要好好了解一下 ...

  • 小白科普:死锁

    什么叫死锁? 死锁指多个线程因竞争资源而造成的一种互相等待,若无外力作用,这些进程都将无法向前推进. 业务场景可以分为两大类,单用户业务和用户间业务,一般单用户业务很少出现死锁. 死锁的现象? 在DB ...

  • 小白科普:支取方式

    一.什么是支取方式 支取方式是客户与银行等金融机构约定取款转账等业务办理时确认身份的一种方式,也是保护储户存款安全的一种措施. 二.支取方式的种类 常见的支取方式包括凭密支取.凭印支取.凭证件支取.凭 ...

  • 小白科普:计提

    上周有小伙伴提到差额法的相关问题,感谢社群朋友帮忙解答,我们就简单说下计提这块. 一.什么叫计提 银行为了正确的反映当期的经营成果,根据会计的责权发生制原则,将实际还未发生,但应在当期反映的利息收入或 ...