go使用redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:
Go语言的Redis客户端,官方推荐了两个客户端:redigo和radix.v2
安装之:
go get github.com/mediocregopher/radix.v2
go get github.com/garyburd/redigo/redis

test_redigo.go
package main

import (
     " fmt "
     " github.com/garyburd/redigo/redis "
     " log "
)

// test common
func testCommonOperate() {
    // connect redis server
    c, err := redis.Dial( " tcp "" 127.0.0.1:6379 ")
     if err != nil {
        fmt.Println(err)
        log.Fatal( " connect redis-server error:  ", err)
         return
    }
    defer c.Close()

    // SET
    v, err := c.Do( " SET "" name "" red ")
     if err != nil {
        fmt.Println(err)
         return
    }
    fmt.Println(v)

    // GET
    v, err = redis.String(c.Do( " GET "" name "))
     if err != nil {
        fmt.Println(err)
         return
    }
    fmt.Println(v)

    // LPUSH
    c.Do( " lpush "" redlist "" qqq ")
    c.Do( " lpush "" redlist "" www ")
    c.Do( " lpush "" redlist "" eee ")

    // LRANGE
    values, _ := redis.Values(c.Do( " lrange "" redlist "" 0 "" 100 "))
     for _, v := range values {
        fmt.Println(string(v.([]byte)))
    }

    // Scan
    var v1 string
    redis.Scan(values, &v1)
    fmt.Println(v1)

    // piple line
    c.Send( " SET "" name "" red ")
    c.Send( " GET "" name ")
    c.Flush()
    c.Receive()
    c.Receive()
}

func subscribe() {
    c, err := redis.Dial( " tcp "" 127.0.0.1:6379 ")
     if err != nil {
        fmt.Println(err)
         return
    }
    defer c.Close()

    psc := redis.PubSubConn{c}
    psc.Subscribe( " redChatRoom ")
     for {
        switch v := psc.Receive().(type) {
        case redis.Message:
            fmt.Printf( " %s: message: %s\n ", v.Channel, v.Data)
        case redis.Subscription:
            fmt.Printf( " %s: %s %d\n ", v.Channel, v.Kind, v.Count)
        case error:
            fmt.Println(v)
             return
        }
    }
}

func testSubscribe() {
    go subscribe()
    go subscribe()
    go subscribe()
    go subscribe()
    go subscribe()

    c, err := redis.Dial( " tcp "" 127.0.0.1:6379 ")
     if err != nil {
        fmt.Println(err)
         return
    }
    defer c.Close()

     for {
        var s string
        fmt.Scanln(&s)
        _, err := c.Do( " PUBLISH "" redChatRoom ", s)
         if err != nil {
            fmt.Println( " pub err:  ", err)
             return
        }
    }
}

func main() {
    testCommonOperate()
    //testSubscribe()
}


test_radixv2.go
package main

import (
     " fmt "
     " github.com/mediocregopher/radix.v2/redis "
     " log "
     " strconv "
)

func test1() {
    conn, err := redis.Dial( " tcp "" localhost:6379 ")
     if err != nil {
        log.Fatal(err)
         return
    }
    defer conn.Close()

    resp := conn.Cmd( " HMSET "" album:1 "" title "" Electric Ladyland "" artist "" Jimi Hendrix "" price ", 4.95,  " likes ", 8)
     if resp.Err != nil {
        log.Fatal(resp.Err)
    }

    fmt.Println( " Electric Ladyland added! ")
}

func test2() {
    conn, err := redis.Dial( " tcp "" localhost:6379 ")
     if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    title, err := conn.Cmd( " HGET "" album:1 "" title ").Str()
     if err != nil {
        log.Fatal(err)
    }

    artist, err := conn.Cmd( " HGET "" album:1 "" artist ").Str()
     if err != nil {
        log.Fatal(err)
    }

    price, err := conn.Cmd( " HGET "" album:1 "" price ").Float64()
     if err != nil {
        log.Fatal(err)
    }

    likes, err := conn.Cmd( " HGET "" album:1 "" likes ").Int()
     if err != nil {
        log.Fatal(err)
    }

    fmt.Printf( " %s by %s: £%.2f [%d likes]\n ", title, artist, price, likes)
}

type Album struct {
    Title  string
    Artist string
    Price  float64
    Likes  int
}

func populateAlbum(reply map[string]string) (*Album, error) {
    var err error
    ab := new(Album)
    ab.Title = reply[ " title "]
    ab.Artist = reply[ " artist "]
    ab.Price, err = strconv.ParseFloat(reply[ " price "], 64)
     if err != nil {
         return nil, err
    }

    ab.Likes, err = strconv.Atoi(reply[ " likes "])
     if err != nil {
         return nil, err
    }
     return ab, nil
}

func test3() {
    conn, err := redis.Dial( " tcp "" localhost:6379 ")
     if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    reply, err := conn.Cmd( " HGETALL "" album:1 ").Map()
     if err != nil {
        log.Fatal(err)
    }

    ab, err := populateAlbum(reply)
     if err != nil {
        log.Fatal(err)
    }

    fmt.Println(ab)
}

func main() {
    test1()
    //test2()
    //test3()
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
5月前
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
262 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
4月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
5月前
|
NoSQL Go Redis
用 Go + Redis 实现分布式锁
用 Go + Redis 实现分布式锁
|
5月前
|
监控 NoSQL Go
Go语言中高效使用Redis的Pipeline
Redis 是构建高性能应用时常用的内存数据库,通过其 Pipeline 和 Watch 机制可批量执行命令并确保数据安全性。Pipeline 类似于超市购物一次性结账,减少网络交互时间,提升效率。Go 语言示例展示了如何使用 Pipeline 和 Pipelined 方法简化代码,并通过 TxPipeline 保证操作原子性。Watch 机制则通过监控键变化实现乐观锁,防止并发问题导致的数据不一致。这些机制简化了开发流程,提高了应用程序的性能和可靠性。
81 0
|
5月前
|
NoSQL Go Redis
Go语言中如何扫描Redis中大量的key
在Redis中,遍历大量键时直接使用`KEYS`命令会导致性能瓶颈,因为它会一次性返回所有匹配的键,可能阻塞Redis并影响服务稳定性。为解决此问题,Redis提供了`SCAN`命令来分批迭代键,避免一次性加载过多数据。本文通过两个Go语言示例演示如何使用`SCAN`命令:第一个示例展示了基本的手动迭代方式;第二个示例则利用`Iterator`简化迭代过程。这两种方法均有效地避免了`KEYS`命令的性能问题,并提高了遍历Redis键的效率。
65 0
|
7月前
|
NoSQL Go Redis
如何使用 Go 和 `go-redis/redis` 库连接到 Redis 并执行一些基本操作
如何使用 Go 和 `go-redis/redis` 库连接到 Redis 并执行一些基本操作
109 1
|
22天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
166 85
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
88 6
|
19天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。