go gomemcache包源码分析

简介: go gomemcache包源码分析

因为beego中的cache模块中的子模块memcached引用了这个包,所以也对这包的源码进行分析了下。花了一定的时间编写整理这篇博客,这个包一共两个文件,源码文件
关于memcache学习,可以到http://www.runoob.com/memcached/memcached-tutorial.html这边教程学习

1)func New(server ...string) *Client
用法:
mc := memcache.New("127.0.0.1:11211")

主要可以分为以下步骤:
1、传入一个合法的memcached服务器地址信息
2、定义变量和赋值

New方法流程图如下,点击下载
image.png

2)func (c Client) Add(item Item) error
作用:
mc := memcache.New("127.0.0.1:11211")
mc.Add(&memcache.Item{Key:"data",Value:[]byte("你好!")})

主要可以分为以下步骤:
1、选择一个memcache服务器并获取连接
2、发送数据到memcached服务器
3、接收memcached信息和处理连接
Add方法流程图如下,点击下载
image.png

3)func (c Client) Set(item Item) error
用法:
mc := memcache.New("127.0.0.1:11211")
mc.Set(&memcache.Item{Key:"data",Value:[]byte("你好!")})

主要分为以下步骤:
1、选择一个memcached服务器并进行连接
2、向连接的那个memcached服务器发送数据并处理相关内容
3、连接处理(回收或释放)
Set方法流程图如下,点击下载
image.png

4)func (c Client) Get(key string) (item Item, err error)
用法:
mc := memcache.New("127.0.0.1:11211")
i, err := mc.Get("data")
fmt.Println(i, err)

主要可分为三个步骤
1:获取tcp连接
2:发送数据到memcached
3:处理memcached返回消息和tcp连接处理(放入回收池或释放)
Get方法流程图如下,点击下载
image.png

5)func (c Client) GetMulti(keys []string) (map[string]Item, error)
用法:
mc := memcache.New("127.0.0.1:11211")
items, err := mc.GetMulti([]string{"data1","data2","data3"})

主要可分为三个步骤
1:获取tcp连接
2:发送数据到memcached
3:处理memcached返回消息和tcp连接处理(放入回收池或释放)
GetMulti方法流程图如下,点击下载
image.png

6)func (c *Client) Increment(key string, delta uint64) (newValue uint64, err error)
用法:
mc := memcache.New("127.0.0.1:11211")
newVal, err := mc.Increment("test", 2)
fmt.Println(newVal, err)

作用:将原来键的值加上指定数,可分为以下两种情况:
1、如果原来的是一个数字,则加上指定数,返回修改后的值和nil
2、如果原来的不是一个数,则返回0和报错信息

内部执行步骤:
1、连接memcached服务器
2、发送数据到memcached服务器
3、断开连接,对连接进行回收或释放
Delete方法流程图如下,点击下载
image.png

7)func (c *Client) Decrement(key string, delta uint64) (newValue uint64, err error)
用法:
mc := memcache.New("127.0.0.1:11211")
newVal, err := mc.Decrement("test", 2)
fmt.Println(newVal, err)

作用:将原来键的值减去指定数,可分为以下两种情况:
1、如果原来的是一个数字,则减去指定数,返回修改后的值和nil
2、如果原来的不是一个数,则返回0和报错信息
Decrement方法流程图如下,点击下载
image.png

8)func (c Client) CompareAndSwap(item Item) error
用法:
mc := memcache.New("127.0.0.1:11211")
mc.CompareAndSwap(&memcache.Item{Key:"data",

Value:[]byte("你好!")})

封装发给memcached服务器的命令是:cas data 0 0 9 0
主要分为以下步骤:
1、选择一个memcached服务器地址并进行连接
2、向memcached服务器发送数据和处理服务器返回的信息
3、连接结束处理(回收或释放)
CompareAndSwap方法流程图如下,[点击下载]
(https://github.com/laijinhang/go-gomemcache-study/blob/master/CompareAndSwap方法.odg)
image.png

9)func (c *Client) FlushAll() error
用法:
mc := memcache.New("127.0.0.1:11211")
err := mc.FlushAll()

用于清理缓存中的所有 key=>value(键=>值) 对

主要可以分为以下步骤:
1、往每个memcached服务器发送数据和接收处理memcached信息
2、和处理连接
FlushAll方法流程图如下,点击下载
image.png

10)func (c *Client) Replace() error
用法:
mc := memcache.New("127.0.0.1:11211")
err := mc.Replace()
发送replace命令到mecmached服务器,该命令用于替换已存在的
key(键)的value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。

主要可以分为以下步骤:
1、往每个memcached服务器发送数据和接收处理memcached信息
2、和处理连接
Replace方法流程图如下,点击下载
image.png

11)func (c *Client) Touch(key string, seconds int32) (err error)
用法:
mc := memcache.New("127.0.0.1:11211")
err := mc.Touch("data", 120)
发送touch命令到mecmached服务器,如果key不存在,则会返回错误,
如果key存在,则会在设置的时间后自动删除。

主要可以分为以下步骤:
1、获取服务器地址操作
2、往每个memcached服务器发送数据和接收处理memcached信息
3、连接处理(回收或释放)
Touch方法流程图如下,点击下载
image.png

12)func (c *Client) Delete(key string) error
用法:
mc := memcache.New("127.0.0.1:11211")
err := mc.Delete("test")

将原有key对应的内容删除

主要可以分为以下步骤:
1、获取连接
2、发送数据到memcached服务器
3、接收memcached信息和处理连接
Delete方法流程图如下,点击下载
image.png

13)func (c *Client) DeleteAll() error

用法:
mc := memcache.New("127.0.0.1:11211")
err := mc.DeleteAll()
将内容删除
(和Delete共用一套实现代码)

主要可以分为以下步骤:
1、获取连接
2、发送数据到memcached服务器
3、接收memcached信息和处理连接
DeleteAll方法流程图如下,点击下载
image.png

相关链接:
源码链接:https://github.com/laijinhang/gomemcache
笔记链接:https://github.com/laijinhang/go-gomemcache-study

目录
相关文章
|
4月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
194 61
|
3月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
240 63
|
2月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
201 0
|
5月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
222 15
|
9月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
316 11
|
10月前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
345 8
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
11月前
|
Go 索引
go语言使用strings包
go语言使用strings包
227 3
|
11月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
158 3
|
12月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
103 0
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
395 3