网站首页 > 文章中心 > 其它

redis支持go语言吗_redis提供的语言API包括

作者:小编 更新时间:2023-09-04 15:58:13 浏览量:185人看过

如何在 Go 语言中使用 Redis 连接池

第一段:关于连接池

一个数据库服务器只拥有有限的资源,并且如果你没有充分使用这些资源,你可以通过使用更多的连接来提高吞吐量.一旦所有的资源都在使用,那么你就不 能通过增加更多的连接来提高吞吐量.事实上,吞吐量在连接负载较大时就开始下降了.通常可以通过限制与可用的资源相匹配的数据库连接的数量来提高延迟和吞 吐量.

redis支持go语言吗_redis提供的语言API包括-图1

如何在Go语言中使用Redis连接池

如果不使用连接池,那么,每次传输数据,我们都需要进行创建连接,收发数据,关闭连接.在并发量不高的场景,基本上不会有什么问题,一旦并发量上去了,那么,一般就会遇到下面几个常见问题:

性能普遍上不去

CPU 大量资源被系统消耗

网络一旦抖动,会有大量 TIME_WAIT 产生,不得不定期重启服务或定期重启机器

服务器工作不稳定,QPS 忽高忽低

要想解决这些问题,我们就要用到连接池了.连接池的思路很简单,在初始化时,创建一定数量的连接,先把所有长连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来. 如果请求数超出连接池容量,那么就排队等待、退化成短连接或者直接丢弃掉.

第二段:使用连接池遇到的坑

最近在一个项目中,需要实现一个简单的 Web Server 提供 Redis 的 HTTP interface,提供 JSON 形式的返回结果.考虑用 Go 来实现.

redis支持go语言吗_redis提供的语言API包括-图2

发现有个 set_keepalive 的方法,查了一下官方文档,方法的原型是 syntax: ok, err = red:set_keepalive(max_idle_timeout, pool_size) 貌似 max_idle_timeout 这个参数,就是我们所缺少的东西,然后进一步跟踪源码,看看里面是怎么保证连接有效的.

function_M.set_keepalive(self,...)localsock=self.sockifnotsockthenreturnnil,"notinitialized"endifself.subscribedthenreturnnil,"subscribedstate"endreturnsock:setkeepalive(...)end

至此,已经清楚了,使用了 tcp 的 keepalive 心跳机制.

第四段:最后的解决方案

在创建连接池之后,起一个 goroutine,每隔一段 idleTime 发送一个 PING 到 Redis server.其中,idleTime 略小于 Redis server 的 timeout 配置.连接池初始化部分代码如下:

p,err:=pool.New("tcp",u.Host,concurrency)errHndlr(err)gofunc(){for{p.Cmd("PING")time.Sleep(idelTime*time.Second)}}()

使用 redis 传输数据部分代码如下:

funcredisDo(p*pool.Pool,cmdstring,args...interface{})(reply*redis.Resp,errerror){reply=p.Cmd(cmd,args...)iferr=reply.Err;err!=nil{iferr!=io.EOF{Fatal.Println("redis",cmd,args,"erris",err)}}return}

redis支持go语言吗_redis提供的语言API包括-图3

//Cmdautomaticallygetsoneclientfromthepool,executesthegivencommand//(returningitsresult),andputstheclientbackinthepoolfunc(p*Pool)Cmd(cmdstring,args...interface{})*redis.Resp{c,err:=p.Get()iferr!=nil{returnredis.NewResp(err)}deferp.Put(c)returnc.Cmd(cmd,args...)}

这样,我们就有了 keepalive 的机制,不会出现 timeout 的连接了,从 redis 连接池里面取出的连接都是可用的连接了.看似简单的代码,却完美的解决了连接池里面超时连接的问题.同时,就算 Redis server 重启等情况,也能保证连接自动重连.

如何在go语言中使用redis连接池

①在创建连接池之后,起一个 go routine,每隔一段 idleTime 发送一个 PING 到 Redis server.其中,idleTime 略小于 Redis server 的 timeout 配置.

p, err := pool.New("tcp", u.Host, concurrency) errHndlr(err) go func() { for { p.Cmd("PING") time.Sleep(idelTime * time.Second) } }()

func redisDo(p *pool.Pool, cmd string, args ...interface{}) (reply *redis.Resp, err error) { reply = p.Cmd(cmd, args...) if err = reply.Err; err != nil { if err != io.EOF { Fatal.Println("redis", cmd, args, "err is", err) } } return }

// Cmd automatically gets one client from the pool, executes the given command // (returning its result), and puts the client back in the pool func (p *Pool) Cmd(cmd string, args ...interface{}) *redis.Resp { c, err := p.Get() if err != nil { return redis.NewResp(err) } defer p.Put(c) return c.Cmd(cmd, args...) }

这样,就有了系统 keep alive 的机制,不会出现 time out 的连接了,从 redis 连接池里面取出的连接都是可用的连接了.看似简单的代码,却完美的解决了连接池里面超时连接的问题.同时,就算 Redis server 重启等情况,也能保证连接自动重连.

GO语言使用 Redis数据库

可以参考: windows环境下redis的安装

启动redis服务器:redis-server.exe redis.windows.conf

获取包:

导入包

访问:

Go语言与Docker操作Redis

首选,如果之前使用过redis容器,我们需要先remove掉之前的容器

然后创建redis容器,并运行

进入redis容器中

接着我们通过 redis-cli 连接测试使用 redis 服务

setex指令 可以设置数据存在的时间, setex key second value

MSET 一次设置多个key-value

MGET一次获取多个key-value

HGET

HGETALL

Hlen和hexist

Lpush 和 Lrange

Lpop和Rpop 从链表取出并移走数据

删除链表所有数据 DEL

字符串无序 不能重复

从连接池中Get出一个conn连接

以上就是土嘎嘎小编为大家整理的redis支持go语言吗相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章