golang中的goredis
生活随笔
收集整理的這篇文章主要介紹了
golang中的goredis
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
連接
func RedisConPoint(db int) *redis.Client {addr := beego.AppConfig.String("redis_host")password := beego.AppConfig.String("redis_password")client := redis.NewClient(&redis.Options{Addr: addr,Password: password,DB: db,ReadTimeout: time.Duration(10) * time.Second,WriteTimeout: time.Duration(10) * time.Second,PoolSize: 5,})_, err := client.Ping().Result()if err != nil {fmt.Println(err)}return client}//退出redis func RedisQuit(client redis.Client) {err := client.Close()if err != nil {fmt.Println(err)}}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的子串在 go-redis 中, 我們可以直接找到對應的操作方法, 直接上代碼:
// 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的頭部同樣地, 在 go-redis 中也可以找到對應的方法, 下面是一個簡單的示例:
// 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() //返回名稱為 fruit 的list的長度if err != nil {panic(err)}fmt.Println("length: ", length) // 長度為2value, err := client.LPop("fruit").Result() //返回并刪除名稱為 fruit 的list中的首元素if err != nil {panic(err)}fmt.Println("fruit: ", value)value, err = client.RPop("fruit").Result() // 返回并刪除名稱為 fruit 的list中的尾元素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的一個元素接下來是 go-redis 的 set 操作:
// set 操作 func setOperation(client *redis.Client) {client.SAdd("blacklist", "Obama") // 向 blacklist 中添加元素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 result: ", names)// 獲取指定集合的所有元素all, err := client.SMembers("blacklist").Result()if err != nil {panic(err)}fmt.Println("All member: ", all) }hash 操作
redis 的 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)及其對應的valuego-redis 中的 hash 操作:
// hash 操作 func hashOperation(client *redis.Client) {client.HSet("user_xys", "name", "xys"); // 向名稱為 user_xys 的 hash 中添加元素 nameclient.HSet("user_xys", "age", "18"); // 向名稱為 user_xys 的 hash 中添加元素 age// 批量地向名稱為 user_test 的 hash 中添加元素 name 和 ageclient.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) // 字段個數為2// 刪除名為 user_test 的 age 字段client.HDel("user_test", "age")age, err := client.HGet("user_test", "age").Result()if err != nil {fmt.Printf("Get user_test age error: %v\n", err)} else {fmt.Println("user_test age is: ", age) // 字段個數為2} }發布
//參數1 頻道名 字符串類型 //參數2 發送的內容 他是個 interface{} 類型 因為我要和前端對接 所以data是我轉的json字符err := RedisClient.Publish("message", data).Err()if err != nil {return errors.New("發布失敗")}訂閱
func Subscribe(){//參數1 頻道名 字符串類型pubsub := redis.Redis.Subscribe("homework")_, err := pubsub.Receive()if err != nil {return}ch := pubsub.Channel()for msg := range ch {fmt.Println( msg.Channel, msg.Payload, "\r\n")} } //這里的訂閱了頻道,阻塞了代碼繼續執行,所以我們 需要 go Subscribe() 來讓我們的程序 繼續執行 并且go Subscribe() 寫在init方總結
以上是生活随笔為你收集整理的golang中的goredis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的web服务平滑重启
- 下一篇: golang中的collection