当前位置:首页 > 科技  > 软件

在 Go 中使用接口进行灵活缓存

来源: 责编: 时间:2023-10-28 16:30:03 224观看
导读缓存是编程中一种常见的技术,通过存储昂贵的计算或 IO 结果来快速查找,从而提高性能。在本篇文章中,我们将了解 Go 的接口如何帮助构建灵活、可扩展的缓存。定义缓存接口首先,让我们定义一个接口,指定缓存功能:type Cache i

缓存是编程中一种常见的技术,通过存储昂贵的计算或 IO 结果来快速查找,从而提高性能。在本篇文章中,我们将了解 Go 的接口如何帮助构建灵活、可扩展的缓存。spF28资讯网——每日最新资讯28at.com

spF28资讯网——每日最新资讯28at.com

定义缓存接口

首先,让我们定义一个接口,指定缓存功能:spF28资讯网——每日最新资讯28at.com

type Cache interface {  Get(key string) interface{}  Set(key string, value interface{})}

缓存接口有两个方法:Get 用于按键查找缓存值,Set 用于存储键值对。spF28资讯网——每日最新资讯28at.com

通过定义接口,我们将缓存的使用与特定的实现分离开来。任何实现了这些方法的缓存库都满足接口的要求。spF28资讯网——每日最新资讯28at.com

简单的内存缓存

让我们实现一个符合接口的简单内存缓存:spF28资讯网——每日最新资讯28at.com

type InMemoryCache struct { m     sync.Mutex store map[string]interface{}}func NewMemoryCache() *InMemoryCache { return &InMemoryCache{  m:     sync.Mutex{},  store: make(map[string]interface{}), }}func (c *InMemoryCache) Get(key string) interface{} { return c.store[key]}func (c *InMemoryCache) Set(key string, value interface{}) { c.m.Lock() defer c.m.Unlock() c.store[key] = value}

InMemoryCache 使用 map 在内存中存储条目,并且使用 sync.Mutex 来避免并发写的发生。它实现了 Get 和 Set 方法来管理映射中的条目。spF28资讯网——每日最新资讯28at.com

使用缓存

现在我们可以轻松使用缓存了:spF28资讯网——每日最新资讯28at.com

mc := NewMemoryCache()mc.Set("hello", "world")mc.Get("hello") // world

通过该接口,我们可以调用 Set 和 Get,而不必担心实现问题。spF28资讯网——每日最新资讯28at.com

其他缓存实现

现在,假设我们想使用 Redis 而不是内存缓存。我们可以创建一个实现相同接口的 RedisCache:spF28资讯网——每日最新资讯28at.com

type RedisCache struct { client *redis.Client}func NewRedisCache() *RedisCache { c := &RedisCache{client: redis.NewClient(&redis.Options{  Addr: "localhost:6379", })} return c}func (c *RedisCache) Get(key string) interface{} { ctx := context.Background() return c.client.Get(ctx, key)}func (c *RedisCache) Set(key string, value interface{}) { ctx := context.Background() c.client.Set(ctx, key, value, -1)}

使用方式:spF28资讯网——每日最新资讯28at.com

rc := NewRedisCache()rc.Set("hello", "world")rc.Get("hello") // world

客户端代码保持不变。这就体现了接口的灵活性。spF28资讯网——每日最新资讯28at.com

基于接口的缓存的好处

  • 解耦 - 客户端代码无需与特定的缓存库相耦合。
  • 可维护性--无需修改客户端代码即可更改缓存实现。
  • 可测试性--可对缓存进行存根测试或模拟测试。
  • 可重用性--通用缓存接口允许编写可重用的缓存逻辑。

加料

这里我们看到上面的代码,有两个缓存器,也都实现了 Set 和 Get 方法,但是我们初始化的时候是初始化一个真正的对象:InMemoryCache 和 RedisCache 。实际上我们可以定义一个 cache 接口:spF28资讯网——每日最新资讯28at.com

type cache interface { Set(key string, value interface{}) Get(key string) interface{}}func DefaultCache() cache { return NewMemoryCache()}func NewCache(tp string) (cache, error) { switch tp { case "redis":  return NewRedisCache(), nil default:  return DefaultCache(), nil } return nil, errors.New("can not found target cache")}

这样当我们又有其他缓存器需求时,我们实际上无需再更改客户端的代码,只需要增加 cache 的实现即可。这样改造之后,我们的客户端调用就可以变成这样:spF28资讯网——每日最新资讯28at.com

func main() { c, err := NewCache("") if err != nil {  log.Fatalln(err) } c.Set("hello", "world") c.Get("hello")}

我们使用的对象并不是真正的缓存器对象,而是 cache 接口,而 InMemoryCache 和 RedisCache 都实现了 cache 接口,所以我们调用 Set 和 Get 方法的时候,实际上是对应到缓存器真正的实现。spF28资讯网——每日最新资讯28at.com

最后

Go 中的接口有助于构建灵活的库和应用程序。定义简单的接口使代码更整洁:spF28资讯网——每日最新资讯28at.com

  • 模块化 - 可以插入不同的实现。
  • 可扩展 - 可以不间断地添加新的实现。
  • 可维护 - 组件可以互换,便于维护。
  • 可测试 - 可对组件单独的单元测试。

通过以最小的开销提供强大的抽象,接口在 Golang 中对于创建松散耦合和可扩展的系统非常重要。spF28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15570-0.html在 Go 中使用接口进行灵活缓存

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用C++实现图像处理中三种常见的滤波算法

下一篇: 开始学习Go编程

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 一文看懂为苹果Vision Pro开发应用程序

    一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • Flowable工作流引擎的科普与实践

    Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top