网站首页 > 开源技术 正文
前面讲介绍了Go 语言的基础入门及Golang的语法结构。同时也介绍Golang的接口及协程等内容。感兴趣的朋友可以先看看之前的文章。这些都是Golang的基础内容,必须熟练掌握。
接下来我会介绍golang 的实战,实际开发过程中怎么用golang写实际的功能需求,怎么集成其他框架。
今天跟大家分享的是如何在golang中使用redis数据缓存。
安装
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 服务器
基本使用
Redis支持诸如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、带范围查询的排序集合(sorted sets)、位图(bitmaps)、hyperloglogs、带半径查询和流的地理空间索引等数据结构(geospatial indexes)。其实主要常用的就是:字符串、列表、哈希和集合这四种数据结构。
1、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)
}2、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)
    }
}3、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()
}最后
以上已经把Redis 的基本的用法讲完了,go语言使用Redis 还是非常简单的,大家可以自己动手写代码试试。
获取完整的源代码,欢迎关注:章为忠学架构
推荐阅读:
Golang 入门系列(六)理解Go协程Goroutine,这篇就够了!
Golang 入门系列(四)Golang中的interface,一看就明白
Golang 入门系列(三)打好基本功: Golang 语法基础!
猜你喜欢
- 2024-10-27 几个小技巧,让你的Redis程序快如闪电
 - 2024-10-27 掌握这些 Redis 技巧,百亿数据量不在话下
 - 2024-10-27 「高频 Redis 面试题」Redis 事务是否具备原子性?
 - 2024-10-27 Spring系列之Redis的两种集成方式
 - 2024-10-27 架构篇-一分钟掌握可扩展架构(可扩展是什么意思)
 - 2024-10-27 图解Redis-命令系统设计(redis命令大全)
 - 2024-10-27 Redis 数据持久化与发布订阅(redis持久化aof)
 - 2024-10-27 依赖倒置原则详解(对依赖倒置的表述错误的是)
 - 2024-10-27 五种分布式锁(分布式锁最佳实践)
 - 2024-10-27 Alibaba/IOC-golang 正式开源——打造服务于go开发者的IOC框架
 
欢迎 你 发表评论:
- 1590℃北京那些看上去很牛的车牌们!(北京厉害车牌)
 - 1107℃2025年度视频去水印软件TOP5对比:哪款最值得用
 - 683℃《我的世界》不同版本的差异 ——新手向
 - 595℃新疆话里的“虫子”
 - 516℃中兴光猫 Telnet下设置大全(中兴光猫命令大全)
 - 513℃蓝牙设备配对失败的系统性解决方案与技术解析
 - 509℃未备份电脑文件数据恢复的七种方法
 - 488℃工艺管道常用英文缩写 英汉对照
 
- 最近发表
 
- 标签列表
 - 
- jdk (81)
 - putty (66)
 - rufus (78)
 - 内网穿透 (89)
 - okhttp (70)
 - powertoys (74)
 - windowsterminal (81)
 - netcat (65)
 - ghostscript (65)
 - veracrypt (65)
 - asp.netcore (70)
 - wrk (67)
 - aspose.words (80)
 - itk (80)
 - ajaxfileupload.js (66)
 - sqlhelper (67)
 - express.js (67)
 - phpmailer (67)
 - xjar (70)
 - redisclient (78)
 - wakeonlan (66)
 - tinygo (85)
 - startbbs (72)
 - webftp (82)
 - vsvim (79)
 
 

本文暂时没有评论,来添加一个吧(●'◡'●)