1. 如何在Go中操作Redis服務(wù)

        共 3131字,需瀏覽 7分鐘

         ·

        2022-05-26 12:36

        本文將分享在Golang中如何操作Redis。文章中演示的組件庫(kù)為go-redis,本文會(huì)對(duì)該組件進(jìn)行詳細(xì)的演示。

        go-redis

        go-redis是一個(gè)基于Golang語(yǔ)言的Redis客戶端組件。其功能也非常的強(qiáng)大與完善。支持如下功能。

        1. 1. ? Redis通用命令支持、各大數(shù)據(jù)類型支持。

        2. 2. ? Redis Cluster支持。

        3. 3. ? Redis Replication支持。

        4. 4. ? Redis Sentinel支持。

        5. 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/v9
        rdb?:=?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)
        ????????}
        ????}
        }


        瀏覽 85
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 成人AV一区二区三区无码电影 | 亚洲色图第三页 | 自慰影院 | 国产成人片 | 91aaa精品无码 |