redis使用
使用第三方开源的redis库:<font style="color:rgb(51, 51, 51);">github.com/garyburd/redigo/redis</font>
命令行输入 :
go get github.com/garyburd/redigo/redis
连接redis
:::color2


想要添加什么属性,在后面添加。
:::
package mainimport ("fmt""time""github.com/gomodule/redigo/redis")func main() {c, err := redis.Dial("tcp", "172.23.188.124:6379",redis.DialConnectTimeout(time.Duration(1) * time.Second),// redis.DialPassword("111"),redis.DialDatabase(1))if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()}
String类型Set、Get操作
package mainimport ("fmt""github.com/garyburd/redigo/redis")func main() {c, err := redis.Dial("tcp", "localhost:6379")if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()_, err = c.Do("Set", "abc", 100)if err != nil {fmt.Println(err)return}r, err := redis.Int(c.Do("Get", "abc"))if err != nil {fmt.Println("get abc failed,", err)return}fmt.Println(r) // 100}
:::color2
**<font style="color:#DF2A3F;">c.Do("MSet", "abc", 100, "efg", 300)</font>**:Do执行语句
**<font style="color:#DF2A3F;">redis.Int</font>**:转成int类型,返回int类型
**<font style="color:#DF2A3F;">redis.Ints</font>**:转成[]int类型,返回[]int类型
:::
String批量操作
package mainimport ("fmt""github.com/garyburd/redigo/redis")func main() {c, err := redis.Dial("tcp", "localhost:6379")if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()_, err = c.Do("MSet", "abc", 100, "efg", 300)if err != nil {fmt.Println(err)return}r, err := redis.Ints(c.Do("MGet", "abc", "efg"))if err != nil {fmt.Println("get abc failed,", err)return}for _, v := range r {fmt.Println(v)}}
设置过期时间
package mainimport ("fmt""github.com/garyburd/redigo/redis")func main() {c, err := redis.Dial("tcp", "localhost:6379")if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()_, err = c.Do("expire", "abc", 10)if err != nil {fmt.Println(err)return}}
List队列操作
package mainimport ("fmt""github.com/garyburd/redigo/redis")func main() {c, err := redis.Dial("tcp", "localhost:6379")if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()_, err = c.Do("lpush", "book_list", "abc", "ceg", 300)if err != nil {fmt.Println(err)return}r, err := redis.String(c.Do("lpop", "book_list"))if err != nil {fmt.Println("get abc failed,", err)return}fmt.Println(r) // 300}
Hash表
package mainimport ("fmt""github.com/garyburd/redigo/redis")func main() {c, err := redis.Dial("tcp", "localhost:6379")if err != nil {fmt.Println("conn redis failed,", err)return}defer c.Close()_, err = c.Do("HSet", "books", "abc", 100)if err != nil {fmt.Println(err)return}r, err := redis.Int(c.Do("HGet", "books", "abc"))if err != nil {fmt.Println("get abc failed,", err)return}fmt.Println(r) // 100}
redis连接池
:::color2 MaxIdle:最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态。
MaxActive:最大的连接数,表示同时最多有N个连接。0表示不限制。
IdleTimeout:最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭。如果设置成0,空闲连接将不会被关闭。应该设置一个比redis服务端超时时间更短的时间。
DialConnectTimeout:连接Redis超时时间。
DialReadTimeout:从Redis读取数据超时时间。
DialWriteTimeout:向Redis写入数据超时时间。
连接流程大概是这样的:
1.尝试从空闲列表MaxIdle中,获得一个可用连接;如果成功直接返回,失败则尝试步骤2
2.如果当前的MaxIdle < 连接数 < MaxActive,则尝试创建一个新连接,失败则尝试步骤3
- 如果连接数 > MaxActive就等待,直到满足步骤2的条件,重复步骤2
:::
package mainimport("fmt""github.com/garyburd/redigo/redis")var pool *redis.Pool //创建redis连接池func init(){pool = &redis.Pool{ //实例化一个连接池MaxIdle:16, //最初的连接数量// MaxActive:1000000, //最大连接数量MaxActive:0, //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配IdleTimeout:300, //连接关闭时间 300秒 (300秒不使用自动关闭)Dial: func() (redis.Conn ,error){ //要连接的redis数据库return redis.Dial("tcp","localhost:6379")},}}func main(){c := pool.Get() //从连接池,取一个链接defer c.Close() //函数运行结束 ,把连接放回连接池_,err := c.Do("Set","abc",200)if err != nil {fmt.Println(err)return}r,err := redis.Int(c.Do("Get","abc"))if err != nil {fmt.Println("get abc faild :",err)return}fmt.Println(r)pool.Close() //关闭连接池}
