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
【go语言redis数据库 golang redisson】 Lpush 和 Lrange
Lpop和Rpop 从链表取出并移走数据
删除链表所有数据 DEL
字符串无序 不能重复
从连接池中Get出一个conn连接
GO语言使用 Redis数据库可以参考: windows环境下redis的安装
启动redis服务器:redis-server.exe redis.windows.conf
获取包:
导入包
访问:
如何在 Go 语言中使用 Redis 连接池一、关于连接池
一个数据库服务器只拥有有限的资源go语言redis数据库,并且如果你没有充分使用这些资源go语言redis数据库,你可以通过使用更多的连接来提高吞吐量 。一旦所有的资源都在使用 , 那么你就不 能通过增加更多的连接来提高吞吐量 。事实上,吞吐量在连接负载较大时就开始下降了 。通常可以通过限制与可用的资源相匹配的数据库连接的数量来提高延迟和吞 吐量 。
如何在Go语言中使用Redis连接池
如果不使用连接池,那么,每次传输数据,go语言redis数据库我们都需要进行创建连接,收发数据,关闭连接 。在并发量不高的场景 , 基本上不会有什么问题,一旦并发量上去了,那么,一般就会遇到下面几个常见问题:
性能普遍上不去
CPU 大量资源被系统消耗
网络一旦抖动 , 会有大量 TIME_WAIT 产生,不得不定期重启服务或定期重启机器
服务器工作不稳定,QPS 忽高忽低
要想解决这些问题,我们就要用到连接池了 。连接池的思路很简单,在初始化时,创建一定数量的连接,先把所有长连接存起来,然后,谁需要使用,从这里取走 , 干完活立马放回来 。如果请求数超出连接池容量 , 那么就排队等待、退化成短连接或者直接丢弃掉 。
二、使用连接池遇到的坑
最近在一个项目中 , 需要实现一个简单的 Web Server 提供 Redis 的 HTTP interface,提供 JSON 形式的返回结果 。考虑用 Go 来实现 。
首先,去看一下 Redis 官方推荐的 Go Redis driver 。官方 Star 的项目有两个:Radix.v2 和 Redigo 。经过简单的比较后,选择了更加轻量级和实现更加优雅的 Radix.v2 。
Radix.v2 包是根据功能划分成一个个的 sub package,每一个 sub package 在一个独立的子目录中,结构非常清晰 。我的项目中会用到的 sub package 有 redis 和 pool 。
由于我想让这种被 fork 的进程最好简单点,做的事情单一一些,所以,在没有深入去看 Radix.v2 的 pool 的实现之前 , 我选择了自己实现一个 Redis pool 。(这里,就不贴代码了 。后来发现自己实现的 Redis pool 与 Radix.v2 实现的 Redis pool 的原理是一样的,都是基于 channel 实现的, 遇到的问题也是一样的 。)
不过在测试过程中,发现了一个诡异的问题 。在请求过程中经常会报 EOF 错误 。而且是概率性出现,一会有问题,一会又好了 。通过反复的测试,发现 bug 是有规律的,当程序空闲一会后,再进行连续请求,会发生3次失败,然后之后的请求都能成功,而我的连接池大小设置的是3 。再进一步分析,程序空闲300秒 后 , 再请求就会失败,发现我的 Redis server 配置了 timeout 300 , 至此,问题就清楚了 。是连接超时 Redis server 主动断开了连接 。客户端这边从一个超时的连接请求就会得到 EOF 错误 。
推荐阅读
- 看点直播微信直播骗局,看点直播怎么挂微信号
- asp.net管理员管理,aspnet core 登录
- gis导带高程的cad,arcgis怎样把高程点转成cad格式?
- 怎么关钉钉直播的语音,钉钉直播中怎么关闭声音
- linux命令用户登录 linux登录账户命令
- html红色代码是什么错误,html深红色
- 皇族直播技巧舞蹈,皇族直播技巧舞蹈完整版
- java飞机小游戏源代码 java 飞机游戏
- wordpress安装手册,wordpress安装步骤