Go-redis

go get -u github.com/go-redis/redis

一般的init操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 根据redis配置初始化一个客户端
func initClient() (err error) {
redisDb = redis.NewClient(&redis.Options{
Addr: "localhost:6379", // redis地址
Password: "", // redis密码,没有则留空
DB: 0, // 默认数据库,默认是0
})

//通过 *redis.Client.Ping() 来检查是否成功连接到了redis服务器
_, err = redisDb.Ping().Result()
if err != nil {
return err
}
return nil
}

type.Option还有包括设置连接方式,连接池相关,持续时间等很多字段,用的时候可以去查。

基本键值的一些操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//第三个参数为失效时间, 0为永久有效
err = redisDb.Set("name", "zbs", 0).Err()
if err!=nil{
panic(err)
}

redisDb.Append("name", "123")
redisDb.Expire("name", 3*time.Second)
time.Sleep(5*time.Second)
val, err := redisDb.Get("name").Result()
if err != nil{
panic(err)
}
fmt.Println(val)

这里设置key的过期时间为3s,sleep 5s后,key已经被废除,此时Get中的key不复存在,触发panic
还有很多方法, 包括

1
MGet() / MSet() / Incr() / Decr() ...

列表 List

允许元素重复且内部是有序的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//只保留区间内的元素
redisDb.LTrim("studentsList", 0, 0)
redisDb.LPush("studentsList", "James", "Marry", "Ken", "Joe")
// 0 到 -1即返回所有元素
vals, _ := redisDb.LRange("studentsList", 0, -1).Result()
fmt.Println(vals)

for _, v := range vals{
fmt.Printf("%s ", v)
}
length , _:= redisDb.LLen("studentsList").Result()
fmt.Printf("\nLength is %d\n", length)

else:

LSet(key, index, newval) //指定位置覆盖
LInsert()
LPop()/LRem()/RPop()

集合 Set

set 类型(集合)是 string 类型数值的无序集合,并且集合元素唯一。

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
//集合类型操作:
//求并集
SUnion(keys ...string) *StringSliceCmd
//求差集
SDiff(keys ...string) *StringSliceCmd
//求交集
SInter(keys ...string) *StringSliceCmd

redisDb.SAdd("stuSet", 100, 200, 300)
//获取集合中元素的个数
size, err := redisDb.SCard("stuSet").Result()
if err != nil {
panic(err)
}
fmt.Println(size)

es, _ := redisDb.SMembers("stuSet").Result()
fmt.Println(es)

SPop()
SRem():
//删除集合stuSet名称为500,600的元素,并返回删除的元素个数
member3, err := redisDb.SRem("stuSet", 500, 600).Result()
SRandMember(N)()

//把集合里的元素转换成map的key
map1, err:= redisDb.SMembersMap("stuSet").Result()
fmt.Println(map1) //map[100:{} 200:{} 300:{} 400:{} 500:{} 600:{}]

Hash:

操作跟基本操作类似,在前面都加了个 ‘H’表示hash独有
注意查询方式有所不同,需要根据key和字段名才行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//根据key和field字段设置,field字段的值。 user_1 是hash key,username 是字段名, admin是字段值
err = redisDb.HSet("user_1", "username", "admin").Err()
if err != nil {
panic(err)
}
//根据key和field字段,查询field字段的值。user_1 是hash key,username是字段名
username, err := redisDb.HGet("user_1", "username").Result()

if err != nil {
panic(err)
}
fmt.Println(username) //admin
//继续往user_1中添加字段password
_ = redisDb.HSet("user_1", "password", "abc123").Err()

通过其与map结构的关系,可以通过map进行对hash的初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
   // 初始化hash数据的多个字段值
batchData := make(map[string]interface{})
batchData["username"] = "test"
batchData["password"] = 123456
// 一次性保存多个hash字段值
err = redisDb.HMSet("user_2", batchData).Err()

// 根据key返回所有字段名
HKeys(keyName)
//删除字段
HDel(hashKey, field)

HExists(hashkey, field)

Sorted Set

Redis有序集合(sorted set)和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,这个分数主要用于集合元素排序。
redis中专门的结构:

1
2
3
4
5
6
//redis.Z
//Z represents sorted set member.
type Z struct {
Score float64 // 分数
Member interface{} // 元素名
}
  • 基本操作:
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
zsetKey := "language_rank"
languages := []redis.Z{
{Score: 90.0, Member: "Golang"},
{Score: 98.0, Member: "Java"},
{Score: 95.0, Member: "Python"},
{Score: 97.0, Member: "JavaScript"},
{Score: 92.0, Member: "C/C++"},
}
//添加成功的个数
num, _ := redisDb.ZAdd(zsetKey, languages...).Result()
fmt.Println(num)

size, _ = redisDb.ZCard(zsetKey).Result()
//范围为闭区间
count, _ := redisDb.ZCount(zsetKey, "90.0", "95.0").Result()
fmt.Printf("size is %d, and count between 90-95 is %d\n", size, count)


// 初始化查询条件, Offset和Count用于分页, 第二个参数ZRangeBy
op := redis.ZRangeBy{
Min:"80", // 最小分数
Max:"100", // 最大分数
Offset:0, // 类似sql的limit, 表示开始偏移量
Count:5, // 一次返回多少数据
}
//根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。
values, _ := redisDb.ZRangeByScore(zsetKey, op).Result()
for _, val := range values {
fmt.Println(val)
}
//查询指定元素的分数或排名
ZScore(key, "元素名")
ZRank()
ZRem(key, "元素名")
//按从小到大的排序删除元素
//指定负数即为从高到低
ZRemRangeByRank(key, left, right)

redis-transaction

这里简单介绍一些事务的基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//统计开发语言排行榜
zsetKey := "language_rank"
// 开启一个TxPipeline事务
pipe := redisDb.TxPipeline()
defer pipe.close()
// 执行事务操作,可以通过pipe读写redis
incr := pipe.Incr(zsetKey)
pipe.Expire(zsetKey, time.Hour)

// 通过Exec函数提交redis事务
_, err = pipe.Exec()

// 提交事务后,我们可以查询事务操作的结果
// 前面执行Incr函数,在没有执行exec函数之前,实际上还没开始运行。
fmt.Println(incr.Val(), err)