GO学习之 数据库(Redis)

GO系列

1、GO学习之Hello World

2、GO学习之入门语法

3、GO学习之切片操作

4、GO学习之 Map 操作

5、GO学习之 结构体 操作

6、GO学习之 通道(Channel)

7、GO学习之 多线程(goroutine)

8、GO学习之 函数(Function)

9、GO学习之 接口(Interface)

10、GO学习之 网络通信(Net/Http)

11、GO学习之 微框架(Gin)

12、GO学习之 数据库(mysql)

13、GO学习之 数据库(Redis)

文章目录

  • GO系列
  • 前言
  • [一、Redis 简介](#一、Redis 简介)
  • [二、Redis 基本操作](#二、Redis 基本操作)
    • [2.1 get - set 操作](#2.1 get - set 操作)
    • [2.2 lpush - lpop 操作](#2.2 lpush - lpop 操作)
    • [2.3 hset - hget 操作](#2.3 hset - hget 操作)
    • [2.4 sadd - smembers 操作](#2.4 sadd - smembers 操作)
  • 三、第三方库
  • 四、总结

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!

一个项目想要提高访问速度和性能,缓存是很重要的一步,甚至可以说是必不可少,那目前最最流行的还是 Redis 缓存,那 Go 中怎么对Redis进行操作呢?有哪些第三方的函数库可以方便我们使用呢?

一、Redis 简介

尽管说起 Redis 大家都很熟悉,不过个人觉得再熟悉的东西也难免有疏忽的点。

Redis(Remote Dictionary Server)是一个开源的高性能的基于key-value内存数据存储系统,遵循 BSD 协议,通常被用作缓存数据库消息队列 。Redis 支持多种数据结构,比如:string、list、set、zset、hash 等。

Redis优点如下(不限于):

  1. 高性能:Redis基于内存进行数据读写,速度非常快。
  2. 数据结构多样性:Redis 支持多样数据结构,适用于不同的数据存储需求。
  3. 支持持久化 :Redis可以持久化数据到磁盘,防止数据丢失,有 RDBAOF混合持久化方式。
  4. 支持分布式:Redis提供了分布式存储的支持,以集群的方式提供服务,有 主从(master - slave)、哨兵(Sentinel)、集群(Cluster)集群方式。
  5. 功能更加丰富:Redis提供了更加丰富的功能,比如:发布订阅、Lua脚本执行等。

Redis 缺点如下(不限于):

  1. 内存限制:Redis数据存储在内存中,受限于内存大小,不适用与存储大量数据。
  2. 数据持久化效率:数据持久化可能会影响Redis性能。

二、Redis 基本操作

首先下载 Redis 的第三方库:

针对简单的 Redis 操作,操作比较容易上手。

bash 复制代码
go get github.com/go-redis/redis

2.1 get - set 操作

go 复制代码
package main

import (
	"fmt"
	"log"

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

func main() {
	// 创建一个Redis客户端
	client := redis.NewClient(&redis.Options{
		Addr:     "192.168.1.199:6379",
		Password: "",
		DB:       0,
	})

	// 设置一个 key - value
	key := "key-2"
	value := "Hello Redis"
	// err := client.Set(key, value, 0).Err()
	err := client.Set(key, value, 0).Err()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("set key 成功!")

	// 获取一个key
	val, gErr := client.Get(key).Result()
	if gErr != nil {
		log.Fatal(gErr)
	}
	fmt.Println("获取到:", key, val)
}

运行结果:

bash 复制代码
PS D:\workspaceGo\src\redis> go run .\getset.go
set key 成功!
获取到: key-2 Hello Redis

2.2 lpush - lpop 操作

go 复制代码
package main

import (
	"fmt"
	"log"

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

func main() {
	// 创建一个Redis客户端
	client := redis.NewClient(&redis.Options{
		Addr:     "192.168.1.199:6379",
		Password: "",
		DB:       0,
	})

	key := "myList"
	value := "element-"
	// 向列表中添加元素
	for i := 0; i < 3; i++ {
		err := client.LPush(key, fmt.Sprint(value, i)).Err()
		if err != nil {
			log.Fatal(err)
		}
	}
	fmt.Println("Lpush 成功!")

	// 向列表中获取元素
	elements, lErr := client.LPop(key).Result()
	if lErr != nil {
		log.Fatal(lErr)
	}
	fmt.Printf("获取到列表 %s:%v", key, elements)
}

运行结果:

bash 复制代码
PS D:\workspaceGo\src\redis> go run .\listTest.go
Lpush 成功!
获取到列表 myList:element-2

2.3 hset - hget 操作

go 复制代码
package main

import (
	"fmt"
	"log"

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

func main() {
	// 创建一个Redis客户端
	client := redis.NewClient(&redis.Options{
		Addr:     "192.168.1.199:6379",
		Password: "",
		DB:       0,
	})

	key := "myHash"
	field := "field-"
	// 向 hash 中设置字段和值
	for i := 0; i < 3; i++ {
		err := client.HSet(key, fmt.Sprint(field, i), i).Err()
		if err != nil {
			log.Fatal(err)
		}
	}
	fmt.Println("向 myHash 中添加值成功")

	// 从 hash 中获取字段和值
	value, hErr := client.HGet(key, fmt.Sprint(field, 0)).Result()
	if hErr != nil {
		log.Fatal(hErr)
	}
	fmt.Printf("hash中的第一个字段:%s 值:%v \n", "field-0", value)

	// 获取所有的 字段 和 值
	allValue, haErr := client.HGetAll(key).Result()
	if haErr != nil {
		log.Fatal(hErr)
	}
	fmt.Println("hash中的所有字段和值", allValue)
}

运行结果:

bash 复制代码
PS D:\workspaceGo\src\redis> go run .\hashTest.go
向 myHash 中添加值成功
hash中的第一个字段:field-0 值:0
hash中的所有字段和值 map[field-0:0 field-1:1 field-2:2]

2.4 sadd - smembers 操作

go 复制代码
package main

import (
	"fmt"
	"log"

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

func main() {
	// 创建一个Redis客户端
	client := redis.NewClient(&redis.Options{
		Addr:     "192.168.1.199:6379",
		Password: "",
		DB:       0,
	})

	key := "mySet"
	value := "element-"
	// 向集合中添加元素
	for i := 0; i < 3; i++ {
		err := client.SAdd(key, fmt.Sprint(value, i)).Err()
		if err != nil {
			log.Fatal(err)
		}
	}
	fmt.Println("向集合 mySet 中添加元素完成!")

	// 从 mySet 集合中获取元素
	values, smErr := client.SMembers(key).Result()
	if smErr != nil {
		log.Fatal(smErr)
	}
	fmt.Println("从 mySet 集合中获取的元素:", values)
}

运行结果:

bash 复制代码
PS D:\workspaceGo\src\redis> go run .\setTest.go
向集合 mySet 中添加元素完成!
从 mySet 集合中获取的元素: [element-1 element-0 element-2]

三、第三方库

Redis 还有其他第三方库,比如:github.com/go-redis/redis/v8golang.org/x/net/context 上下文配合,可以在操作 Redis 过程中进行错误信息和元信息的追踪,以便实现更复杂的业务逻辑。

bash 复制代码
go get github.com/go-redis/redis/v8
go get golang.org/x/net/context

还有其他的,比如:

  • github.com/gomodule/redigo:提供了更底层的接口,允许更精细地控制 Redis 操作。
  • github.com/bsm/redislock:提供了分布式锁的实现,用于分布式系统中保证数据一致性。
  • github.com/alicebob/miniredis:这是一个内从中模拟 Redis 服务器的库,用于单元集成测试。

四、总结

此篇仅仅用了 github.com/go-redis/redis 库对 Redis 的基本操作针对不同的数据结构进行了简单的操作,其实如若对 Redis 的命令熟悉,那用 Go 来操作 Redis 就不复杂了。

总之,Redis 是一个功能丰富、高性能的内存数据存储系统,适用于缓存、数据库和消息队列等多种应用场景。在使用 Redis 缓存时,需要考虑数据存储需求、缓存失效策略等因素,以实现更高效的数据访问和管理。

相关推荐
ZFSS4 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程
东风破1375 小时前
达梦DMDRS搭建、以及DMDRS双向同步
数据库·oracle·dm达梦数据库
比特森林探险记6 小时前
go 语言中的context 解读和用法
开发语言·后端·golang
KaMeidebaby6 小时前
卡梅德生物技术快报|抗独特型抗体开发:半抗原检测技术瓶颈拆解,抗独特型抗体开发工程化实践
前端·数据库·人工智能·其他·百度·新浪微博
NiceCloud喜云6 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
A XMan.7 小时前
域名Whois信息查询V2版API接入指南
数据库
heimeiyingwang7 小时前
【架构实战】可观测性体系:从监控到全链路追踪
网络·数据库·架构
网管NO.17 小时前
SQL 日期函数全套精讲!时间格式化、日期加减、年月日提取,做日报周报直接套用
数据库·sql
杨云龙UP7 小时前
Linux 根分区被日志吃满?一次 58G Broker 日志清理实战_2026-05-20
linux·运维·服务器·数据库·hdfs·apache
sdk大全7 小时前
Studio 3T for MongoDB 2025.13.0
数据库·mongodb