0/参考网址
blog.csdn.net/m0_56137272…
blog.csdn.net/weixin_4371…
0/前言
go语言有很多关于redis的库包,都能实现对redis的操作。例如redigo库包、go-redis库包。
本文将详细的介绍这2种库包
1/redigo库包
"github.com/garyburd/redigo/redis"
优点:redigo包装较为精练,一个Do方法涵盖CRUD,
缺点:包本身不支持连接redis集群;
<1>连接redis服务器
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
redis_client, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("redis connect failed,", err)
return
}
fmt.Println("redis connect success")
defer redis_client.Close()
}
<2>set和get操作
set:设置
_, err = redis_client.Do("Set", "abc", 100)
if err != nil {
fmt.Println("set string failed", err)
return
}
_, err = redis_client.Do("Set", "36D", "good")
if err != nil {
fmt.Println("set string failed", err)
return
}
get:读取
result1, err := redis.Int(redis_client.Do("Get", "abc"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(result1)
result2, err := redis.String(redis_client.Do("Get", "36D"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(result2)
res3, err := redis.Strings(redis_client.Do("MGet", "36", "32"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res3)
设置过期时间
_, err = client.Do("setex" , "a", 2, "10")
if err != nil {
fmt.Println("set string failed", err)
return
}
res2, err := redis.String(client.Do("Get", "a"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res2)
time.Sleep(5 * time.Second)
fmt.Println("5秒后")
res2, err = redis.String(client.Do("Get", "a"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res2)
get string failed, redigo: nil returned
list操作
lpush key element1 element2:向列表左侧插入若干个元素
_, err = client.Do("lpush", "NBAplayer", "Jordon", "Kobe", "Lebron")
if err != nil {
fmt.Println("push element failed")
return
}
lrange key start end:返回范围内的所有元素
res4, err := redis.Strings(client.Do("lrange", "NBAplayer", "0", "-1"))
if err != nil {
fmt.Println("get element failed")
return
}
for _, v := range res4{
fmt.Println(v)
}
输出结果:
Lebron
Kobe
Jordon
hash表
hset key field value:添加或修改hash类型key的field的值
_, err = client.Do("HSet", "DSB", "name", "SB")
if err != nil {
fmt.Println("hset failed")
return
}
hmset key field1 value1 field2 value2:批量添加多个hash类型key的field值
_, err = client.Do("HmSet", "DSB", "age", "18", "addr", "usa")
if err != nil {
fmt.Println("hmset failed")
return
}
hget key field:获取一个hash类型的key的field的值
res5, err := redis.String(client.Do("Hget", "DSB", "name"))
if err != nil {
fmt.Println("hget element failed")
return
}
fmt.Println(res5)
hmget key field1 field2:批量获取hash类型key多个field的value值
res6, err := redis.Strings(client.Do("HmGet", "DSB", "name", "age", "addr"))
if err != nil {
fmt.Println("hmget failed")
return
}
fmt.Println(res6)
连接池
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle: 16,
MaxActive: 0,
IdleTimeout: 300,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
client := pool.Get()
defer client.Close()
_, err := client.Do("Set", "CSDN", "good")
if err != nil {
fmt.Println("set string failed, err:", err)
return
}
res, err := redis.String(client.Do("Get", "CSDN"))
if err != nil {
fmt.Println("set string failed, err:", err)
return
}
fmt.Println(res)
pool.Close()
}
2/go-redis库包
go-redis包装程度高,方法多,支持redis集群;
<1>连接redis服务器
package main
import (
"fmt"
"github.com/go-redis/redis"
)
var rdb *redis.Client
func initRedisClient() (err error) {
rdb_client = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,},
)
_, err = rdb_client.Ping().Result()
if err != nil {
return err
}
return nil
}
<2>set和get的操作
err = rdb_client.Set("goland", "so good", 0).Err()
if err != nil {
fmt.Println(err)
return
}
res, err := rdb_client.Get("goland").Result()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
err = rdb_client.MSet("Go", "NO1", "C++", "NO1", "JAVA", "NO1", "PYTHON", "NO1").Err()
if err != nil {
fmt.Println("MSet failed, err: ", err)
return
}
res1, err := rdb.MGet("Go", "C++", "JAVA", "PYTHON").Result()
if err != nil {
fmt.Println(err)
return
}
for i, _ := range res1 {
fmt.Println(res1[i])
}
哨兵模式
func initClient()(err error){
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "master",
SentinelAddrs: []string{"x.x.x.x:26379", "xx.xx.xx.xx:26379", "xxx.xxx.xxx.xxx:26379"},
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
集群
func initClient()(err error){
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
总结
本文仅仅简单介绍了如何使用go语言操作redis,
分别展示了两种客户端包如何实现对redis的访问和操作,并展示了redis的部分指令,
而redis提供的指令远不止这些。
写博客的过程中,个人还是感觉redigo使用起来更加易懂,而go-redis支持连接哨兵和集群模式的redis,还是要根据情况选择使用。