Go 如何优雅的使用Redis | 青训营

46 阅读4分钟

非关系型数据库,也称NoSQL数据库,采用不同于关系数据“行列”组织的数据模型,可以混合支持多种数据类型。对比关系型数据库,NoSQL数据库采用更简单的设计方式,更灵活的数据模型,在设计上有着更好的扩展能力,这使得NoSQL数据库能更有效地应对数据负载超过单个服务器承载能力的应用场景。

NoSQL数据库是非关系型数据库的统称,其中 “No”指的是“Not Only”,表示不止于SQL;今天我们来说一说非关系型数据库中的 Redis,我们将使用go语言去连接和使用 Redis。

一、Redis介绍

Redis 是由 Salvatore Sanfilippo 用C语言开发的一款开源的、高性能的键值对存储数据库,它采用 BSD 协议,为了适应不同场景下的存储需求,提供了多种键值数据类型。

到目前为止,Redis 支持的键值数据类型有字符串、列表、有序集合、散列及集合等。正是因为它有如此丰富的数据类型的支持,才会有庞大的用户群体。

Redis 内置复制、Lua 脚本、LRU 收回、事务及不同级别磁盘持久化功能,同时通过 Redis Sentinel 实现高可用,通过 Redis Cluster 提供自动分区等相关功能。

Redis 是一款功能强大、支持多种数据类型的数据库,它具有许多优秀的特性,具体如下。

  1. 支持多种计算机编程语言,如 Java、C、C++、Python、PHP、Lua、Ruby、Node.js、C#、GoLand 等。
  2. 具有丰富的数据类型,如 String、List、Set、Hash、Sorted Set 等。
  3. 支持多种数据结构。
  4. 读/写速度快,性能高。
  5. 支持持久化,Redis 的持久化方式是 RDB 和 AOF。
  6. 简单且功能强大。
  7. 实现高可用主从复制,主节点做数据副本。
  8. 实现分布式集群和高可用。

二、Redis安装(win端)

1、windows环境下载地址,下载最新版本,选择 .msi格式的安装版本

2、运行.msi 的安装包,在安装的过程中注意勾选环境变量,端口,默认无密码,其他的直接下一步即可

3、查看Redis访问是否正常运行,入计算机服务中(右键计算机-->管理-->服务和应用程序-->服务),再在右侧找到Redis名称的服务,查看启动情况,如未启动,则需要手动启动,注意,如果修改了配置文件,则需要重启服务

image-20230825232128680

4、使用 redis-cli 查看redis是否正常工作,在redis的安装目录中打开cmd,然后输入命令 redis-cli ,如果显示进入redis中,则服务正常。

三、Go 连接和使用Redis

1、安装redis的驱动

go get github.com/go-redis/redis/v8

2、连接reids

在下面的代码中,我们需要修改redis的连接参数,Addr是Redis服务器地址和端口,Password是相应的密码,DB是Redis数据库索引,默认为 0

package main
​
import (
   "fmt"
   "github.com/go-redis/redis/v8"
)
​
var redisdb *redis.Client
​
func initRedis() {
   redisdb = redis.NewClient(&redis.Options{
      Addr:     "localhost:6379", // Redis服务器地址和端口
      Password: "",               // Redis密码(如果有的话)
      DB:       0,                // Redis数据库索引,默认为 0
   })
   return
}
​
func main() {
    initRedis()
    fmt.Println("redis连接成功")
}

3、简单操作键值对

设置和更新键和值:我们可以通过 redisdb.Set 方法来添加key和value

获取键的值:我们可以通过 redisdb.Get 方法来获取key对应的value

删除键值对:我们可以通过 redisdb.Del 方法来删除相应的key

// 设置键和值
key := "test"
v := "hello world!"
err := redisdb.Set(context.Background(), key, v, 0).Err()
if err != nil {
   panic(err)
}
​
// 获取键的值
val, err := redisdb.Get(context.Background(), key).Result()
if err != nil {
   panic(err)
}
fmt.Println("key为:", val)
​
// 删除键值对
deleted, err := redisdb.Del(context.Background(), key).Result()
if err != nil {
    panic(err)
}
fmt.Println("Deleted:", deleted) // 打印被删除的键的数量

4、简单操作有序集合zset

Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。

因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

    key := "rank"
    members := []*redis.Z{
        {Score: 99, Member: "PHP"},
        {Score: 97, Member: "java"},
        {Score: 100, Member: "Python"},
        {Score: 98, Member: "GO"},
    }
    // 向有序集合添加成员及其分数
    err := redisdb.ZAdd(context.Background(), key, members...).Err()
    if err != nil {
        panic(err)
    }
    // 获取有序集合的成员及其分数
    membersWithScores, err := redisdb.ZRangeWithScores(context.Background(), key, 0, -1).Result()
    if err != nil {
        panic(err)
    }
    for _, member := range membersWithScores {
        fmt.Printf("Member: %s, Score: %f\n", member.Member, member.Score)
    }
​
    // 从有序集合中删除单个成员
    deletedCount, err := redisdb.ZRem(context.Background(), key, "PHP").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Deleted Count:", deletedCount)
​
    // 从有序集合中删除多个成员
    items := []string{"java", "Python"}
    deletedCount, err = redisdb.ZRem(context.Background(), key, items).Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Deleted Count:", deletedCount)

5、更多操作请查看官方文档