golang連接redis實現高性能緩存

登錄redis數據庫

redis-cli -h 127.0.0.1 -p 6379 -a xxx (-a 密碼)

查看redis版本

redis-cli -v

驗證redis安裝成功
redis 127.0.0.1:6379>PING
PONG
golang連接redis
import (
    "github.com/go-redis/redis"
)
client := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "root",
        DB:       0,
    })
    //延遲到程序結束關閉鏈接
    defer client.Close()
    //ping
    pong, err := client.Ping().Result()
    if err != nil {
        fmt.Println("ping error", err.Error())
        return
    }
    fmt.Println("ping result:", pong)
redis鎖

github鏈接:https://github.com/bsm/redislock

import (
  "fmt"
  "time"

  "github.com/bsm/redislock"
  "github.com/go-redis/redis/v7"
)

func main() {
	// Connect to redis.
	client := redis.NewClient(&redis.Options{
		Network:	"tcp",
		Addr:		"127.0.0.1:6379",
	})
	defer client.Close()

	// Create a new lock client.
	locker := redislock.New(client)

	// Try to obtain lock.
	lock, err := locker.Obtain("key", 100*time.Second, nil)
	if err == redislock.ErrNotObtained {
		fmt.Println("Could not obtain lock!")
	} else if err != nil {
		log.Fatalln(err)
	}

	// Don't forget to defer Release.
	defer lock.Release()
	fmt.Println("I have a lock!")

	// Sleep and check the remaining TTL.
	time.Sleep(50 * time.Second)
	if ttl, err := lock.TTL(); err != nil {
		log.Fatalln(err)
	} else if ttl > 0 {
		fmt.Println("Yay, I still have my lock!")
	}

	// Extend my lock.
	if err := lock.Refresh(100*time.Millisecond, nil); err != nil {
		log.Fatalln(err)
	}

	// Sleep a little longer, then check.
	time.Sleep(100 * time.Millisecond)
	if ttl, err := lock.TTL(); err != nil {
		log.Fatalln(err)
	} else if ttl == 0 {
		fmt.Println("Now, my lock has expired!")
	}

}

redis存儲的5種數據類型

1、String: 字符串
2、Hash: 散列
3、List: 列表
4、Set: 無重複集合
5、Sorted Set: 有序無重複集合(數據都帶優先級)

string類型
redis 127.0.0.1:6379>SET amberStr "amber"
redis 127.0.0.1:6379>GET amberStr
"amber"

golang實現string

key := "amberStr"
err = client.Set(key, "amber", time.Hour).Err()  
value, err := client.Get(key).Result()
hash類型
redis 127.0.0.1:6379> HMSET amberHS one "Hello" two "World"
"OK"
redis 127.0.0.1:6379> HGET amberHS one
"Hello"
redis 127.0.0.1:6379> HGET amberHS two
"World"
redis 127.0.0.1:6379> DEL runoob

golang實現hash

key := "amberHASH"  
client.HSet(key, "name", "amber")  
client.HSet(key, "age", 18)  
  
//get hash  
hashGet, _ := client.HGet(key, "name").Result()  
fmt.Println("HGet name", hashGet)  
  
//獲取所有hash 返回map  
hashGetAll, _ := client.HGetAll(key).Result()  
fmt.Println("HGetAll", hashGetAll)
list類型
redis 127.0.0.1:6379> rpush amberLS hello
(integer) 1
redis 127.0.0.1:6379> rpush amberLS world
(integer) 2
redis 127.0.0.1:6379> rpush amberLS !
(integer) 3
redis 127.0.0.1:6379> lrange amberLS 0 10
1) "hello"
2) "world"
3) "!"
redis 127.0.0.1:6379> DEL amberLS 

golang實現list

key := "amberLS"  
client.RPush(key, "hello", 10, "world", 15, "golang", 20).Err()  
  
//lpop 取出並移除左邊第一個元素  
first, _ := client.LPop(key).Result()  
  
//blpop 取出並移除左邊第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。  
first2, _ := client.BLPop(time.Second*60, key).Result()  
  
//數據長度  
listLen, _ := client.LLen(key).Result()  
fmt.Println("list length", listLen)  
  
//獲取列表  
listGet, _ := client.LRange(key, 1, 2).Result()  
fmt.Println("索引1-2的2個元素元素", listGet)

set類型
redis 127.0.0.1:6379>SADD amberSet "amber"

redis 127.0.0.1:6379>SMEMBERS amberSet

redis 127.0.0.1:6379> SETNX unique "one" 
(integer) 1

redis 127.0.0.1:6379> SETNX unique "two"  
(integer) 0

redis 127.0.0.1:6379> GET unique 
"one"

golang實現set

key := "amberSet"  
client.SAdd(key, "cat")  
client.SAdd(key, "dog")  
client.SAdd(key, "monkey")  
client.SAdd(key, ["rabbit", "tiger"])  
  
//獲取集合的所有成員  
setList, _ := client.SMembers(key).Result()  

//移除集合裏的元素 
client.SRem(key, "cat")  
  
//移除並返回set的一個隨機元素  
setFirst, _ := client.SPop(key).Result() 

//獲取集合的所有的元素
setList, _ := client.SMembers(key).Result()

//移除並返回set的一個隨機元素,因爲set是無序的
setFirst, _ := client.SPop(key).Result()

//返回集合中元素的數量
count, _ := client.Scard(key).Result()  

//刪除集合中指定元素,若元素不存在則忽略,返回值是刪除元素的數量,不存在的不統計在內
count, _ := client.SRem(key,"dog").Result()

//刪除整個set集合
client.Del(key).Result()

//設置集合的過期時間
client.Expire(key, time.Hour).Result()

//設置鎖
client.SetNX("key", "true", time.Second).Result()
ZSet類型

注意這裏優先級是數字,在對象前面

redis 127.0.0.1:6379> zadd amberZSet 10 dog
(integer) 1
redis 127.0.0.1:6379> zadd amberZSet 20 kitty
(integer) 1
redis 127.0.0.1:6379> zadd amberZSet 30 monkey
(integer) 1
redis 127.0.0.1:6379> zadd amberZSet 30 monkey
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE amberZSet 0 1000
1) "dog"
2) "kitty"
3) "monkey"

golang實現zset

key := "amberSet"  
ranking := []*redis.Z{  
  &redis.Z{Score: 100.0, Member: "dog"},  
  &redis.Z{Score: 80.0, Member: "cat"},  
  &redis.Z{Score: 70.0, Member: "kitty"},  
  &redis.Z{Score: 75.0, Member: "monkey"},  
}  
client.ZAdd(zsetKey, ranking...)  

//cat+5分  
newScore, err := client.ZIncrBy(key, 5.0, "cat").Result()  
fmt.Println("加5分後的最新分數", newScore)  

//取zset裏的前4名熱度的動物,這裏僅是取出來
zset, _ := client.ZRevRangeWithScores(key, 0, 3).Result()  
fmt.Println("zset前4名", zset)

//隨機pop優先級最大/最小的key和value,redis5.0以後支持
keyValue, _ := client.ZPopMax(key).Result()  
keyValue, _ := client.ZPopMin(key).Result()  

參考連接:https://redis.readthedocs.io/en/2.4/sorted_set.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章