假设这样一个问题:一个程序有 1TB 的数据都存在硬盘上,但其中只有 1GB 的数据会被频繁地读取,假设硬盘的读取速度是 100MB/s,那么每一次读取都会消耗 10 秒,有没有什么办法可以提高读取的速度?
很明显,这个问题是由于硬盘的速度太慢了,导致读取时间太久,而且只是其中 1GB 数据会被频繁地读取,那我们能不能把这 1GB 的数据存到一个速度更快的地方,比如存到内存中,假设内存速度是 10GB/s,那么每一次读取这 1GB 的数据就只需要 0.1 秒。可能有人会说,那为什么不把全部数据都存到内存中呢?当然可以,只要你有足够大的内存,但是内存的价格要比硬盘高不少,整个程序的花费就会非常大,而且其他数据存进内存的意义不大。
如果要给这里的“内存”起一个名字,就可以叫它“缓存”了。我们不用去纠结缓存的概念是什么,更重要的是它解决了什么问题。
还是从上面的问题入手,我们可以提取出两个关键点:频繁,速度。
这两个关键点意味着缓存中的数据往往是会被反复读取的,因为经常要读取,所以要提高读取的速度。另外,由于数据本身是存在硬盘上的,所以不管缓存中有没有这些数据,程序都应该是正常运行的,当缓存中没有数据的时候,需要去硬盘中读取。如果程序修改了硬盘上的数据,缓存中的数据就没有用了,属于过时的数据,所以还需要去更新缓存。
所以,我们可以总结出缓存的特点:
本课程聚焦 Go 语言实现分布式缓存,我们会使用 Go 语言的内置库完成一个单机版的缓存服务,后面会基于这个单机版的缓存服务来升级改造,逐步迭代成为一个分布式的缓存服务。