2022年10月7日

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 系统中的使用有很多好处
      • 不仅可以减少网络流量,降低客户访问延迟
      • 还可以减轻服务器负载。

目前已经存在很多高性能的缓存系统,比如 Memcache,Redis 等。

本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gocache-implement.html

缓存系统的设计

  • 缓存系统中,缓存的数据一般都存储在内存中,所以我们设计的缓存系统要以某一种方式管理内存中的数据
  • 一般情况下,缓存系统还支持将内存中的数据写入到文件中,在系统再次启动时,再将文件中的数据加载到内存中,这样一来就算系统停机,缓存数据也不会丢失。
  • 同时缓存系统还提供过期数据清理机制,也就是说缓存的数据项是有生存时间的,如果数据项过期,则数据项会从内存中被删除,这样一来热数据会一直存在,而冷数据则会被删除,也没有必要进行缓存。
  • 缓存系统还需要对外提供操作(CRUD)的接口,这样系统的其他组件才能使用缓存

通过以上分析,可以总结出缓存系统需要有以下功能:

  • 缓存数据的存储
  • 过期数据项管理
  • 内存数据导出,导入
  • 提供 CRUD 接口

缓存系统实现

  • 用什么数据结构存储数据项?

    哈希表(golang 中的 map已实现)。直接将缓存数据项存储在 map 中。

  • 实现缓存数据项 Item 以便缓存系统支持过期数据清理
    • 怎么样判断数据项有没有过期呢?
      其实非常简单。我们在每一个数据项中,记录数据项的过期时间,然后缓存系统将定期检查每一项数据项,如果发现数据项的过期时间小于当前时间,则将数据项从缓存系统中删除。

实现缓存系统的 CRUD 接口

将数据添加到缓存系统中

posted @ 2022-10-07 20:09 micromatrix 阅读(246) 评论(0) 推荐(0) 编辑

2022年8月7日

摘要: Python/Go/Java 算法常用模板、数据结构 记录一些个人在刷leetcode和CF中用的比较多的语法 初始化数组 Golang go语言中定义二维数组和初始化比较特殊,需要先初始化行数再初始化列,定义一个mxn数组:: mat := make([][]int, m) for i := range mat { mat[i] = make([]i 阅读全文
posted @ 2022-08-07 20:37 micromatrix 阅读(169) 评论(0) 推荐(0) 编辑

2022年7月22日

摘要: 分快上传和断点续传 服务器架构变迁 两个改动: 分块上传: 大文件分块上传,小文件照先前架构普通上传 Redis缓存:存储上传文件的已经上传的每一块文件的元信息。为什么用Redis?因为分块信息只需要在文件上传期间保留,上传完成之后就可以清理掉了,所以这部分的数据体量不需要太大,主要取决于同时有多少 阅读全文
posted @ 2022-07-22 22:48 micromatrix 阅读(237) 评论(0) 推荐(0) 编辑

2022年7月20日

摘要: Golang仿云盘项目- 5. 用户上传/查询文件/秒传 秒传原理 TODO 服务架构变迁 较之前的加入了用户文件表、hash计算。 唯一文件表:一个文件只存一条记录,文件的filesha1为主键 用户文件表:存储每个用户所有文件的元数据 Hash计算:内潜在上传server里,作为内部逻辑模块存在;也可以单独抽出来作为独立的微服务,向外提供接口 无秒传的 阅读全文
posted @ 2022-07-20 21:58 micromatrix 阅读(297) 评论(0) 推荐(0) 编辑

2022年7月19日

摘要: Golang仿云盘项目-4 账号系统与鉴权(1)-解决:登录 404 not found 解决:登录 404 not found 阅读全文
posted @ 2022-07-19 18:50 micromatrix 阅读(211) 评论(0) 推荐(2) 编辑

2022年7月15日

摘要:  Golang仿云盘项目-3.2 云存储系统之持久化 本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16478717.html 项目结构 . ├── db │ ├── file.go │ └── mysql │ └── conn.go ├── doc │ └── 建表语句.sql 阅读全文
posted @ 2022-07-15 21:24 micromatrix 阅读(260) 评论(0) 推荐(0) 编辑

2022年7月12日

摘要:  Golang仿云盘项目-3.1 MySQL主从数据同步(一) 话说,这个课的视频真是缺斤少两。。。 服务架构变迁 本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16464465.html 环境 Docker安装 从dockerhub上拉取Mysql镜像 https://hub.docke 阅读全文
posted @ 2022-07-12 17:11 micromatrix 阅读(406) 评论(0) 推荐(2) 编辑

2022年7月10日

摘要:  Golang仿云盘项目-2.3 实现文件下载、修改、删除接口 本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16462188.html 目录结构 ❯ pwd /home/cenjw/gowork/src/FileStorageDisk ❯ tree . ├── handler │ └── 阅读全文
posted @ 2022-07-10 20:13 micromatrix 阅读(418) 评论(0) 推荐(1) 编辑

2022年7月9日

摘要: Golang仿云盘项目-2.2 文件查询信息接口 本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html 目录结构 E:\goproj\FileStorageDisk │ main.go │ program.txt │ ├─handler │ handler 阅读全文
posted @ 2022-07-09 19:58 micromatrix 阅读(295) 评论(0) 推荐(1) 编辑

2022年7月8日

摘要: 目录结构 E:\goproj\FileStorageDisk │ main.go │ readme.txt │ ├─handler │ handler.go │ └─static └─view index.html 上传一个文件 本文来自博客园,作者:Jayvee,转载请注明原文链接:https:/ 阅读全文
posted @ 2022-07-08 18:59 micromatrix 阅读(137) 评论(0) 推荐(0) 编辑

导航

统计

点击右上角即可分享
微信分享提示