- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Go实现Redis连接池方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
先看看别人是怎么介绍连接池的吧
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等.
下面我来简单解释一下,因为每次Redis客户端连接Redis服务端都需要一段时间,而处理各种操作的时间很多时候都很短,如果每次进行各种操作时都需要重新连接Redis,那么就会浪费大量时间。因此Redis引入连接池,连接池可以实现建立多个客户端连接而不释放,避免浪费IO资源,不使用的时候就放在连接池,这样就减少了连接数据库所需要的时间,提高效率。 连接池就是建一个池子和一定量的管道。每次当管道被取尽时,就不能继续消耗IO资源了,这样就保证了IO资源不会耗尽.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
"strconv"
"time"
)
func main() {
pool := &redis.Pool{
// Maximum number of connections allocated by the pool at a given time.
// When zero, there is no limit on the number of connections in the pool.
//最大活跃连接数,0代表无限
MaxActive: 888,
//最大闲置连接数
// Maximum number of idle connections in the pool.
MaxIdle: 20,
//闲置连接的超时时间
// Close connections after remaining idle for this duration. If the value
// is zero, then idle connections are not closed. Applications should set
// the timeout to a value less than the server's timeout.
IdleTimeout: time.Second * 100,
//定义拨号获得连接的函数
// Dial is an application supplied function for creating and configuring a
// connection.
//
// The connection returned from Dial must not be in a special state
// (subscribed to pubsub channel, transaction started, ...).
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp","127.0.0.1:6379"),
}
}
//延迟关闭连接池
defer pool.Close()
//IO并发连接
for i:=0;i<10;i++{
go getConnFromPoolAndHappy(pool,i)
}
//保持主协程存活
time.Sleep(3*time.Second)
}
func getConnFromPoolAndHappy(pool *redis.Pool, i int) {
//通过连接池获得连接
conn := pool.Get()
//延时关闭连接
defer conn.Close()
//使用连接操作数据
reply, err := conn.Do("set", "conn"+strconv.Itoa(i), i)
s, _ := redis.String(reply, err)
fmt.Println(s)
}
|
MaxActive: 888 。
上面的代码表示在给定的时间内被连接池分配的最大连接数,当该值为0时,表示连接池的连接数是无上限的.
MaxIdle: 20 。
表示连接池闲置连接数的上限.
IdleTimeout: time.Second * 100 。
该值表示如果连接池的的连接闲置超过该值就会关闭连接。如果该值为零,连接池中闲置的连接就不会关闭。应用程序应该设置这个限制超时时间不超过服务端的限制超时时间.
1
2
3
|
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
}
|
该值为一个函数,该函数应该用于创造和配置连接。从Dial返回的连接不能处于特殊状态。 开辟一条并发协程执行该函数,因为for循环的范围是0-9,所以并发数为10,表示同时有10个人去连接池取管道.
1
|
go getConnFromPoolAndHappy(pool,i)
|
下列代码是用来保持主协程存活的.
1
|
time.Sleep(3*time.Second)
|
下面表示通过连接池获得连接。也就是从池子拿一根管道.
1
|
conn := pool.Get()
|
然后下面的代码是使用管道.
1
2
3
|
reply, err := conn.Do("set", "conn"+strconv.Itoa(i), i)
s, _ := redis.String(reply, err)
fmt.Println(s)
|
如果一个人占着管道不用,就会被闲置。如果在闲置处太久不动,达到闲置连接的超时时间,就会被请走。 因为池子使用的都是同一个,所以需要使用池子的指针.
1
|
pool := &redis.Pool
|
到此这篇关于Go实现Redis连接池方法的文章就介绍到这了,更多相关Go Redis连接池内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/6993126518449209351 。
最后此篇关于Go实现Redis连接池方法的文章就讲到这里了,如果你想了解更多关于Go实现Redis连接池方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!