首页 > 其他分享 >基于Golang的简易缓存系统实现

基于Golang的简易缓存系统实现

时间:2022-10-07 20:25:07浏览次数:80  
标签:数据项 缓存 实现 系统 Golang 简易 缓存数据 内存

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 接口

将数据添加到缓存系统中

标签:数据项,缓存,实现,系统,Golang,简易,缓存数据,内存
From: https://www.cnblogs.com/cenjw/p/gocache-implement.html

相关文章

  • go-zero微服务实战系列(五、缓存代码怎么写)
    缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起。本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数......
  • Golang依赖包的各项指标分析总结
    专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章已收录,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源......
  • Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>
    背景将一个类型为Map<Integer,String>的一个Map对象放到redis中后,再次取出来时。当我们想便利Map.entrySet()获取每个Entry中的Key,如执行Integerkey=entry.getKey();那......
  • CPU缓存对性能的影响
    CPU缓存机制的几个特点及编写程序时需要注意的点:1.时间局部性,CPU缓存会假设,如果访问了某一内存区域的,那么很快会重复访问它需要时才声明变量,尽可能缩短对象的周期,提高缓......
  • Golang:https证书有效期检测
    原理:使用go提供的模块crypto/tls,可以获取域名证书的信息,通过到期时间可以判断证书是否过期packagemainimport("crypto/tls""fmt")funcmain(){con......
  • 简易分布式服务构思
    sequenceDiagram participant管理员 participant用户 participant用户中心 participant子系统 participant开发者 开发者->子系统:请求注册服务 子系统->用户......
  • 自制简易谷歌翻译器详解(附完整UI界面及代码文件)
    摘要:Google翻译大概是目前机器翻译中翻译最为准确的了,本文分别使用了两种可行的方式编写了简易的谷歌翻译软件。将详细介绍调用谷歌翻译API和自行定义谷歌翻译接口的方式......
  • # 简易计算器
    简易计算器#include<stdio.h>#include<stdlib.h>intAdd(intx,inty){ returnx+y;}intSub(intx,inty){ returnx-y;}intMul(intx,inty){ retur......
  • 缓存雪崩等问题
    缓存雪崩就是在同一段时间内有大量缓存数据失效了(缓存过期了、被内存淘汰策略淘汰了或者Redis服务宕机了),然后在这段时间内又有请求想要获取这些数据,因为这些缓存数据已经......
  • MyBatis框架:第十章:mybatis缓存
    mybatis缓存说明:缓存指的是把一些常用的数据,保存到一个可以高速读取的缓冲区中。方便程序在频繁读取的时候,可以快速的取出数据。这就叫做缓存。一级缓存指的是,这些缓存......