简单方便的在Golang中使用Redis【Golang 入门系列】七

mb5fe94b3e552d9 · · 374 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

安装

1. Redis 的安装很简单,我这里测试直接用的是windows 的版本。如何安装就不细说了。想了解的可以看之前的文章:https://www.cnblogs.com/zhangweizhong/category/771056.html

 

2. golang 客户端,用的是 go-redis,

  1.   go get github.com/go-redis

       2.  接着在代码中导入此包即可: 

  import "github.com/go-redis/redis"

 

基本操作

创建Redis连接客户端

通过 redis.NewClient 函数即可创建一个 redis 客户端, 这个方法接收一个 redis.Options 对象参数, 通过这个参数, 我们可以配置 redis 相关的属性, 例如 redis 服务器地址, 数据库名, 数据库密码等。


// 创建 redis 客户端func GetRedisClient() *Client {    redisdb := NewClient(&Options{        Addr:     "127.0.0.1:6379",        Password: "", // no password set        DB:       0,                 // use default DB    })
   pong, err := redisdb.Ping().Result()    if err != nil {        fmt.Println(pong, err)    }    return redisdb}

通过 cient.Ping() 来检查是否成功连接到了 redis 服务器

 

String 操作

  Set(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的value

  GetSet(key, value):给名称为key的string赋予上一次的value

  MGet(key1, key2,…, key N):返回库中多个string的value

  SetNX(key, value):添加string,名称为key,值为value

  SetXX(key, time, value):向库中添加string,设定过期时间time

  MSet(key N, value N):批量设置多个string的值

  MSetNX(key N, value N):如果所有名称为key i的string都不存在

  Incr(key):名称为key的string增1操作

  Incrby(key, integer):名称为key的string增加integer

  Decr(key):名称为key的string减1操作

  Decrby(key, integer):名称为key的string减少integer

  Append(key, value):名称为key的string的值附加valuesubstr(key, start, end):返回名称为key的string的value的子串

func StringDemo() {    fmt.Println("-----------------------welcome to StringDemo-----------------------")    redisClient:=GetRedisClient()    if redisClient ==nil{        fmt.Errorf("StringDemo redisClient is nil")        return    }
   name := "张三"    key :="name:zhangsan"    redisClient.Set(key , name,1 * time.Second)    val := redisClient.Get(key)    if val == nil {        fmt.Errorf("StringDemo get error")    }    fmt.Println("name", val)}

 

List 操作

  RPush(key, value):在名称为key的list尾添加一个值为value的元素

  LPush(key, value):在名称为key的list头添加一个值为value的 元素

  LLen(key):返回名称为key的list的长度

  LRange(key, start, end):返回名称为key的list中start至end之间的元素

  LTrim(key, start, end):截取名称为key的list

  LIndex(key, index):返回名称为key的list中index位置的元素

  LSet(key, index, value):给名称为key的list中index位置的元素赋值

  LRem(key, count, value):删除count个key的list中值为value的元素

  LPop(key):返回并删除名称为key的list中的首元素

  RPop(key):返回并删除名称为key的list中的尾元素

  BLPop(key1, key2,… key N, timeout):lpop命令的block版本。

  BRPop(key1, key2,… key N, timeout):rpop的block版本。

  RPopLPush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

func ListDemo(){    fmt.Println("-----------------------welcome to ListDemo-----------------------")    redisClient:=GetRedisClient()    if redisClient == nil {        fmt.Errorf("ListDemo redisClient is nil")        return    }    articleKey := "article"    result,err:=redisClient.RPush(articleKey, "a","b","c").Result() //    if err!=nil {        fmt.Println(err)        return    }    fmt.Println("result:",result)
   result,err = redisClient.LPush(articleKey, "d").Result() //    if err!=nil {        fmt.Println(err)        return    }    fmt.Println("result:",result)
   length, err := redisClient.LLen(articleKey).Result()    if err != nil {        fmt.Println("ListDemo LLen is nil")    }    fmt.Println("length: ", length) // 长度
   mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()    if err1!=nil {        fmt.Println(err1)        return    }    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }}


Hash 操作

  HSet(key, field, value):向名称为key的hash中添加元素field

  HGet(key, field):返回名称为key的hash中field对应的value

  HMget(key, (fields)):返回名称为key的hash中field i对应的value

  HMset(key, (fields)):向名称为key的hash中添加元素field

  HIncrby(key, field, integer):将名称为key的hash中field的value增加integer

  HExists(key, field):名称为key的hash中是否存在键为field的域

  HDel(key, field):删除名称为key的hash中键为field的域

  HLen(key):返回名称为key的hash中元素个数

  HKeys(key):返回名称为key的hash中所有键

  HVals(key):返回名称为key的hash中所有键对应的value

  HGetall(key):返回名称为key的hash中所有的键(field)及其对应的value

func HashDemo() {    fmt.Println("-----------------------welcome to HashDemo-----------------------")    redisClient := GetRedisClient()    if redisClient == nil {        fmt.Errorf("HashDemo redisClient is nil")        return    }    article := Article{18, "测试文章内容22222", "测试文章内容22222测试文章内容22222测试文章内容22222", 10, 0}    articleKey := "article:18"     redisClient.HMSet(articleKey, ToStringDictionary(&article))    mapOut := redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n")     redisClient.HSet(articleKey, "Content", "测试文章内容")    mapOut = redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n")     view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()    if err != nil {        fmt.Printf("\n HIncrBy error=%s ", err)    } else {        fmt.Printf("\n HIncrBy Views=%d ", view)    }    fmt.Print("\n")     mapOut = redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n") }


连接池

go-redis 已经实现了 redis 的连接池管理, 因此我们不需要自己手动管理 redis 的连接。

默认情况下,连接池大小是10, 可以通过 redis.Options 的 PoolSize 属性, 我们设置了 redis 连接池的大小为5。

func GetRedisClientPool() *Client{    redisdb := NewClient(&Options{        Addr: "127.0.0.1:6379",        Password: "",        DB: 0,        PoolSize: 5,})
   pong, err := redisdb.Ping().Result()    if err != nil {        fmt.Println(pong, err)    }    return redisdb}
// 连接池测试func connectPoolTest() {    fmt.Println("-----------------------welcome to connect Pool Test-----------------------")    client :=GetRedisClientPool()    wg := sync.WaitGroup{}    wg.Add(10)
   for i := 0; i < 10; i++ {        go func() {            defer wg.Done()
           for j := 0; j < 1000; j++ {                client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err()                client.Get(fmt.Sprintf("name%d", j)).Result()            }
           fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);        }()    }
   wg.Wait()}


完整代码

package main
import (    "fmt"    . "github.com/go-redis/redis"    . "redisDemo/models"    "time"    "sync")
func main() {    fmt.Println("-----------------------welcome to redisdemo-----------------------")    //StringDemo()    //ListDemo()    //HashDemo()    connectPoolTest()}
func StringDemo() {    fmt.Println("-----------------------welcome to StringDemo-----------------------")    redisClient:=GetRedisClient()    if redisClient ==nil{        fmt.Errorf("StringDemo redisClient is nil")        return    }
   name := "张三"    key :="name:zhangsan"    redisClient.Set(key , name,1 * time.Second)    val := redisClient.Get(key)    if val == nil {        fmt.Errorf("StringDemo get error")    }    fmt.Println("name", val)}
func ListDemo(){    fmt.Println("-----------------------welcome to ListDemo-----------------------")    redisClient:=GetRedisClient()    if redisClient == nil {        fmt.Errorf("ListDemo redisClient is nil")        return    }    articleKey := "article"    result,err:=redisClient.RPush(articleKey, "a","b","c").Result() //在名称为 key 的list尾添加一个值为value的元素    if err!=nil {        fmt.Println(err)        return    }    fmt.Println("result:",result)
   result,err = redisClient.LPush(articleKey, "d").Result() //在名称为 key 的list头添加一个值为value的元素    if err!=nil {        fmt.Println(err)        return    }    fmt.Println("result:",result)
   length, err := redisClient.LLen(articleKey).Result()    if err != nil {        fmt.Println("ListDemo LLen is nil")    }    fmt.Println("length: ", length) // 长度
   mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()    if err1!=nil {        fmt.Println(err1)        return    }    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }}
func HashDemo() {    fmt.Println("-----------------------welcome to HashDemo-----------------------")    redisClient := GetRedisClient()    if redisClient == nil {        fmt.Errorf("HashDemo redisClient is nil")        return    }    article := Article{18, "测试文章内容22222", "测试文章内容22222测试文章内容22222测试文章内容22222", 10, 0}    articleKey := "article:18"
   redisClient.HMSet(articleKey, ToStringDictionary(&article))    mapOut := redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n")
   redisClient.HSet(articleKey, "Content", "测试文章内容")    mapOut = redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n")
   view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()    if err != nil {        fmt.Printf("\n HIncrBy error=%s ", err)    } else {        fmt.Printf("\n HIncrBy Views=%d ", view)    }    fmt.Print("\n")
   mapOut = redisClient.HGetAll(articleKey).Val()    for inx, item := range mapOut {        fmt.Printf("\n %s:%s", inx, item)    }    fmt.Print("\n")
}
func GetRedisClient() *Client {    redisdb := NewClient(&Options{        Addr:     "127.0.0.1:6379",        Password: "", // no password set        DB:       0,                 // use default DB    })
   pong, err := redisdb.Ping().Result()    if err != nil {        fmt.Println(pong, err)    }    return redisdb}
func GetRedisClientPool() *Client{    redisdb := NewClient(&Options{        Addr: "127.0.0.1:6379",        Password: "",        DB: 0,        PoolSize: 5,})
   pong, err := redisdb.Ping().Result()    if err != nil {        fmt.Println(pong, err)    }    return redisdb}
// 连接池测试func connectPoolTest() {    fmt.Println("-----------------------welcome to connect Pool Test-----------------------")    client :=GetRedisClientPool()    wg := sync.WaitGroup{}    wg.Add(10)
   for i := 0; i < 10; i++ {        go func() {            defer wg.Done()
           for j := 0; j < 1000; j++ {                client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err()                client.Get(fmt.Sprintf("name%d", j)).Result()            }
           fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);        }()    }
   wg.Wait()}


最后

1. go语言使用Redis 还是非常简单的,以上已经把Redis 的基本的用法讲完了。大家可以自己动手写代码试试。



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb5fe94b3e552d9

查看原文:简单方便的在Golang中使用Redis【Golang 入门系列】七

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

374 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传