登錄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