本章目录:

0x00 Go语言编程之使用Go-redis库操作Redis数据库

  • Redis 环境准备

  • Redis 客户端库安装

  • Redis 数据库连接

    • 1.Redis单节点连接

    • 2.Redis哨兵模式连接

    • 3.Redis集群模式连接

    • 4.V8新版本连接方式(重点)

  • Redis 数据类型指令操作实践

  • Redis 客户端库基本使用

    • Go-Redis V8 初始化连接

  • Redis 基本指令操作示例

    • 字符串(string)类型操作

    • 列表(list)类型操作

    • 集合(set)类型操作

    • 有序集合(zset)类型操作

    • 哈希(hash)类型操作

    • 基数统计 HyperLogLog 类型操作

    • 自定义redis指令操作

    • Redis Pipeline 通道操作

    • MULTI/EXEC 事务处理操作

    • Watch 监听操作

    • Script 脚本操作


Go语言编程使用Go-redis库操作Redis数据库

快速了解 Redis 数据库
描述: Redis是一个开源的内存数据库, Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。


Redis 支持的数据结构

  • 字符串(strings)

  • 哈希(hashes)

  • 列表(lists)

  • 集合(sets)

  • 带范围查询的排序集合(sorted sets)

  • 位图(bitmaps)

  • hyperloglogs

  • 带半径查询和流的地理空间索引等数据结构(geospatial indexes)


Redis 应用场景

set keynameincr keynameZSET"lpush / rpop" - (满足先进先出的队列模式)"rpush / lpop" - (满足先进先出的队列模式)
Redis 环境准备

描述: 此处使用Docker快速启动一个redis环境,如有不会的朋友可以看我前面关于Docker文章或者百度。

以下是启动一个redis server,利用docker启动一个名为redis的容器,注意此处的版本为5.0.8、容器名和端口号请根据自己需要设置。

以下方法是启动一个 redis-cli 连接上面的 redis server


Redis 客户端库安装

描述: 在网页项目开发中redis数据库的使用也比较频繁,本节将介绍在Go语言中如何连接操作Redis数据库以及客户库的基本安装和使用。

Go 语言中常用的Redis Client库:

  • redigo : https://github.com/gomodule/redigo

  • go-redis : https://github.com/go-redis/redis

Tips: 此处我们采用go-redis来连接Redis数据库并进行一系列的操作,因为其支持连接哨兵及集群模式的Redis。

go get -u github.com/go-redis/redis
Redis 数据库连接
go-redis


1.Redis单节点连接

调用程序:

执行结果:

2.Redis哨兵模式连接



3.Redis集群模式连接



4.V8新版本连接方式(重点)
go-redisgo get github.com/go-redis/redis/v8
go-rediscontext.Context



Redis 数据类型指令操作实践
go-redis


Step 1.首先我们连接到服务端.


Step 2. Redis 字符串数据类型的相关命令用于管理 redis 字符串值


Step 3. Redis hash 特别适合用于存储对象它是一个 string 类型的 field(字段) 和 value(值)的映射表


Step 4. Redis List 是简单的字符串列表,按照插入顺序排序。


Step 5. Set是 String 类型的无序集合且集合成员是唯一的


Step 6. Redis 有序集合是 string 类型元素的集合且不允许重复的成员, 但是会通过分数来为集合中的成员进行从小到大的排序。


Step 7. Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。


Step 8. 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。


开始事务命令入队执行事务


Step 10. Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。


Step 11.Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃,它是Redis 5.0 版本新增加的数据结构。


Redis 客户端库基本使用Go-Redis V8 初始化连接

描述: 此处采用Go-Redis V8 版本, 下述将其封装为包以便后续调用。

调用演示:


Redis 基本指令操作示例


字符串(string)类型操作

常用方法:

  • Keys():根据正则获取keys

  • Type():获取key对应值得类型

  • Del():删除缓存项

  • Exists():检测缓存项是否存在

  • Expire(),ExpireAt():设置有效期

  • TTL(),PTTL():获取有效期

  • DBSize():查看当前数据库key的数量

  • FlushDB():清空当前数据

  • FlushAll():清空所有数据库

  • Set():设置键缓存

  • SetEX():设置并指定过期时间

  • SetNX():设置并指定过期时间,仅当key不存在的时候才设置。

  • Get():获取键值

  • GetRange():字符串截取

  • Incr():增加+1

  • IncrBy():按指定步长增加

  • Decr():减少-1

  • DecrBy():按指定步长减少

  • Append():追加

  • StrLen():获取长度


示例1.redis数据库中字符串的set与get操作实践.

执行结果:

示例2.redis数据库中字符串与整型操作实践.

执行结果:


列表(list)类型操作

常用方法:

  • LPush():将元素压入链表

  • LInsert():在某个位置插入新元素

  • LSet():设置某个元素的值

  • LLen():获取链表元素个数

  • LIndex():获取链表下标对应的元素

  • LRange():获取某个选定范围的元素集

  • LPop()从链表左侧弹出数据

  • LRem():根据值移除元素

简单示例

执行结果:


集合(set)类型操作

常用方法:

  • SAdd():添加元素

  • SPop():随机获取一个元素

  • SRem():删除集合里指定的值

  • SSMembers():获取所有成员

  • SIsMember():判断元素是否在集合中

  • SCard():获取集合元素个数

  • SUnion():并集,SDiff():差集,SInter():交集

Tips:集合数据的特征,元素不能重复保持唯一性, 元素无序不能使用索引(下标)操作


简单示例

执行结果:


有序集合(zset)类型操作

常用方法:

  • ZAdd():添加元素

  • ZIncrBy():增加元素分值

  • ZRange()、ZRevRange():获取根据score排序后的数据段

  • ZRangeByScore()、ZRevRangeByScore():获取score过滤后排序的数据段

  • ZCard():获取元素个数

  • ZCount():获取区间内元素个数

  • ZScore():获取元素的score

  • ZRank()、ZRevRank():获取某个元素在集合中的排名

  • ZRem():删除元素

  • ZRemRangeByRank():根据排名来删除

  • ZRemRangeByScore():根据分值区间来删除


简单示例:

执行结果:


哈希(hash)类型操作

常用方法:

  • HSet():设置

  • HMset():批量设置

  • HGet():获取某个元素

  • HGetAll():获取全部元素

  • HDel():删除某个元素

  • HExists():判断元素是否存在

  • HLen():获取长度

简单示例:

执行结果:


基数统计 HyperLogLog 类型操作

描述: 用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

Tips: 每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数.

示例代码:

执行结果:


自定义redis指令操作

描述: 我们可以采用go-redis提供的Do方法,可以让我们直接执行redis-cli中执行的相关指令, 可以极大的便于使用者上手。

简单示例:

执行结果:


Redis Pipeline 通道操作

描述: Pipeline 主要是一种网络优化,它本质上意味着客户端缓冲一堆命令并一次性将它们发送到服务器。这些命令不能保证在事务中执行。这样做的好处是节省了每个命令的网络往返时间(RTT)。

Pipeline 基本示例如下:


redis server


也可以使用Pipelined:

所以在某些场景下,当我们有多条命令要执行时,就可以考虑使用pipeline来优化redis缓冲效率。


MULTI/EXEC 事务处理操作
Multi/exec
MULTI/EXEC


简单示例:

执行结果:


Watch 监听操作
MULTI/EXEC

Watch方法接收一个函数和一个或多个key作为参数,其函数原型: 

基本使用示例如下:


GET和SET
Script 脚本操作

描述: 从 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以对 Lua 脚本进行求值, 所以我们可直接在redis客户端中执行一些脚本。

EVAL script numkeys key [key ...] arg [arg ...]
( KEYS[1] , KEYS[2] ,以此类推)( ARGV[1] 、 ARGV[2] ,诸如此类)
redis.call()redis.pcall()
go-redis

简单示例:

执行结果:

至此在使用go-Redis客户端库操作实践Redis数据库完毕!


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】 

Fake it until you become it!

专栏书写不易,如果你觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,转个发,这将对我的肯定,谢谢!。

fmt.Printf("不要白嫖哟,亲!")