一.基本命令
1.SET,GET
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() err := client.Set("hello", "world", 0).Err() if err != nil { panic(err) } val, err := client.Get("hello").Result() if err != nil { panic(err) } fmt.Println("val", val) }
2.SETNX
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() err := client.SetNX("name", "lisus", 0).Err() if err != nil { panic(err) } value, err := client.Get("name").Result() if err != nil { panic(err) } fmt.Println("value:", value) }
二.hash命令
1.HSET,HGET
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() err := client.HSet("user_1", "username", "tizi365").Err() if err != nil { panic(err) } username, err := client.HGet("user_1", "username").Result() if err != nil { panic(err) } fmt.Println(username) }
2.HGETALL,HINCRBY,HKEYS,HLENS
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() data, err := client.HGetAll("user_1").Result() if err != nil { panic(err) } for field, val := range data { fmt.Println(field, val) } count, err := client.HIncrBy("user_1", "count", 2).Result() if err != nil { panic(err) } fmt.Println(count) keys, err := client.HKeys("user_1").Result() if err != nil { panic(err) } fmt.Println(keys) size, err := client.HLen("user_1").Result() if err != nil { panic(err) } fmt.Println(size) }
3.HMSet,HExists,HDel
package main import "github.com/go-redis/redis" var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() data := make(map[string]interface{}) data["id"] = 2 data["username"] = "lisus" //一次性保存多个hash字段值 err := client.HMSet("user_2", data).Err() if err != nil { panic(err) } // 检测id字段是否存在 err := client.HExists("key", "id").Err() if err != nil { panic(err) } }
三.list用法
Redis列表是简单的字符串列表,列表是有序的,列表中的元素可以重复。 可以添加一个元素到列表的头部(左边)或者尾部(右边) golang redis list数据操作常用函数: LPush - 从列表左边插入数据 LPushX - 跟LPush的区别是,仅当列表存在的时候才插入数据 RPop - 从列表的右边删除第一个数据,并返回删除的数据 RPush - 从列表右边插入数据 RPushX - 跟RPush的区别是,仅当列表存在的时候才插入数据 LPop - 从列表左边删除第一个数据,并返回删除的数据 LLen - 返回列表的大小 LRange - 返回列表的一个范围内的数据,也可以返回全部数据 LRem - 删除列表中的数据 LIndex - 根据索引坐标,查询列表中的数据 LInsert - 在指定位置插入数据LPUSH
1.LPush,LPushX
package main import "github.com/go-redis/redis" var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { err := client.LPush("sale_number", 1, 2, 3, 4, 5, 6, 7, 8).Err() if err != nil { panic(err) } }
2.RPop,RPush,5.RPushX,LPop
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() val, err := client.RPop("sale_number").Result() if err != nil { panic(err) } fmt.Println(val) //插入一个数据 client.RPush("sale_number", 9) val, err = client.LPop("sale_number").Result() if err != nil { panic(err) } fmt.Println(val) }
3.LLen,LRange,LRem
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func IniClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { IniClient() val, err := client.LIndex("sale_number", 5).Result() if err != nil { panic(err) } fmt.Println(val) vals, err := client.LRange("keys", 0, -1).Result() if err != nil { panic(err) } fmt.Println(vals) dels, err := client.LRem("sale_number", 1, 100).Result() if err != nil { panic( err) } fmt.Println(dels) }
四.集合set的用法
1.SADD,SCard,SIsMember
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() err := client.SAdd("num1", 100).Err() if err != nil { panic(err) } client.SAdd("num1", 100, 200, 300) size, _ := client.SCard("num1").Result() fmt.Println(size) //判断元素是否在集合中 ok, _ := client.SIsMember("num1", 100).Result() if ok { fmt.Println("集合包含指定元素") } }
2.SMembers,SRem,SPop,SPopN
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() es, _ := client.SMembers("num1").Result() fmt.Println(es) // 随机返回集合中的一个元素,并且删除这个元素 val, _ := client.SPop("num1").Result() fmt.Println(val) client.SRem("num1", 100) vals, _ := client.SPopN("num1", 5).Result() fmt.Println(vals) }
五.有序集合
1.ZADD,ZCARD,ZCOUNT
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() err := client.ZAdd("zaddr", redis.Z{ 2.5, "tizi", }).Err() if err != nil { panic(err) } size, _ := client.ZCard("zaddr").Result() fmt.Println(size) count, _ := client.ZCount("zaddr", "1", "5").Result() fmt.Println(count) }
2.ZRANGE,ZIncrBy
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() client.ZIncrBy("znum1", 2, "5") vals, err := client.ZRange("znum1", 0, -1).Result() if err != nil { panic(err) } for _, val := range vals { fmt.Println(val) } }
3.ZRangeByScore
package main import ( "fmt" "github.com/go-redis/redis" ) var client *redis.Client func InitClient() { client = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", DB: 0, }) } func main() { InitClient() op := redis.ZRangeBy{ Min: "2", //最小分数 Max: "10", //最大分数 Offset: 0, //类似sql的limit, 表示开始偏移量 Count: 5, //一次返回多少数据 } vals, err := client.ZRangeByScore("znum1", op).Result() if err != nil { panic(err) } for _, val := range vals { fmt.Println(val) } }
4.ZRangeByScoreWithScores
func main() { InitClient() op := redis.ZRangeBy{ Min: "2", //最小分数 Max: "10", //最大分数 Offset: 0, //类似sql的limit, 表示开始偏移量 Count: 5, //一次返回多少数据 } vals, err := client.ZRangeByScoreWithScores("znum1", op).Result() if err != nil { panic(err) } for _, val := range vals { fmt.Println(val.Member) fmt.Println(val.Score) } }
5.ZRem,ZRemRangeByRank
func main() { InitClient() client.ZRem("zddr", "test2") } func main() { InitClient() client.ZRemRangeByRank("zaddr", 0, 2) }
6.ZSCORE
func main() { InitClient() score, _ := client.ZScore("zaddr", "test2").Result() fmt.Println(score) }
7.ZRank
func main() { InitClient() rk, _ := client.ZRank("zaddr", "yangmi").Result() fmt.Println(rk) }
六.事务处理
edis乐观锁支持,可以通过watch监听一些Key, 如果这些key的值没有被其他人改变的话,才可以提交事务。
// 定义一个回调函数,用于处理事务逻辑 fn := func(tx *redis.Tx) error { // 先查询下当前watch监听的key的值 v, err := tx.Get("key").Result() if err != nil && err != redis.Nil { return err } // 这里可以处理业务 fmt.Println(v) // 如果key的值没有改变的话,Pipelined函数才会调用成功 _, err = tx.Pipelined(func(pipe redis.Pipeliner) error { // 在这里给key设置最新值 pipe.Set("key", "new value", 0) return nil }) return err } // 使用Watch监听一些Key, 同时绑定一个回调函数fn, 监听Key后的逻辑写在fn这个回调函数里面 // 如果想监听多个key,可以这么写:client.Watch(fn, "key1", "key2", "key3") client.Watch(fn, "key")