Go语言BigCache,使用入门教程!

go内存缓存BigCache使用入门详解

 更新时间:2023年09月06日 09:17:39   作者:海生  
这篇文章主要为大家介绍了go内存缓存BigCache使用入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

一、介绍

bigcache是一个内存缓存系统,用于存储键值对数据。没有gc操作。使用的时候需要序列化(反)。
bigcache的源代码在 https://github.com/allegro/bigcache几个特征,存储通过[]byte,没有过期时间。

二、安装

我们安装最新的v3版本

1
go get -u github.com/allegro/bigcache/v3

安装完成后,我们就可以在go语言中使用bigcache了。下面是一些简单的示例。

三、使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func TestSetGet(t *testing.T) {
    // new一个bigCache对象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
 
    // get获取一个无值的key
    vNil, err := cache.Get("key")
    t.Log(vNil, err) // [] Entry not found 值为空的[]字节slice
 
    // set 存储数据
    cache.Set("key", []byte("value"))
    // get 获取数据
    v, _ := cache.Get("key")
    t.Log(v)         // 输出 [118 97 108 117 101]
    t.Log(string(v)) // 输出 value
}

我们看一下 Set和Get方法的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Set saves entry under the key
func (c *BigCache) Set(key string, entry []byte) error {
    hashedKey := c.hash.Sum64(key)
    shard := c.getShard(hashedKey)
    return shard.set(key, hashedKey, entry)
}
 
// Get reads entry for the key.
// It returns an ErrEntryNotFound when
// no entry exists for the given key.
func (c *BigCache) Get(key string) ([]byte, error) {
    hashedKey := c.hash.Sum64(key)
    shard := c.getShard(hashedKey)
    return shard.get(key, hashedKey)
}

在Set()方法,存储值为 []byte 字节slice类型,所以我们保存的时候,需要序列化数据成[]byte
而在Get()方法,获取的值为[]byte,我们此时需要反序列化[]byte成原来的类型。

3、1 string类型的 存储与获取以及修改

string类型可以用[]byte和类型,互相的方便转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
func TestSetGet(t *testing.T) {
    // new一个bigCache对象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // get获取一个无值的key
    vNil, err := cache.Get("key")
    t.Log(vNil, err) // [] Entry not found 值为空的[]字节slice
    // set 存储数据
    cache.Set("key", []byte("value"))
    // get 获取数据
    v, _ := cache.Get("key")
    t.Log(v)         // 输出 [118 97 108 117 101]
    t.Log(string(v)) // 输出 value
}

3、2 非string类型的 存储与获取以及修改

非string类型,转成[]byte,比较复杂,在go内置的库中,唯有json库,提供了这样的方法。可以把非string的任意类型,转成[]byte,如下。

1
2
func Marshal(v any) ([]byte, error) // 序列化
func Unmarshal(data []byte, v any) error // 反序列化

在这里我们也使用json的序列化(反)方法,来和[]byte互转。

3、2、1 slice切片类型的存储与获取以及修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// TestSetGetSlice slice类型
func TestSetGetSlice(t *testing.T) {
    // new一个bigCache对象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // slice 存储数据
    s := []string{"1", "2"}
    bs, _ := json.Marshal(s)
    cache.Set("s", bs)
    // get获取值
    bsv, _ := cache.Get("s")
    var s2 []string = make([]string, 0)
    _ = json.Unmarshal(bsv, &s2)
    t.Log(s2)
    // 修改数据,修改s2,查看是否会影响内存中的值
    // 答案是不影响
    s2 = append(s2, "3")
    t.Log(s2)
    var s3 []string = make([]string, 0)
    _ = json.Unmarshal(bsv, &s3)
    t.Log(s3)
}

3、2、2 struct结构体类型的存储与获取以及修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// TestSetGetStruct 结构体指针
func TestSetGetStruct(t *testing.T) {
    // new一个bigCache对象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // 结构体struct 存储数据
    type st struct {
        Value string
    }
    s := &st{
        Value: "v1",
    }
    bs, _ := json.Marshal(s)
    cache.Set("s", bs)
    // get获取值
    bsv, _ := cache.Get("s")
    var s2 st
    _ = json.Unmarshal(bsv, &s2)
    t.Log(s2) // {v1}
    // 修改数据,修改s2,查看是否会影响内存中的值
    // 答案是不影响
    s2.Value = "v2"
    t.Log(s2) // {v2}
    var s3 st
    _ = json.Unmarshal(bsv, &s3)
    t.Log(s3) // {v1}
}

结论

bigcache可以安全使用,修改获取后的是,也不影响原来内存中的值。

以上就是go内存缓存BigCache使用入门详解的详细内容,更多关于go内存缓存BigCache的资料请关注脚本之家其它相关文章!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://segmentfault.com/a/1190000044169849

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • 完美解决beego 根目录不能访问静态文件的问题

    完美解决beego 根目录不能访问静态文件的问题

    下面小编就为大家带来一篇完美解决beego 根目录不能访问静态文件的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • golang 跳出for循环操作

    golang 跳出for循环操作

    这篇文章主要介绍了golang 跳出for循环操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang 如何删除二进制文件中的源码路径信息

    golang 如何删除二进制文件中的源码路径信息

    这篇文章主要介绍了golang 如何删除二进制文件中的源码路径信息,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 执行go vendor第三方包版本冲突问题解决

    执行go vendor第三方包版本冲突问题解决

    这篇文章主要为大家介绍了执行go vendor时,第三方包go版本冲突问题的解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • mac下golang安装了windows编译环境后编译变慢

    mac下golang安装了windows编译环境后编译变慢

    这篇文章主要介绍了mac下golang安装了windows编译环境后编译变慢的处理方法,非常的简单,有相同问题的小伙伴可以参考下。
    2015-04-04
  • Go语言Telnet回音服务器的实现

    Go语言Telnet回音服务器的实现

    这篇文章主要介绍了Go语言Telnet回音服务器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 在Golang中使用Redis的方法示例

    在Golang中使用Redis的方法示例

    这篇文章主要介绍了在Golang中使用Redis的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • go与go mod命令使用方式以及遇到的问题

    go与go mod命令使用方式以及遇到的问题

    这篇文章主要介绍了go与go mod命令使用方式以及遇到的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 详解go-zero如何实现计数器限流

    详解go-zero如何实现计数器限流

    这篇文章主要来和大家说说限流,主要包括计数器限流算法以及具体的代码实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • Go语言基础变量的声明及初始化示例详解

    Go语言基础变量的声明及初始化示例详解

    这篇文章主要为大家介绍了Go语言基础变量的声明及初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2021-11-11

最新评论

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空