小白科普:缓存
一、什么是缓存?
缓存,英文名为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删除记录,同时删除数据库中的记录。
关于缓存的话题很大,比如应用程序如何访问缓存?如何实现分布式存储?一个缓存服务器的内存满足不了系统的要求怎么办?用什么算法让数据相对“平均”的存储?数据库与缓存双写一致性方案等等,如果你感兴趣,可以查查相关资料。
在过几天就要过大年咯~
在这里,提前祝大家 新年快乐!
开开心心,恭喜发财,一帆风顺!