• Go 使用mencached缓存


    1、mencached 介绍(以下简称mem)

    Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
    基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染。
    一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性
    Memcached 官网:https://memcached.org/
    github地址 :https://github.com/memcached/memcached/wiki/Install

    2、使用mem之前需要先安装服务端

    windows安装服务端的话去搜一下,我测试用的时候是ubuntu的

    2.1 ubuntu安装mem服务端

    1/本地包索引
    sudo apt update
    
    2/安装官方包
    sudo apt install memcached
    
    3/安装libmemcached-tools ,这是一个提供多种工具来与Memcached服务器配合使用的库
    sudo apt install libmemcached-tools
    
    4/这个时候应该是自己启动了,可以用命令查看一下
    memcached
    
    或者
    
    service memcached status
    
    或者
    
    lsof -i :11211
    
    
    5/查看端口是否存在
    netstat -ntlp
    ----
    tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      18846/memcached 
    
    
    
    6/重启和停止使用命令
    service memcached start
    
    service memcached restart
    
    service memcached stop
    
    
    • 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

    2.2 ubuntu修改mem配置文件

    1/ 使用 which memcached 查看安装目录:一般都在 /usr/bin/memcached
    
    2/ 配置文件目录在: /etc/
    
    vim  /etc/memcached.conf
    
    要检查接口设置,请在文件中找到以下行:
    -l 127.0.0.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    3、Go 整合mem (相当于前面的准备是服务端,现在需要使用它了)

    我使用的 gin 来测试缓存的,大部分都一样,有些包就自己下载,也可以看我之前写的gin整合

    3.1、目录结构

    go-cashe
    ├─ main.go
    ├─ memcached
    │  └─ mem.go
    └─ README.md
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2、主要代码:mem.go

    其中常用的代码我都写上去了,不满足需求的话可以自己去网上搜索一下

    package memcached
    
    import (
    	"fmt"
    
    	"github.com/bradfitz/gomemcache/memcache"
    )
    
    //这里可以写多个,用逗号分隔
    var mc = memcache.New("你的ip:11211")
    
    //set 和add 方法的区别
    // 如果要设置的key不存在时,则set方法与add方法的效果一致
    // 如果要设置的key已经存在时,则set方法与replace方法效果一样
    
    //增加缓存 Set方法
    func SetMemCasheKey(key string, value string) bool {
    	s := &memcache.Item{
    		Key:        key,
    		Value:      []byte(value),
    		Flags:      0,   //应该是多个服务器地址是否能相互获取的意思
    		Expiration: 100, //过期时间 秒为单位
    	}
    	err := mc.Set(s)
    	if err != nil {
    		fmt.Printf("错误: %s", err.Error())
    		return false
    	}
    	return true
    }
    
    //增加缓存 add方法
    func SetMemCasheAdd(key string, value string) bool {
    	s := &memcache.Item{
    		Key:        key,
    		Value:      []byte(value),
    		Flags:      0,   //应该是多个服务器地址是否能相互获取的意思
    		Expiration: 100, //过期时间
    	}
    	err := mc.Add(s)
    	if err != nil {
    		return false
    	}
    	return true
    }
    
    //获取Key
    func GetMemCasheValueString(key string) string {
    	item, err := mc.Get(key)
    	if err != nil {
    		return ""
    	}
    	fmt.Println("获取的key :" + item.Key)
    	return string(item.Value)
    }
    
    //替换缓存的值
    func ReplaceMemCasheValue(key string, value string) bool {
    	s := &memcache.Item{
    		Key:        key,
    		Value:      []byte(value),
    		Flags:      0,
    		Expiration: 100,
    	}
    	err := mc.Replace(s)
    	if err != nil {
    		return false
    	}
    	return true
    }
    
    //删除key
    func DeleteMemCasheValue(key string) bool {
    
    	if mc.Delete(key) != nil {
    		return false
    	}
    	return true
    }
    
    //删除全部
    func DeleteMemCasheAll() {
    	mc.DeleteAll()
    }
    
    
    • 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
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    3.3、主要代码:main.go

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"strom-huang-go/go-cashe/memcached"
    
    	"github.com/gin-gonic/gin"
    )
    
    func main() {
    
    	//测试memcache缓存
    	r := gin.Default()
    	r.GET("/memCashe/:uid", func(c *gin.Context) {
    		uid := c.Param("uid")
    
    		s := memcached.GetMemCasheValueString(uid)
    		if len(s) > 0 {
    			fmt.Println("缓存有值---" + s)
    		} else {
    			memcached.SetMemCasheKey(uid, "hello")
    			s = "hello"
    		}
    		c.JSON(http.StatusOK, gin.H{
    			"message": s,
    		})
    	})
    	r.Run("127.0.0.1:8080")
    }
    
    
    • 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

    4、简单测试结果

    go run main.go 后控制台输出
    浏览器输入:
    http://127.0.0.1:8080/memCashe/123

    在这里插入图片描述

    5、补充一个小知识

    go run -race main.go
    -race 參數是 go 的 Race Detector,內建整合工具,可以輕鬆檢查出是否有 race condition

    5、文档代码地址

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

  • 相关阅读:
    Nuxt 菜鸟入门学习笔记六:路由
    FFplay文档解读-48-多媒体过滤器二
    数据治理-度量指标
    xilinx的原语的使用
    【网站公告】切换微信扫码登录所使用的服务号
    Redis集群方式
    Drake安装&环境配置——基于模型的机器人设计和验证
    变分自编码器VAE
    【LeetCode】合并石头的最低成本 [H](动态规划)
    【CVPR2020】DEF:Seeing Through Fog Without Seeing Fog论文阅读分析与总结
  • 原文地址:https://blog.csdn.net/bei_FengBoby/article/details/126011916