如何在Go中操作Redis服務(wù)
本文將分享在Golang中如何操作Redis。文章中演示的組件庫(kù)為go-redis,本文會(huì)對(duì)該組件進(jìn)行詳細(xì)的演示。
go-redis
go-redis是一個(gè)基于Golang語(yǔ)言的Redis客戶端組件。其功能也非常的強(qiáng)大與完善。支持如下功能。
1. ? Redis通用命令支持、各大數(shù)據(jù)類型支持。
2. ? Redis Cluster支持。
3. ? Redis Replication支持。
4. ? Redis Sentinel支持。
5. ? 支持管道、事務(wù)、發(fā)布/訂閱、Luau腳本、模擬和分布式鎖等。
對(duì)應(yīng)使用Golang操作Redis,另外還有一個(gè)組件,該組件相對(duì)go-redis有一些區(qū)別,2個(gè)項(xiàng)目之間的主要區(qū)別在于go-redis為每個(gè)Redis命令提供了類型安全的API。大致區(qū)別如下圖:

使用演示
首先在本地編譯安裝Redis服務(wù),這里可以根據(jù)自己的方式來(lái)進(jìn)行安裝,只要能保證Redis可使用就行。
//?解壓文件
tar?-zxvf?redis-5.3.7.tgz
//?編譯并安裝
cd?redis-5.3.7?&&?make?&&?make?install
//?配置Redis
需要將redis.conf中的daemon?設(shè)置為yes?開(kāi)啟守護(hù)進(jìn)程模式運(yùn)行。
//?啟用Redis服務(wù)
redis-server?./redis.conf接下來(lái)就可以正常操作Redis服務(wù)。
配置Redis連接信息
package?config
import?(
????"time"
????"github.com/go-redis/redis/v8"
)
func?GetConnect()?*redis.Client?{
????return?redis.NewClient(&redis.Options{
????????Addr:????????"localhost:6379",?//?連接地址
????????Password:????"",???????????????//?密碼
????????DB:??????????0,????????????????//?數(shù)據(jù)庫(kù)編號(hào)
????????DialTimeout:?1?*?time.Second,??//?鏈接超時(shí)
????})
}操作字符串
result,?err?:=?config.GetConnect().Set(context.Background(),?"name",?time.Second,?time.Second*10).Result()
if?err?!=?nil?{
??fmt.Println(err)
??return
}
fmt.Println(result)
//?運(yùn)行腳本
╰─?go?run?main.go
redis服務(wù)連接成功
OK操作List
func?list()?{
????//?push數(shù)據(jù)
????result,?err?:=?config.GetConnect().LPush(context.Background(),?"list",?1).Result()
????if?err?!=?nil?{
????????fmt.Println(err)
????????return
????}
????fmt.Println(result)
????//?pop數(shù)據(jù)
????str,?err?:=?config.GetConnect().LPop(context.Background(),?"list").Result()
????if?err?!=?nil?{
????????fmt.Println(err)
????????return
????}
????fmt.Println(str)
}
//?運(yùn)行腳本
╰─?go?run?main.go
redis服務(wù)連接成功
1
1操作hash
func?hash()?{
????//?單個(gè)添加
????//result,?err?:=?config.GetConnect().HSet(context.Background(),?"hash",?"key1",?"value1").Result()
????//?批量添加
????//result,?err?:=?config.GetConnect().HSet(context.Background(),?"hash",?"key1",?"value1",?"key2",?"value2").Result()
????//?使用切片
????//result,?err?:=?config.GetConnect().HSet(context.Background(),?"hash",?[]string{"key3",?"value3",?"key4",?"value4"}).Result()
????//?使用map
????hasMap?:=?make(map[string]string)
????hasMap["key5"]?=?"value5"
????hasMap["key6"]?=?"value6"
????result,?err?:=?config.GetConnect().HSet(context.Background(),?"hash",?hasMap).Result()
????if?err?!=?nil?{
????????fmt.Println(err)
????????return
????}
????fmt.Println(result)
}限流
go?get?github.com/go-redis/redis_rate/v9rdb?:=?redis.NewClient(&redis.Options{
????Addr:?"localhost:6379",
})
limiter?:=?redis_rate.NewLimiter(rdb)
res,?err?:=?limiter.Allow(ctx,?"project:123",?redis_rate.PerSecond(10))
if?err?!=?nil?{
????panic(err)
}
fmt.Println("allowed",?res.Allowed,?"remaining",?res.Remaining)布隆過(guò)濾器
func?bloomFilter(ctx?context.Context,?rdb?*redis.Client)?{
????inserted,?err?:=?rdb.Do(ctx,?"BF.ADD",?"bf_key",?"item0").Bool()
????if?err?!=?nil?{
????????panic(err)
????}
????if?inserted?{
????????fmt.Println("item0?was?inserted")
????}
????for?_,?item?:=?range?[]string{"item0",?"item1"}?{
????????exists,?err?:=?rdb.Do(ctx,?"BF.EXISTS",?"bf_key",?item).Bool()
????????if?err?!=?nil?{
????????????panic(err)
????????}
????????if?exists?{
????????????fmt.Printf("%s?does?exist\n",?item)
????????}?else?{
????????????fmt.Printf("%s?does?not?exist\n",?item)
????????}
????}
}評(píng)論
圖片
表情
