gin 十一. gin-contrib之cache 缓存

一. 基础

  1. gin/contrib/cache 是一个 Gin 框架的中间件,它提供了一套简单易用的缓存解决方案,支持一下功能:
  1. 缓存 HTTP 请求结果,提高网站性能。
  2. 支持多种缓存引擎,包括内存缓存、Redis 缓存、HTTP 缓存等。
  3. 内置多种缓存策略,如 LRU 策略、LFU 策略、FIFO 策略等。
  4. 可以自定义缓存键值,支持缓存在不同的命名空间中,避免键值冲突。
  5. 支持缓存过期时间,在缓存过期后自动失效。
  6. 提供了 CachePage 函数,可以直接将函数结果缓存,避免重复计算。
  7. 支持自定义缓存序列化和反序列化方式,方便缓存存储复杂数据类型。
  8. 支持附加缓存标记,为缓存添加额外的元信息
  1. 在操作redis与github.com/go-redis/redis对比各自的优缺点

gin/contrib/cache提供了一套完整的缓存解决方案,包括 Redis、内存、http 等多种缓存方式,但是与github.com/go-redis/redis对比缓存策略相对简单,不支持 Redis 数据类型之间的互相转换。
不支持复杂的 Redis 命令,比如事务操作、流水线操作等

api 概述

  1. 通过"github.com/gin-contrib/cache/persistence"获取缓存引擎实例相关
//创建一个内存缓存引擎实例
//defaultExpiration:缓存默认的过期时间
NewInMemoryStore(defaultExpiration time.Duration) *persistence.InMemoryStore

//创建一个基于 Redis 的缓存引擎实例
//url:Redis 连接地址
//password:Redis 密码
//db:Redis 数据库序号
//keyPrefix:缓存键的前缀
NewRedisCachePool(url string, password string, db int, keyPrefix string) (*persistence.RedisCachePool, error)

//创建一个文件缓存引擎实例
//path:缓存文件存储路径
NewFileStore(path string) *persistence.FileStore

//创建一个基于 Memcache 的缓存引擎实例
//address:Memcache 服务器地址
//defaultExpiration:缓存默认的过期时间
NewMemcacheStore(address string, defaultExpiration time.Duration) *persistence.MemcacheStore
//创建一个基于 Ristretto 的缓存引擎实例
//config:Ristretto 缓存配置参数
NewRistrettoCache(config *ristretto.Config) *persistence.RistrettoCache

//定义了缓存引擎对象必须实现的方法,包括数据读取、写入、删除等操作
type CacheStore
//内存缓存类型,实现了 CacheStore 接口,可以将缓存数据保存在内存中
type InMemoryStore
//基于 Redis 的缓存引擎类型,实现了 CacheStore 接口,可以将缓存数据保存在 Redis 中
type RedisCachePool
//文件缓存类型,实现了 CacheStore 接口,可以将缓存数据保存到本地磁盘中
type FileStore
//基于 Memcache 的缓存引擎类型,实现了 CacheStore 接口,可以将缓存数据保存在 Memcached 中
type MemcacheStore
//基于 Ristretto 的缓存引擎类型,实现了 CacheStore 接口,可以将缓存数据保存在内存中
type RistrettoCache
  1. "gin/contrib/cache"操作缓存数据相关
//使用指定的缓存策略将请求结果缓存到指定的缓存引擎中,如果缓存中存在数据就直接返回,否则执行业务逻辑
//store:缓存引擎对象,实现了 cache.CacheStore 接口
//expire:缓存过期时间
//handler:请求处理函数,需要返回被缓存的数据
cache.CachePage(store cache.CacheStore, expire time.Duration, handler gin.HandlerFunc) gin.HandlerFunc
//使用指定的缓存策略将请求结果缓存到指定的缓存引擎中,在写入缓存之前使用互斥锁保证了线程安全。
//此外,此函数还需要一个回调函数 getFunc,每次读取缓存时,它将根据需要执行此回调函数,并返回新的响应对象。
//当然,如果缓存本身已经命中,则无需执行回调函数。
CachePageAtomic(store cache.CacheStore, getFunc HandlerFunc) gin.HandlerFunc
//与 CachePageAtomic() 类似,但不缓存 HTTP 响应头,如果只需要缓存响应体,则可以使用此函数。
CachePageWithoutHeader(store cache.CacheStore, getFunc HandlerFunc) gin.HandlerFunc
//与 CachePageAtomic() 类似,但在缓存时不考虑查询参数
//如果您的路由响应是无状态的(即不依赖于查询参数),则可以使用此函数进一步优化缓存效果。
CachePageWithoutQuery(store cache.CacheStore, getFunc HandlerFunc) gin.HandlerFunc
//与 CachePage() 函数类似,但是通过 keyFunc 参数指定了自定义的缓存键生成函数
//keyFunc:缓存键生成函数,接收一个 *gin.Context 参数,返回一个字符串类型的键值
cache.CachePageWithKeyProvider(store cache.CacheStore, expire time.Duration, keyFunc cache.KeyGeneratorF, handler gin.HandlerFunc) gin.HandlerFunc
//设置 HTTP 缓存响应头,告诉客户端如何缓存响应内容
//maxAge:缓存时长,单位为秒
//cacheType:缓存类型,可以是 "public" 表示对所有用户都可缓存,也可以是 "private" 表示仅对某些用户可缓存
cache.CacheControl(maxAge int, cacheType string) gin.HandlerFunc
//返回 304 响应,表示请求的资源没有被修改过,可以使用客户端缓存的版本
//etag:资源标识符,可以是文件的 MD5 值、版本号等
cache.CacheNotModified(etag string) gin.HandlerFunc
//默认的缓存键生成函数,根据请求 URL 和查询参数生成缓存键。可以通过 CachePage() 函数的 keyFunc 参数替换成自定义的缓存键生成函数
cache.CacheKeyFunc
//缓存项类型,包含缓存键、缓存值、过期时间等信息
cache.CacheItem
//拦截器类型,用于在处理 HTTP 请求时检查是否存在缓存。如果存在缓存,则直接返回缓存数据,否则执行业务逻辑生成缓存数据并保存
cache.CacheInterceptor
//从指定的缓存引擎中读取指定键的缓存数据,返回一个字节数组和一个错误对象
cache.GetFromCache(store cache.CacheStore, key string) ([]byte, error)
//从指定的缓存引擎中删除指定键的缓存数据,返回一个错误对象
cache.DeleteFromCache(store cache.CacheStore, key string) error
//将指定的缓存数据写入到指定的缓存引擎中,返回一个错误对象
//data:缓存数据的字节数组
//expire:缓存的过期时间
cache.SetToCache(store cache.CacheStore, key string, data []byte, expire time.Duration) error
//基于请求 URL 和指定的查询参数生成缓存键的函数,返回一个缓存键生成函数
cache.KeyGeneratorFWithQueryParams(params ...string) cache.KeyGeneratorF
//文件缓存类型,实现了 cache.CacheStore 接口,可以将缓存数据保存到本地磁盘中
cache.CacheFile
//内存缓存类型,实现了 cache.CacheStore 接口,可以将缓存数据保存在内存中
cache.CacheInMemory
//接口:定义了缓存引擎需要实现的接口,包括缓存数据的读取、写入、删除等操作
cache.CacheStore
//类型:自定义的缓存键生成函数类型,接收一个 *gin.Context 参数,返回一个字符串类型的键值
cache.KeyGeneratorF

二. 内存级缓存示例

package main
import (
	"time"
	cache "github.com/gin-contrib/cache"
	"github.com/gin-contrib/cache/persistence"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	//使用内存缓存引擎,设置默认过期时间为 5 分钟(0表示永久)
	store := persistence.NewInMemoryStore(time.Minute * 5)


	r.GET("/data", cache.CachePage(store, time.Minute, func(c *gin.Context) {
		// 在这里处理业务逻辑,并将结果保存到缓存中
		data := []byte("some data")
		c.Writer.Write(data)
	}))

	r.GET("/cache", cache.CachePage(store, func(c *gin.Context) (interface{}, time.Time, error) {
		// 在这里读取数据并返回要缓存的数据、缓存时间和可能存在的错误
		data := "Hello, this is cache page!"
		return data, time.Now(), nil
	}, func(c *gin.Context) string {
		// 自定义缓存 key 的生成方式,比如根据请求参数生成 key
		return c.Query("id")
	}))

	r.Run()
}

三. 操作redis示例

  1. 代码示例
func main() {
	r := gin.Default()
	// 创建一个基于redis的缓存存储对象,设置过期时间为1分钟
	store := persistence.NewRedisCache("localhost:6379", "", time.Minute)

	//使用CachePage()中间件,将数据缓存到store中(在操作redis时,好像不支持自定义key)
	r.GET("/cache_ping", cache.CachePage(store, time.Minute, func(c *gin.Context) {
		c.String(200, "你好啊")
	}))
	
	// 启动服务
	r.Run(":8080")
}
  1. 生成key规则如下"gincontrib.page.cache:%2Fcache_ping"
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值