当前位置: 首页 > 工具软件 > GroupCache > 使用案例 >

golang中cache组件的使用之groupcache(一)

墨翔宇
2023-12-01

golang中cache组件有很多, 比如groupcache、bigcache等。 本文介绍groupcache的使用。

groupcache简介

groupcache是memcache的作者开源的一个项目,在许多情况下,它是memcached的替代品。

对比memcache,相似处:

  • 按键选择哪个对等体负责该键

不同处:

  • 不需要运行单独的一组服务器,从而大大减少了部署/配置的痛苦。Groupcache是一个客户端库,也是一个服务器。它连接到自己的对等点,形成分布式缓存。
    可以与存储服务集成,不需要单独部署。
  • 带有缓存填充机制。memcached只是说“Sorry, cache miss”,通常会导致无限数量的客户端加载大量数据,而groupcache坐标缓存填充使得一个key只会有一个加载,加载完成的数据共享给其他调用者。
  • 不支持版本控制的值。如果键"foo"是值"bar",键"foo"必须总是"bar"。既没有缓存过期时间,也没有显式的缓存收回。因此也没有CAS,也没有递增/递减.
  • 支持将热数据自动镜像到当前进程。这可以就近获取并且减少加载时间。
    比如从peer1中获取 key2,key2存在与peer2中, key2可以作为热热数据镜像到peer1中。
  • 当前仅适用于Go。

groupcache不支持更新,也不支持删除,数据的载入是通过 GetterFunc函数来操作的。
groupcache适合有高性能要求,数据无更新的场景。

使用

使用NewGroup初始化一个缓存组,需要指定一个GetterFunc
通过dest.SetString设置字符串类型的数据。
通过dest.SetProto设置proto(如grpc请求的返回值)类型的数据。
通过dest.SetBytes设置butes类型的数据。


	stringGroup = NewGroup(stringGroupName, cacheSize, GetterFunc(func(_ context.Context, key string, dest Sink) error {
		// 数据获取逻辑, 通过dest.SetString方法设值
		return dest.SetString("ECHO:")
	}))

使用Group.Get方法获取一个缓存值

var s string
err := stringGroup.Get(dummyCtx, fromChan, StringSink(&s))

如果未命中, groupcache会调用初始化时声明的GetterFunc来做数据载入

 类似资料: