go redis
安装
go get gopkg.in/redis.v4
//引入
"gopkg.in/redis.v4"
连接
redis.v4 包实现了 redis 的连接池管理, 因此我们就不需要自己手动管理 redis 的连接了.
默认情况下, redis.v4 的 redis 连接池大小是10, 不过我们可以在初始化 redis 客户端时自行设置连接池的大小, 例如:
// 创建 redis 客户端 func createClient() *redis.Client { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) // 通过 cient.Ping() 来检查是否成功连接到了 redis 服务器 pong, err := client.Ping().Result() fmt.Println(pong, err) return client }
操作
字符串(string)
方法
set(key, value):给数据库中名称为key的string赋予值value get(key):返回数据库中名称为key的string的value getset(key, value):给名称为key的string赋予上一次的value mget(key1, key2,…, key N):返回库中多个string的value setnx(key, value):添加string,名称为key,值为value setex(key, time, value):向库中添加string,设定过期时间time mset(key N, value N):批量设置多个string的值 msetnx(key N, value N):如果所有名称为key i的string都不存在 incr(key):名称为key的string增1操作 incrby(key, integer):名称为key的string增加integer decr(key):名称为key的string减1操作 decrby(key, integer):名称为key的string减少integer append(key, value):名称为key的string的值附加value substr(key, start, end):返回名称为key的string的value的子串
演示
// String 操作 func stringOperation(client *redis.Client) { // 第三个参数是过期时间, 如果是0, 则表示没有过期时间. err := client.Set("name", "xys", 0).Err() if err != nil { panic(err) } val, err := client.Get("name").Result() if err != nil { panic(err) } fmt.Println("name", val) // 这里设置过期时间. err = client.Set("age", "20", 1 * time.Second).Err() if err != nil { panic(err) } client.Incr("age") // 自增 client.Incr("age") // 自增 client.Decr("age") // 自减 val, err = client.Get("age").Result() if err != nil { panic(err) } fmt.Println("age", val) // age 的值为21 // 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了. time.Sleep(1 * time.Second) val, err = client.Get("age").Result() if err != nil { // 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误. fmt.Printf("error: %v\n", err) } fmt.Println("age", val) }
列表(list)
方法
rpush(key, value):在名称为key的list尾添加一个值为value的元素 lpush(key, value):在名称为key的list头添加一个值为value的 元素 llen(key):返回名称为key的list的长度 lrange(key, start, end):返回名称为key的list中start至end之间的元素 ltrim(key, start, end):截取名称为key的list lindex(key, index):返回名称为key的list中index位置的元素 lset(key, index, value):给名称为key的list中index位置的元素赋值 lrem(key, count, value):删除count个key的list中值为value的元素 lpop(key):返回并删除名称为key的list中的首元素 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。 brpop(key1, key2,… key N, timeout):rpop的block版本。 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
演示
//list操作 func listOperation(client *redis.Client) { client.RPush("fruit", "apple") //在名称为fruit的list尾添加一个值为value的元素 client.LPush("fruit", "banana") //在名称为fruit的list头添加一个值为value的元素 length, err := client.LLen("fruit").Result() //返回列表的长度 if err != nil { panic(err) } fmt.Println("length:", length) value, err := client.LPop("fruit").Result() //返回并删除名称为furit的首元素 if err != nil { panic(err) } fmt.Println("fruit:", value) value, err = client.RPop("fruit").Result() //返回并删除名称为fruit的尾元素 if err != nil { panic(err) } fmt.Println("fruit:", value) }
集合(set)
方法
sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :移到集合元素 scard(key) :返回名称为key的set的基数 sismember(key, member) :member是否是名称为key的set的元素 sinter(key1, key2,…key N) :求交集 sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合 sunion(key1, (keys)) :求并集 sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合 sdiff(key1, (keys)) :求差集 sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合 smembers(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素
演示
//set操作 func setOperation(client *redis.Client) { client.SAdd("blacklist", "Obama") //向blanklist添加元素 client.SAdd("blacklist", "Hillary") //再次添加 client.SAdd("blacklist", "the Elder") //添加新元素 client.SAdd("whitelist", "the Elder") //向whitelist添加元素 //判断元素是否在集合中 isMember, err := client.SIsMember("blacklist", "Bush").Result() if err != nil { panic(err) } fmt.Println("Is Bush in blacklist:", isMember) //求交集,即既在黑名单中,又在白名单中 names, err := client.SInter("blacklist", "whitelist").Result() if err != nil { panic(err) } //获取到的元素是the Elder fmt.Println("Inter reqult:", names) //获取指定集合所有元素 all, err := client.SMembers("blacklist").Result() if err != nil { panic(err) } fmt.Println("All member:", all) }
哈希(hash)
方法
hset(key, field, value):向名称为key的hash中添加元素field hget(key, field):返回名称为key的hash中field对应的value hmget(key, (fields)):返回名称为key的hash中field i对应的value hmset(key, (fields)):向名称为key的hash中添加元素field hincrby(key, field, integer):将名称为key的hash中field的value增加integer hexists(key, field):名称为key的hash中是否存在键为field的域 hdel(key, field):删除名称为key的hash中键为field的域 hlen(key):返回名称为key的hash中元素个数 hkeys(key):返回名称为key的hash中所有键 hvals(key):返回名称为key的hash中所有键对应的value hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
演示
//hash操作 func hashOperation(client *redis.Client) { client.HSet("user_xys", "name", "xys") //向名称为user_xys的hash中添加元素name client.HSet("user_xys", "age", "18") //向名称为user_xys的hash中添加元素age //批量地向名称为user_test的hash中天剑name和age client.HMSet("user_test", map[string]string{"name": "test", "age": "20"}) //批量获取名为user_test的hash中的指定字段的值 fields, err := client.HMGet("user_test", "name", "age").Result() if err != nil { panic(err) } fmt.Println("fields in user_test:", fields) //获取名为user_xys的hash中字段个数 length, err := client.HLen("user_xys").Result() if err != nil { panic(err) } fmt.Println("field count in user_xys:", length) //字段个数 //删除名为user_test的字段 client.HDel("user_test", "age") age, err := client.HGet("user_tset", "age").Result() if err != nil { fmt.Printf("Get user_test age error:%v\n", err) } else { fmt.Println("user_test age is :", age) //字段个数为2 } }
redisgo
演示
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) //定义一个全局pool var pool *redis.Pool //初始化 func init() { pool = &redis.Pool{ MaxIdle: 8, //最大空闲连接数 MaxActive: 0, //表示和数据库最大连接数,0表示没限制 IdleTimeout: 100, //最大空闲时间 Dial: func() (redis.Conn, error) { //初始化链接代码,链接到那个ip的redis return redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("123456"), redis.DialDatabase(0), ) }, } } func poolOperation() { //先从pool取出一个链接 conn := pool.Get() defer conn.Close() //存入 _, err := conn.Do("Set", "name", "汤姆猫~~") if err != nil { fmt.Println("conn Do err=", err) return } //取出 r, err := redis.String(conn.Do("Get", "name")) if err != nil { fmt.Println("conn.Do err=", err) return } fmt.Println("r=", r) //如果我们要从pool取出链接,一定保证连接池没有关闭 //pool.Close() conn2 := pool.Get() _, err = conn2.Do("Set", "name2", "凯啼猫~~~") if err != nil { fmt.Println("conn Do err=", err) return } //取出 r2, err := redis.String(conn2.Do("Get", "name2")) if err != nil { fmt.Println("conn.Do err=", err) return } fmt.Println("r=", r2) //fmt.Println("conn2=",conn2) } //字符串操作 func stringOperaton() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //通过go向redis写入数据string _, err = conn.Do("Set", "name", "tomjerry毛毛") if err != nil { fmt.Println("set en=", err) return } //对数据设置有效期 _, err = conn.Do("expire", "name", 10) r, err := redis.String(conn.Do("Get", "name")) if err != nil { fmt.Println("set err=", err) return } fmt.Println("操作ok", r) } //列表操作 func listOperation() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //关闭 _, err = conn.Do("Lpush", "heroList", "宋江", 30, "卢俊义", 26) if err != nil { fmt.Println(err) } r, err := redis.String(conn.Do("rpop", "heroList")) fmt.Printf("%v", r) } //hash操作 func hashOperation() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //关闭 //2.通过go向redis写入数据string[key-val] _, err = conn.Do("HSet", "user01", "name", "john") if err != nil { fmt.Println("hset err=", err) return } _, err = conn.Do("HSet", "user01", "age", 18) if err != nil { fmt.Println("hset err=", err) return } //3.通过go向redis读取数据 r1, err := redis.String(conn.Do("HGet", "user01", "name")) if err != nil { fmt.Println("hget err=", err) return } //读取整型数据 r2, err := redis.Int(conn.Do("HGet", "user01", "age")) if err != nil { fmt.Println("hget err=", err) return } //因为返回r是interface{} //因为name对应的值是string,因此我们需要转换 //nameString:=r.(string)//类型断言 fmt.Printf("操作ok r1=%v r2=%v\n", r1, r2) //批量存入读取数据 _, err = conn.Do("MSet", "name", "硅谷", "address", "西雅图") r5, err := redis.Strings(conn.Do("MGet", "name", "address")) for _, v := range r5 { fmt.Println(v) } } func main() { poolOperation() }