github: https://github.com/jwcen/gocache
本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gocache-implement.html
本项目,我们将了解缓存的原理与意义,然后我们将设计并使用 Go 语言实现一个缓存组件。
知识点
- 缓存的意义和缓存的设计
- Go 语言 map 实现哈希方法
目的
- 第一,通过动手实现我们可以了解缓存系统的工作原理
- 第二,如Redis 之类的缓存系统都是独立存在的,如果只是开发一个简单的应用还需要单独使用 Redis 服务器,难免会过于复杂。这时候如果有一个功能完善的软件包实现了这些功能,只需要引入这个软件包就能实现缓存功能,而不需要单独使用 Redis 服务器,就最好不过了。
缓存
- 缓存的工作原理一般是 CPU 需要读取数据时,会首先从缓存中查找需要的数据,如果找到了就直接进行处理,如果没有找到则从内存中读取数据。
- 由于 CPU 中的缓存工作速度比内存还要快,所以缓存的使用能加快 CPU 处理速度。
- 比如在 Web 系统中,缓存存在于服务器端,客户端或者代理服务器中。广泛使用的 CDN 网络,也可以看作一个巨大的缓存系统。
- 缓存在 Web 系统中的使用有很多好处
- 不仅可以减少网络流量,降低客户访问延迟
- 还可以减轻服务器负载。
- 缓存在 Web 系统中的使用有很多好处
目前已经存在很多高性能的缓存系统,比如 Memcache,Redis 等。
本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gocache-implement.html
缓存系统的设计
- 缓存系统中,缓存的数据一般都存储在内存中,所以我们设计的缓存系统要以某一种方式管理内存中的数据。
- 一般情况下,缓存系统还支持将内存中的数据写入到文件中,在系统再次启动时,再将文件中的数据加载到内存中,这样一来就算系统停机,缓存数据也不会丢失。
- 同时缓存系统还提供过期数据清理机制,也就是说缓存的数据项是有生存时间的,如果数据项过期,则数据项会从内存中被删除,这样一来热数据会一直存在,而冷数据则会被删除,也没有必要进行缓存。
- 缓存系统还需要对外提供操作(CRUD)的接口,这样系统的其他组件才能使用缓存
通过以上分析,可以总结出缓存系统需要有以下功能:
- 缓存数据的存储
- 过期数据项管理
- 内存数据导出,导入
- 提供 CRUD 接口
缓存系统实现
- 用什么数据结构存储数据项?
哈希表(golang 中的 map已实现)。直接将缓存数据项存储在 map 中。
- 实现缓存数据项
Item
以便缓存系统支持过期数据清理- 怎么样判断数据项有没有过期呢?
其实非常简单。我们在每一个数据项中,记录数据项的过期时间,然后缓存系统将定期检查每一项数据项,如果发现数据项的过期时间小于当前时间,则将数据项从缓存系统中删除。
- 怎么样判断数据项有没有过期呢?