当前位置: 首页 > 软件库 > 程序开发 > 缓存系统 >

Mecached Client for Golang

Golang版分布式高速缓存
授权协议 Apache
开发语言 Google Go
所属分类 程序开发、 缓存系统
软件类型 开源软件
地区 国产
投 递 者 伏子辰
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

  • /** * Deletes an object from cache given cache key, a delete time, and an optional hashcode. * * The item is immediately made non retrievable.<br/> * Keep in mind {@link #add(String, Object)

  • 注:LinkedIn有个三人小组出来创业了—正是当时开发出Apache Kafka实时信息列队技术的团队成员,基于这项技术Jay Kreps带头创立了新公司Confluent。Confluent的产品围绕着Kafka做的。什么是Confluent Platform?Confluent Platform 是一个流数据平台,能够组织管理来自不同数据源的数据,拥有稳定高效的系统。         Con

  • MQTT短连接 package test import ( "fmt" "time" MQTT "github.com/eclipse/paho.mqtt.golang" LOG "github.com/sirupsen/logrus" ) func main() { opts := MQTT.NewClientOptions() opts.AddBroker("tcp://1

  • client.go 文件 内容总括: ① 首先 定义了客户端对象, 以及客户端的send发送请求获取响应的方法(调用了内部send方法),获取截止时间方法、获取往返处理器方法; ② 然后 内部send方法实现,主要是判断请求内容,以及使用 RoundTripper 发送请求获取响应, 判断响应并返回响应; ③ 然后 内部setRequestCancel 设置请求体取消方法实现; ④ 然后 重定向检

  • 5、memcached-client操作 如果我们没有memcache.dll文件,我们能不能去操作memcached 内存数据呢? 特点: 1.不需要开启memcache扩展 2.使用fsockopen()套接字连接memcached 3.同样执行执行CRUD PHP如何关闭notice级别的错误提示 1、在php.ini文件中改动error_reporting 改为: error_report

  • golang源码分析:sarama kafka client(part III:client的角色) - 墨天轮 理解client的角色对我们理解kafka和sarama非常有帮助。下面将一一详细介绍:         我们用到了各种各样的client,返回的对象都是一个Broker的指针,本质上讲,我们通过kafka client 最终都是和broker通信,所以用Broker对象封装和kafk

  • Author: FreeKnightDuzhi ---------------------------------------------------------------------------------------- Memcache++Client ------------------------------------------ 1:Memcached 是什么? ----------

  • rpc连接过多浪费资源,循环利用 package rpc import ( "sync" ) var rpcClientPoolMap map[string]*connPool func init() { rpcClientPoolMap = make(map[string]*connPool) } type connPool struct { name

  • client端 package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/url" ) func main() { request_url := "http://localhost:8080/" // 要 POST的 参数 form := url.Values{ "name": {"xiaoming"},

  • 问题:go mod 添加github.com/docker/docker之后版本是v1.13.1。此版本较老。 解决: 在go.mod文件中添加 replace github.com/docker/docker v1.13.1 => github.com/docker/engine v19.03.6 后面的tags号替换最新的。编译之后会改变。 这样就可以用最新的sdk的api了。 参考:htt

  • 利用上下文来取消 当前发送出去的请求 // tsetStudy1 project main.go package main import ( "context" "fmt" "net/http" ) func main() { url := "http://localhost:8080" client := &http.Client{} reqest, err := http.Ne

  • using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Memcache; namespace test.Controllers { public class MemcacheController : Contr

 相关资料
  • Web 应用程序可能需要为成百上千甚至更多的用户同时提供服务。如果你没有采取必要的措施,在这种负载下,你的网站可能会崩溃或变得没有响应。 假设在主页显示最后 10 条新闻,并且平均每分钟有上千名用户访问此页面。你可能为每个用户通过查询数据库来显示页面视图信息: SELECT TOP 10 Title, NewsDate, Subject, Body FROM News ORDER BY NewsD

  • 问题内容: 我正在寻找Java分布式缓存解决方案。我们希望功能喜欢: 我们已经分析了Terracotta这样的框架,它似乎是缓存框架中我们想要的一切……但是,似乎需要一个中央缓存节点,这成为我们的单点故障。 除了推出我们自己的解决方案之外,还有其他想法吗? 问题答案: 我建议使用JBossCache或EhCache(使用分布式缓存侦听器)。我都用过,我都喜欢,它们都适合您的要求。

  • 我正在使用ehcache(2.10.1)和terracotta(开源4.3.1)实现分布式缓存。我在单台机器上尝试了两个JVM实例和一个terracotta服务器,代码按预期工作,没有错误。 现在,我尝试运行相同的terracotta服务器,但在虚拟机上使用客户端。在虚拟机上运行客户端时,会收到以下消息和错误: 使用的 tc-config.xml 文件: 使用的 ehcache.xml 文件: 在

  • 如何启用分布式/集群缓存时使用Redis与缓存。 尤其是通过

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Redis 是另一种内存数据库,由于其优秀的性能和可靠性, StackOverflow 也在使用它,他们所有的 WEB 服务只用了一个 Redis 数据库。 你可以从 Serenity.Caching.Redis 的 NuGet 程序包获取该服务类型的 Serenity 实现。 它可

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Couchbase 是一个分布式数据库,有像 Memcached 的访问接口。 可以从 NuGet 程序包 Serenity.Caching.Couchbase 获取 Serenity 对此服务类型的实现。 一旦你使用服务定位器注册它: Dependency.Resolve<IDep

  • [命名空间: Serenity.Abstractions, 程序集: Serenity.Core] 如果你现在不需要分布式缓存,但希望现在编写的代码在将来可以与分布式缓存一起工作,你可以使用 DistributedCacheEmulator 类。 DistributedCacheEmulator 也对单元测试和部署环境非常有用(因此,开发人员不需要访问分布式缓存系统而不会影响彼此的工作)。 Dis

  • 现在的CPU比25年前要精密得多了。在那个年代,CPU的频率与内存总线的频率基本在同一层面上。内存的访问速度仅比寄存器慢那么一点点。但是,这一局 面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太 贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。 如果有两个选项让你选择,一个