使用 golang 操作 redis
go get
go get github.com/garyburd/redigo/redis
连接 redis
package main
import (
"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
}
fmt.Println("redis conn success")
defer c.Close()
}
通过这个语句可以判断是否连接到了 redis
代码示例
接下来直接通过代码来举例各种功能
package main
import (
"fmt"
"time"
"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()
/* string类型的 set 和 get操作 */
fmt.Println("string 类型的 set 和 get操作:")
_, err = c.Do("Set", "abc", 100) //进行 set abc 100 的操作
if err != nil {
fmt.Println(err)
return
}
r1, err := redis.Int(c.Do("Get", "abc")) //读取数据 get abc ,然后转换成int型
if err != nil {
fmt.Println("get abc failed,", err)
return
}
fmt.Println(r1) //输出 100 ,为刚刚设置的 abc
/* string 类型的批量操作 */
fmt.Println("string 类型的批量操作:")
_, err = c.Do("mset", "abc", 100, "efg", 300) // 执行 mset abc 100 efg 300
if err != nil {
fmt.Println(err)
return
}
r2, err := redis.Ints(c.Do("mget", "abc", "efg")) //执行 mget abc efg,并转换成 int 型的切片
if err != nil {
fmt.Println("get abc failed", err)
return
}
for _, v := range r2 {
fmt.Println(v)
}
/* 设置过期时间,过期时间过了之后,该元素会自动删除 */
fmt.Println("设置过期时间,过期时间过了之后,该元素会自动删除:")
_, err = c.Do("set", "abc", "100")
_, err = c.Do("expire", "abc", 3) // 执行 expire abc 3 ,代表3秒后 abc 这个元素就不存在了
if err != nil {
fmt.Println(err)
return
}
r3, err := redis.String(c.Do("get", "abc")) //执行 get abc
fmt.Println("abc is : ", r3)
time.Sleep(5 * time.Second) //停止5秒
r3, err = redis.String(c.Do("get", "abc"))
if err != nil {
fmt.Println(err) //如果输出,就证明元素已经删除了
} else {
fmt.Println("after 10s , abc is : ", r3)
}
/* list 队列操作 */
fmt.Println("list 队列操作")
_, err = c.Do("lpush", "book_list", "abc", "ceg", 300) //执行 lpush book_list abc ceg 300
if err != nil {
fmt.Println(err)
return
}
r4, err := redis.String(c.Do("lpop", "book_list")) //执行 lpop book_list ,移出并获取列表的第一个元素
if err != nil {
fmt.Println("get abc failed", err)
return
}
fmt.Println("删除的元素为:", r4)
r5, err := redis.Strings(c.Do("lrange", "book_list", "0", "10")) // 执行 lrange book_list 0 10
fmt.Print("剩余元素为:")
for _, v := range r5 {
fmt.Print(v, " ")
}
fmt.Println()
/* hash表操作 */
fmt.Println("hash表操作")
_, err = c.Do("hset", "books", "abc", 100) //执行 hset books abc 100
if err != nil {
fmt.Println(err)
return
}
r6, err := redis.Int(c.Do("hget", "books", "abc")) // 执行 hget books abc
if err != nil {
fmt.Println("get abc failed", err)
return
}
fmt.Println(r6)
}
redis 连接池
直接通过代码来看
package main
import (
"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() //关闭连接池
}