Mecached Client for Golang

Apache
Google Go
跨平台
2016-02-26
盘古大叔

Memcached Client for Golang

golang版本的memcached客户端,使用二进制协议,支持分布式,支持连接池,支持多种数据格式

特性

  • 支持多server集群

  • 与memcached使用二进制协议通信

  • 支持连接池

  • 存储value支持golang基本数据类型:string、[]byte、int、int8、int16、int32、int64、bool、uint8、uint16、uint32、uint64、float32、float64、map、结构体,不需要单独转为string存储

  • Replace、Increment/Decrement、Delete、Append/Prepend命令支持cas原子操作

分布式集群

默认开启分布式集群,key按照一致性哈希算法分配到各server,当server无法连接时如果设置了SetRemoveBadServer(true)则自动被剔除server列表,等到恢复正常时再重新加入server列表

使用

下载
go get github.com/pangudashu/memcache
导入
package main

import(
    "fmt"
    "github.com/pangudashu/memcache"
)

func main(){

    //server配置
    s1 := &memcache.Server{Address: "127.0.0.1:12000", Weight: 50}
    s2 := &memcache.Server{Address: "127.0.0.1:12001", Weight: 20}
    s3 := &memcache.Server{Address: "127.0.0.1:12002", Weight: 20}
    s4 := &memcache.Server{Address: "127.0.0.1:12003", Weight: 10}

    //初始化连接池
    mc, err := memcache.NewMemcache([]*memcache.Server{s1, s2, s3, s4})
    if err != nil {
        fmt.Println(err)
        return
    }

    //设置是否自动剔除无法连接的server,默认不开启(建议开启)
    //如果开启此选项被踢除的server如果恢复正常将会再次被加入server列表
    mc.SetRemoveBadServer(true)

    mc.Set("test_key",true)
    fmt.Println(mc.Get("test_key"))

    //...

    mc.Close()
}
示例

example/example.go

命令列表

Get
根据key检索一个元素

【说明】
Get(key string [, format_struct interface{} ])(value interface{}, cas uint64, err error)

【参数】
key    要检索的元素的key
format 用于存储的value为map、结构体时,返回值将直接反序列化到format

【返回值】
value为interface,取具体存储的值需要断言
存储的value为map、结构体时,value将返回nil 

    type User struct {
        //...
    }

    var user User
    if _, _, e := mc.Get("pangudashu_struct", &user); e != nil {
        fmt.Println(e)
    } else {
        fmt.Println(user)
    }
Set
向一个新的key下面增加一个元素

【说明】
Set(key string, value interface{} [, expire ...uint32 ]) (res bool, err error)

【参数】
key    用于存储值的键名
value  存储的值,可以为string、[]byte、int、int8、int16、int32、int64、bool、uint8、uint16、uint32、uint64、float32、float64、map、struct等类型
expire 过期时间,默认0

【返回值】
设置成功res返回true,err返回nil,否则res返回false,err返回memcache.ErrNotStord

【注意】
int类型长度与系统位数相关,所以实际存储转为string,建议尽量使用具体长度的类型:int8、int16、int32、int64替换

    //demo
    var value uint32 = 360000000000
    mc.Set("test_value", value, 1800)
Add
向一个新的key下面增加一个元素,与Set类似,但是如果 key已经在服务端存在,此操作会失败

【说明】
Add(key string, value interface{} [, expire uint32 ]) (res bool, err error)

【参数】
同Set

【返回值】
同Set。
如果key已经存在,res返回false,err返回memcache.ErrKeyExists
Replace
替换已存在key下的元素,类似Set,但是如果服务端不存在key,操作将失败

【说明】
Replace(key string, value interface{} [, expire uint64 [, cas uint64 ]]) (res bool, err error)

【参数】
key    用于存储值的键名
value  存储的值
expire 过期时间
cas    数据版本号,原子替换,如果数据在此操作前已被其它客户端更新,则替换失败

    _,cas,_ := mc.Get("test_key")

    res, er := mc.Replace("test_key", "new value~", 0, cas) //每次更新操作数据的cas都会变,所以如果这个值在Get后被其它client更新了则返回false,err返回memcache.ErrKeyExists
Delete
删除一个元素

【说明】
Delete(key string [, cas uint64 ]) (res bool, err error)

【参数】
key 要删除的key
cas 数据版本号,如果数据在此操作前已被其它客户端更新,则删除失败

【返回值】
成功时返回 true,或者在失败时返回 false,如果key不存在err返回 memcache.ErrNotFound
Increment
增加数值元素的值,如果key不存在则操作失败

【说明】
Increment(key string [, delta int [, cas int ]]) (res bool, err error)

【参数】
key   要增加值的元素的key
delta 要将元素的值增加的大小,默认1
cas   数据版本号,只有当服务端cas没有变化时此操作才成功

【返回值】
成功时返回 true,或者在失败时返回 false,如果key不存在err返回memcache.ErrNotFound,如果cas版本号已变err返回memcache.ErrKeyExists

【注意】
Increment/Decrement只能操作value类型为int的值,其它任何类型均无法操作。(原因是memcached中在Incr/Decr处理时首先使用strtoull将value转为unsigned long long再进行加减操作,所以只有将数值存为字符串strtoull才能将其转为合法的数值)
Decrement
减小数值元素的值

【说明】
Decrement(key string [, delta int [, cas int ]]) (res bool, err error)

【参数】
同Increment
Flush
删除缓存中的所有元素

【说明】
Flush([ delay uint32 ]) (res bool, err error)

【参数】
delay 在flush所有元素之前等待的时间(单位秒)

【返回值】
成功时返回 true, 或者在失败时返回 false
Append
向已存在string元素后追加数据

【说明】
Append(key string, value string [, cas uint64 ]) (res bool, err error)

【参数】
key   用于存储值的键名
value 将要追加的值

【返回值】
成功时返回 false, 或者在失败时返回 false。 如果key不存在err返回memcache.ErrNotFound

【注意】
Append/Prepend只能操作string类型,尽管操作其它类型时也能转化为string,但是将导致数据原来的类型失效,也就是说Append/Prement能够成功,但是Get时将出错
Prepend
向已存在string元素前追加数据

【说明】
Prepend(key string, value string [, cas uint64 ]) (res bool, err error)

同Append
Version
获取memcached服务端版本

【说明】
Version(server *memcache.Server) (v string, err error)


【参数】
server server配置结构

【返回值】
memcached version

错误编码

  • ErrNotConn : Can't connect to server

  • ErrNotFound : Key not found

  • ErrKeyExists : Key exists

  • ErrInval : Invalid arguments

  • ErrNotStord : Item not stored

  • ErrDeltaBadVal : Increment/Decrement on non-numberic value

  • ErrMem : Out of memery

  • ErrInvalValue : Unkown value type

  • ErrInvalFormat : Invalid format struct

  • ErrNoFormat : Format struct empty

  • ErrUnkown : Unkown error

加载中

评论(0)

暂无评论

暂无资讯

暂无问答

memcached的安装和使用

在Linux下安装运行memcache cd /tmp #可去官网获取相关版本链接 wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz tar -zxvf libevent-2.0.20-s...

2012/10/30 12:41
1K
0
缓存-memcache

memcache 是常用的web应用缓存解决方案,配置简单,使用方便。功能上虽然比不上新星redis,但还是有自己的价值。

2016/02/18 15:52
119
1
PHP 常用缓存 APC,Memcache & Memcached

APC:Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。 链接地址:http://php.net/manual/en/book.apc...

2012/09/03 09:51
418
0
系统架构——从Memcache单点说起

一直都想写一篇关于系统架构方面的文章,但是由于水平有限都未能如愿。记得去年某个时间段的阿里电话面试时,一个关于Memcache的单点问题,我当时就被问蒙了,具体是:Server访问数据库时,一...

2014/02/04 16:12
588
0
PHP 安装memcached扩展

memcached扩展

2015/01/21 10:33
204
0
Memcache客户端安装和使用

一、memcached客户端安装 Memcached本身是使用C开发的,客户端可以是php、C#、或者java。我是做java的,所以这里只介绍基于java的客户端。 Memcached目前有三种java的客户端 (1)memcached...

2015/08/03 10:56
40
0
php处理cookie的一个“BUG”

在共享session的时候发现了一个‘BUG’

2015/06/26 11:45
54
1
php memcache与php memcached区别及相关问题

PHP有两个memcache客户端:php memcache和php memcached。 php memcache独立用php实现,是老客户端,从我们实践中已发现有多个问题,而且功能少,属性也可设置的少; php memcached是基于原生...

2014/11/14 13:15
8
0
PHP内存缓存的配置及使用

相信很多没有用过php_memcache的人都会觉得 PHP内存缓存是一个很复杂的东西,其实不然。 memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。 这里介绍memca...

2012/02/08 09:48
1K
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部