当前位置: 首页 > article >正文

2-测试bigcache做进程内缓存 --开源项目obtain_data测试

2-测试bigcache做进程内缓存

1.bigcache做进程内缓存测试效果

a.测试页面

测试页面:--这里使用 Postman 来做测试
http://127.0.0.1:8000/novels/getone/4
http://127.0.0.1:8000/novels/getone/5
http://127.0.0.1:8000/novels/getone/6

在这里插入图片描述

b.测试效果

查看终端:
直接使用mysql数据库查询数据时间比较长;
使用 bigcache 做进程内缓存用时比较短。
使用 bigcache 缓存可以缩短查找数据的时间10倍以上。

在这里插入图片描述

2.bigcache做进程内缓存代码实现

a.程序从main函数开始

/main.go
操作:
1.先配置 bigcache

err = global.SetupGlobalCache()
if err != nil {
	log.Fatalf("init.SetupGlobalCache err: %v", err)
}

在这里插入图片描述

b.路由的路径映射

/routers/routers.go
操作:
1.测试需要一个路由

	//小说路由部分
	novels_r := r.Group("/novels/")
	{
		//获取一篇小说详情
		novels_c := controllers.NewNovelsController()
		novels_r.GET("/getone/:id", novels_c.GetOne)
	}

在这里插入图片描述

c.在控制器中增加GetOne方法

/controllers/novelsController.go
操作:
1.获取参数
2.将参数带入服务中查找数据
3.返回数据

// 得到一篇文章的详情
func (a *NovelsController) GetOne(c *gin.Context) {
	result := result.NewResult(c)
	param := request.Request{ID: validCheck.StrTo(c.Param("id")).MustUInt64()}
	valid, _ := validCheck.BindAndValid(c, &param)
	if !valid {
		result.Error(global.ErrParam)
		return
	}

	novelsOne, err := service.GetOneNovels(param.ID)
	if err != nil {
		result.Error(global.ErrArticleNot)
	} else {
		result.Success(&novelsOne)
	}
}

在这里插入图片描述

d.在服务里获取一篇文章

/service/novels.go
操作:
1.想看缓存中有没有查找的数据
2.如果有,就把数据返回到控制器
3.如果缓存中没有,就到mysql中查找,然后把数据保存到 bigcache 缓存,最后返回数据

// 得到一篇文章的详情
func GetOneNovels(id uint64) (*model.Novels, error) {
	//get from bigcache
	novels, err := cache.GetOneNovelsCache(id)
	if err != nil {
		//get from mysql
		novels, errSel := dao.SelectOneNovels(id)
		if errSel != nil {
			return nil, errSel
		} else {
			//set bigcache
			errSet := cache.SetOneNovelsCache(id, novels)
			if errSet != nil {
				return nil, errSet
			} else {
				return novels, errSel
			}
		}
	} else {
		return novels, err
	}
}

在这里插入图片描述

e.cache的设置与获得

/cache/novels.go
操作:
1.bigcache中索引的名字
2.从bigcache得到一篇文章
3.向bigcache保存一篇文章

package cache

import (
	"encoding/json"
	"fmt"
	"strconv"

	"gitee.com/wao520/obtain_data/global"
	"gitee.com/wao520/obtain_data/model"
)

// bigcache中索引的名字
func getNovelsCacheName(id uint64) string {
	return "novels_" + strconv.FormatUint(id, 10)
}

// 从bigcache得到一篇文章
func GetOneNovelsCache(id uint64) (*model.Novels, error) {
	key := getNovelsCacheName(id)
	val, err := global.BigCache.Get(key)

	if err != nil {
		return nil, err
	} else {
		novels := model.Novels{}
		if err := json.Unmarshal([]byte(val), &novels); err != nil {
			return nil, err
		}
		return &novels, nil
	}
}

// 向bigcache保存一篇文章
func SetOneNovelsCache(id uint64, novels *model.Novels) error {
	key := getNovelsCacheName(id)
	content, err := json.Marshal(novels)
	if err != nil {
		fmt.Println(err)
		return err
	}
	errSet := global.BigCache.Set(key, []byte(content))
	if errSet != nil {
		return errSet
	}
	return nil
}

在这里插入图片描述

f.全局的bigcache

/global/bigCache.go
操作:
1.定义一个全局的bigcache

package global

import (
	"github.com/allegro/bigcache"
	"log"
	"time"
)
//定义一个全局的bigcache
var (
	BigCache *bigcache.BigCache
)

//创建一个全局的bigcache
func SetupGlobalCache() (error) {
	config := bigcache.Config {
		Shards: 1024,   			// 存储的条目数量,值必须是2的幂
		LifeWindow: 5*time.Minute,	// 超时后条目被处理
		CleanWindow: 2*time.Minute, //处理超时条目的时间范围
		MaxEntriesInWindow: 0,		// 在 Life Window 中的最大数量,
		MaxEntrySize: 0,			// 条目最大尺寸,以字节为单位
		HardMaxCacheSize: 0,		// 设置缓存最大值,以MB为单位,超过了不在分配内存。0表示无限制分配
	}
    var initErr error
	BigCache, initErr = bigcache.NewBigCache(config)
	if initErr != nil {
		log.Fatal(initErr)
		return initErr
	}
	return nil
}

在这里插入图片描述

g.数据库查询一条记录

/dao/novels.go
操作:
1.从mysql数据库查询一条记录

package dao

import (
	"gitee.com/wao520/obtain_data/global"
	"gitee.com/wao520/obtain_data/model"
)

// 查询一条novels记录
func SelectOneNovels(id uint64) (*model.Novels, error) {
	fields := []string{"id", "title", "author", "genre", "description"}
	novelsOne := &model.Novels{}
	err := global.DBLink.Select(fields).Where("id=?", id).First(&novelsOne).Error
	if err != nil {
		return nil, err
	} else {
		return novelsOne, nil
	}
}

在这里插入图片描述

h.创建数据表模型

/model/novels.go
操作:
1.可以使用模型获取数据库数据

package model

type Novels struct {
	Id          uint64 `gorm:"column:id" json:"id"`
	Title       string `gorm:"column:title" json:"title"`
	Author      string `gorm:"column:author" json:"author"`
	Genre       string `gorm:"column:genre" json:"genre"`
	Description string `gorm:"column:description" json:"description"`
}

func (Novels) TableName() string {
	return "novels"
}

在这里插入图片描述

3.获取开源项目

a.gin框架中用bigcache做进程内缓存

b.本测试代码下载


http://www.kler.cn/a/408002.html

相关文章:

  • Qt入门1——认识Qt的几个常用头文件和常用函数
  • 【Unity】 GamePlay开发:通用的检查点/成就/条件触发系统
  • 【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化
  • 相机网卡开启巨型帧和关闭节能模式方法
  • 蚁群算法(Ant Colony Optimization, ACO)
  • 大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?
  • Python爬虫:获取1688店铺详情的实战指南
  • JMeter监听器与压测监控之 InfluxDB
  • 在Excel中处理不规范的日期格式数据并判断格式是否正确
  • 【JAVA面试题】什么是Springboot的自动配置以及注意事项
  • 【深度学习之回归预测篇】基于卷积神经网络(CNN)的数据回归预测
  • 第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理
  • 如何在react中使用 indexDb
  • 用axios和fetch分别封装请求
  • RK3588开发板中编译安装opencv
  • java中链表的数据结构的理解
  • 【超详细】C#基础-基本运算、语句
  • DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别
  • springmvc 用了 @RequestMapping 是不是可以不用
  • CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
  • 基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现四
  • aws ses生产环境申请
  • 前端实习第四周小结
  • Spring Boot 和 Spring Cloud 微服务开发实践详解
  • 反向代理模块开发
  • 【linux】(17)压缩和解压