• Go 使用 freecache 缓存


    1、freecache 介绍(以下简称free)

    用于 Go 的缓存库,具有零 GC 开销和高并发性能, 厉不厉害?

    2、 free 获取

    git官网: https://github.com/coocood/freecache
    golang 获取:go get -u github.com/coocood/freecache
    个人觉得比较好的文档:(不得不说大佬就是写得好)
    https://juejin.cn/post/7072121084136882183
    https://cdmana.com/2022/03/202203071328243883.html

    3、golang 整合 free

      go-cashe
      ├─ .vscode
      │ └─ launch.json
      ├─ freecache
      │ └─ free.go
      ├─ main.go
      ├─ README-free.md

        3.1、主要代码 (free.go)

        
        import (
        	"github.com/coocood/freecache"
        )
        
        //初始化Cache
        // freecache.NewCacheCustomTimer(100*1024*1024, freecache.NewCachedTimer()) 这种方式也可以
        var cache = freecache.NewCache(100 * 1024 * 1024)
        
        //定一个 model struct
        type FreeCasheModel struct {
        	Key           []byte
        	Value         []byte
        	ExpireSeconds int //过期时间-s
        }
        
        //Get
        func FreeGet(free FreeCasheModel) (string, bool) {
        	value, err := cache.Get(free.Key)
        	if err != nil {
        		return "", false
        	}
        	return string(value), true
        }
        
        //GetOrSet
        //如果没有就存入新的key
        func FreeCacheGetOrSet(free FreeCasheModel) (string, bool) {
        	retValue, err := cache.GetOrSet(free.Key, free.Value, free.ExpireSeconds)
        	if err != nil {
        		return "", false
        	}
        	return string(retValue), true
        }
        
        //Set
        func FreeCacheSet(free FreeCasheModel) bool {
        	err := cache.Set(free.Key, free.Value, free.ExpireSeconds)
        	if err != nil {
        		return false
        	}
        	return true
        }
        
        //SetAndGet
        func FreeCacheSetAndGet(free FreeCasheModel) (string, bool) {
        	retValue, found, err := cache.SetAndGet(free.Key, free.Value, free.ExpireSeconds)
        	if err != nil {
        		return "", false
        	}
        	return string(retValue), found
        }
        
        //更新key的过期时间--如果这个key不存在会返回错误
        func FreeChasheTouch(free FreeCasheModel) bool {
        	err := cache.Touch(free.Key, free.ExpireSeconds)
        	if err != nil {
        		return false
        	}
        	return true
        }
        
        //删除---
        func FreeCasheDel(free FreeCasheModel) bool {
        	return cache.Del(free.Key)
        }
        
        • 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
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        • 47
        • 48
        • 49
        • 50
        • 51
        • 52
        • 53
        • 54
        • 55
        • 56
        • 57
        • 58
        • 59
        • 60
        • 61
        • 62
        • 63
        • 64
        • 65
        • 66

        4、简单测试

        在这里插入图片描述

        5、补充说明

        1、代码看起来很简单,但是要多看源码多看文档是怎么实现的
        2、 如果要测试性能问题老师们可以自己去测试,这里只是简单的实现一下
        3、 上篇文档我写了memcached的缓存,我觉得这个更简单一些,但是应用场景是不一样的, memcached主要是分布式循环,多个项目可以同时去访问,free更适合单项目,并发高访问量多的。

        6、文档代码地址

        https://gitee.com/hjx_RuGuoYunZhiDao/strom-huang-go.gitgo-cashe目录

      • 相关阅读:
        Handler消息机制,postDelayed会造成线程阻塞吗?对内存有什么影响?
        Egg使用jwt拦截jtoken验证
        Maven中plugin配置说明
        推荐 系统
        Java注解详解和自定义注解实战,用代码讲解
        微服务技术发展
        基于Java+SpringBoot+Vue前后端分离在线课程管理系统设计和实现
        天猫淘宝卡券包演进史
        Java 中数据结构LinkedList的用法
        【单片机】唯一设备ID UID固件加密
      • 原文地址:https://blog.csdn.net/bei_FengBoby/article/details/126017061