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

使用演示
首先在本地編譯安裝Redis服務(wù),這里可以根據(jù)自己的方式來進行安裝,只要能保證Redis可使用就行。
//?解壓文件
tar?-zxvf?redis-5.3.7.tgz
//?編譯并安裝
cd?redis-5.3.7?&&?make?&&?make?install
//?配置Redis
需要將redis.conf中的daemon?設(shè)置為yes?開啟守護進程模式運行。
//?啟用Redis服務(wù)
redis-server?./redis.conf接下來就可以正常操作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ù)庫編號
????????DialTimeout:?1?*?time.Second,??//?鏈接超時
????})
}操作字符串
result,?err?:=?config.GetConnect().Set(context.Background(),?"name",?time.Second,?time.Second*10).Result()
if?err?!=?nil?{
??fmt.Println(err)
??return
}
fmt.Println(result)
//?運行腳本
╰─?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)
}
//?運行腳本
╰─?go?run?main.go
redis服務(wù)連接成功
1
1操作hash
func?hash()?{
????//?單個添加
????//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)布隆過濾器
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)
????????}
????}
}評論
圖片
表情
