在專案開發中redis的使用也比較頻繁,本文介紹了Go語言如何操作Redis,
Redis介紹
Redis是一個開源的記憶體資料庫,Redis提供了多種不同型別的資料結構,很多業務場景下的問題都可以很自然地映射到這些資料結構上,除此之外,通過復制、持久化和客戶端分片等特性,我們可以很方便地將Redis擴展成一個能夠包含數百GB資料、每秒處理上百萬次請求的系統,
Redis支持的資料結構
Redis支持諸如字串(strings)、哈希(hashes)、串列(lists)、集合(sets)、帶范圍查詢的排序集合(sorted sets)、位圖(bitmaps)、hyperloglogs、帶半徑查詢和流的地理空間索引等資料結構(geospatial indexes),
Redis應用場景
- 快取系統,減輕主資料庫(MySQL)的壓力,
- 計數場景,比如微博、抖音中的關注數和粉絲數,
- 熱門排行榜,需要排序的場景特別適合使用ZSET,
- 利用LIST可以實作佇列的功能,
Redis與Memcached比較
Memcached中的值只支持簡單的字串,Reids支持更豐富的5中資料結構型別, Redis的性能比Memcached好很多 Redis支持RDB持久化和AOF持久化, Redis支持master/slave模式,
Go操作Redis
安裝
Go語言中使用第三方庫https://github.com/go-redis/redis連接Redis資料庫并進行操作,使用以下命令下載并安裝:
go get -u github.com/go-redis/redis
連接
// 宣告一個全域的redisdb變數
var redisdb *redis.Client
// 初始化連接
func initClient() (err error) {
redisdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
_, err = redisdb.Ping().Result()
if err != nil {
return err
}
return nil
}
基本使用
set/get示例
func redisExample() {
err := redisdb.Set("score", 100, 0).Err()
if err != nil {
fmt.Printf("set score failed, err:%v\n", err)
return
}
val, err := redisdb.Get("score").Result()
if err != nil {
fmt.Printf("get score failed, err:%v\n", err)
return
}
fmt.Println("score", val)
val2, err := redisdb.Get("name").Result()
if err == redis.Nil {
fmt.Println("name does not exist")
} else if err != nil {
fmt.Printf("get name failed, err:%v\n", err)
return
} else {
fmt.Println("name", val2)
}
}
zset示例
func redisExample2() {
zsetKey := "language_rank"
languages := []*redis.Z{
&redis.Z{Score: 90.0, Member: "Golang"},
&redis.Z{Score: 98.0, Member: "Java"},
&redis.Z{Score: 95.0, Member: "Python"},
&redis.Z{Score: 97.0, Member: "JavaScript"},
&redis.Z{Score: 99.0, Member: "C/C++"},
}
// ZADD
num, err := redisdb.ZAdd(zsetKey, languages...).Result()
if err != nil {
fmt.Printf("zadd failed, err:%v\n", err)
return
}
fmt.Printf("zadd %d succ.\n", num)
// 把Golang的分數加10
newScore, err := redisdb.ZIncrBy(zsetKey, 10.0, "Golang").Result()
if err != nil {
fmt.Printf("zincrby failed, err:%v\n", err)
return
}
fmt.Printf("Golang's score is %f now.\n", newScore)
// 取分數最高的3個
ret, err := redisdb.ZRevRangeWithScores(zsetKey, 0, 2).Result()
if err != nil {
fmt.Printf("zrevrange failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
// 取95~100分的
op := &redis.ZRangeBy{
Min: "95",
Max: "100",
}
ret, err = redisdb.ZRangeByScoreWithScores(zsetKey, op).Result()
if err != nil {
fmt.Printf("zrangebyscore failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
}
輸出結果如下:
$ ./06redis_demo zadd 0 succ. Golang's score is 100.000000 now. Golang 100 C/C++ 99 Java 98 JavaScript 97 Java 98 C/C++ 99 Golang 100
更多詳情請查閱檔案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45067.html
標籤:Go
上一篇:Go操作MongoDB
下一篇:Go操作MySQL
