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
2.2 ubuntu修改mem配置文件
1/ 使用 which memcached 查看安装目录:一般都在 /usr/bin/memcached
2/ 配置文件目录在: /etc/
vim /etc/memcached.conf
要检查接口设置,请在文件中找到以下行:
-l 127.0.0.1
3、Go 整合mem (相当于前面的准备是服务端,现在需要使用它了)
我使用的 gin 来测试缓存的,大部分都一样,有些包就自己下载,也可以看我之前写的gin整合
3.1、目录结构
go-cashe
├─ main.go
├─ memcached
│ └─ mem.go
└─ README.md
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()
}
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")
}
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目录