目录
前言
一、Redigo
1.redigo连接redis服务器
2.set、get操作
2.List操作
3.Hash表
4.set
5.zset
6.连接池
7.事务
总结
前言
刚学完redis,在此记录如何使用redis。redis有许多go语言的客户端包,都能实现对redis的操作。例如redigo、go-redis。
一、Redigo
1.redigo连接redis服务器
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
client, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("redis connect failed,", err)
return
}
fmt.Println("redis connect success")
defer client.Close()
}
2.set、get操作
- 设置值
_, err = client.Do("Set", "abc", 100)
if err != nil {
fmt.Println("set string failed", err)
return
}
_, err = client.Do("Set", "36D", "good")
if err != nil {
fmt.Println("set string failed", err)
return
}
- 获取值
// redigo 通过redis.Int()函数来获取整型
res, err := redis.Int(client.Do("Get", "abc"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res)
// redigo 通过redis.String()函数来获取字符串
res1, err := redis.String(client.Do("Get", "36D"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res1)
- 批量获取
res3, err := redis.Strings(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)
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
client, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("redis connect failed,", err)
return
}
fmt.Println("redis connect success")
defer client.Close()
}
2.set、get操作
- 设置值
_, err = client.Do("Set", "abc", 100)
if err != nil {
fmt.Println("set string failed", err)
return
}
_, err = client.Do("Set", "36D", "good")
if err != nil {
fmt.Println("set string failed", err)
return
}
- 获取值
// redigo 通过redis.Int()函数来获取整型
res, err := redis.Int(client.Do("Get", "abc"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res)
// redigo 通过redis.String()函数来获取字符串
res1, err := redis.String(client.Do("Get", "36D"))
if err != nil {
fmt.Println("get string failed,", err)
return
}
fmt.Println(res1)
- 批量获取
res3, err := redis.Strings(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)
输出如下:
10 5秒后 get string failed, redigo: nil returned
2.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
3.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)
4.set
- sadd key member1 member2:向set中添加若干个元素
_, err = client.Do("sadd", "qin", "18", "male", "handsome")
if err != nil {
fmt.Println("sadd failed, err:", err)
return
}
_, err = client.Do("sadd", "yi", "19", "male", "handsome")
if err != nil {
fmt.Println("sadd failed, err:", err)
return
}
- smembers key:返回set中所有元素s
res, err := redis.Strings(client.Do("smembers", "qin"))
if err != nil {
fmt.Println("smembers failed, err:", err)
return
}
fmt.Println(res)
- sinter key1 key2:求key1、key2的交集
res, err := redis.Strings(client.Do("sinter", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sdiff key1 key2:求key1、key2的差集
res, err = redis.Strings(client.Do("sdiff", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sunion key1 key2:求key1、key2的并集
res, err = redis.Strings(client.Do("sunion", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sismember key member:判断元素是否存在于set中
res, err := redis.Bool(client.Do("sismember", "qin", "20"))
if err != nil {
fmt.Println("sismember failed, err:", err)
}
fmt.Println(res)
- sadd key member1 member2:向set中添加若干个元素
_, err = client.Do("sadd", "qin", "18", "male", "handsome")
if err != nil {
fmt.Println("sadd failed, err:", err)
return
}
_, err = client.Do("sadd", "yi", "19", "male", "handsome")
if err != nil {
fmt.Println("sadd failed, err:", err)
return
}
- smembers key:返回set中所有元素s
res, err := redis.Strings(client.Do("smembers", "qin"))
if err != nil {
fmt.Println("smembers failed, err:", err)
return
}
fmt.Println(res)
- sinter key1 key2:求key1、key2的交集
res, err := redis.Strings(client.Do("sinter", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sdiff key1 key2:求key1、key2的差集
res, err = redis.Strings(client.Do("sdiff", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sunion key1 key2:求key1、key2的并集
res, err = redis.Strings(client.Do("sunion", "qin", "yi"))
if err != nil {
fmt.Println("sinter failed, err:", err)
return
}
fmt.Println(res)
- sismember key member:判断元素是否存在于set中
res, err := redis.Bool(client.Do("sismember", "qin", "20"))
if err != nil {
fmt.Println("sismember failed, err:", err)
}
fmt.Println(res)
scard key:返回set中元素的个数
res, err := redis.Int(client.Do("scard", "qin"))
if err != nil {
fmt.Println("scard failed, err:", err)
}
fmt.Println(res)
srem key member1 member2:移除set中指定元素
res, err := redis.Int(client.Do("srem", "qin", 18))
if err != nil {
fmt.Println("srem failed, err:", err)
}
fmt.Println(res)
5.zset
- zadd key score member:添加若干个元素到zset,如果存在则覆盖
_, err = client.Do("zadd", "RankOfNBAplayer", 1, "Jordon", 2, "LeBron", 3, "kobe", 4, "YaoMing", 5, "JRSmith")
if err != nil {
fmt.Println("zadd failed, err:", err)
return
}
- zrem key member:删除zset中指定的元素
_, err = client.Do("zrem", "RankOfNBAplayer", "JRSmith")
if err != nil {
fmt.Println("zrem failed, err:", err)
return
}
- zscore key member:获取zset中指定元素的score值
res, err := redis.Int(client.Do("zscore", "RankOfNBAplayer", "Jordon"))
if err != nil {
fmt.Println("zscore failed, err:", err)
return
}
fmt.Println(res)
- zrank key member:获取zset中指定元素的排名
res, err := redis.Int(client.Do("zrank", "RankOfNBAplayer", "Jordon"))
if err != nil {
fmt.Println("zrank failed, err:", err)
return
}
fmt.Println(res)
- zcard key:获取zset中元素个数
res, err := redis.Int(client.Do("zcard", "RankOfNBAplayer"))
if err != nil {
fmt.Println("zcard failed, err:", err)
return
}
fmt.Println(res)
- zcount key min max:统计score值在范围中的元素个数
res, err := redis.Int(client.Do("zcount", "RankOfNBAplayer", 0, 3))
if err != nil {
fmt.Println("zcount failed, err:", err)
return
}
fmt.Println(res)
- zincrby key increment member:指定zset中指定元素的自增步长
res, err := redis.Int(client.Do("zincrby", "RankOfNBAplayer", 10, "JRSmith"))
if err != nil {
fmt.Println("zincrby failed, err:", err)
return
}
fmt.Println(res)
- zrange key start end:获取范围内的元素
res, err := redis.Strings(client.Do("zrange", "RankOfNBAplayer", 0, -1))
if err != nil {
fmt.Println("zincrby failed, err:", err)
return
}
- zrangebyscore key min max:按照分数排序
res, err := redis.Strings(client.Do("zrangebyscore", "RankOfNBAplayer", 0, 3))
if err != nil {
fmt.Println("zincrby failed, err:", err)
return
}
fmt.Println(res)
6.连接池
// 创建redis连接池
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle: 16, // 连接数量
MaxActive: 0, // 最大连接数量,不确定用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()
}
7.事务
// 开启事务
client.Send("MULTI")
client.Send("set", "k1", "v1")
client.Send("set", "k2", "v2")
// 执行事务
res, err := client.Do("EXEC")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
总结
// 开启事务
client.Send("MULTI")
client.Send("set", "k1", "v1")
client.Send("set", "k2", "v2")
// 执行事务
res, err := client.Do("EXEC")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res)
总结
本文仅仅简单介绍了如何使用go语言操作redis。



