本章目录:
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 脚本操作
快速了解 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数据库的使用也比较频繁,本节将介绍在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/redisRedis 数据库连接go-redis调用程序:
执行结果:
2.Redis哨兵模式连接go-redisgo get github.com/go-redis/redis/v8go-rediscontext.Contextgo-redisStep 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 版本新增加的数据结构。
描述: 此处采用Go-Redis V8 版本, 下述将其封装为包以便后续调用。
调用演示:
常用方法:
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数据库中字符串与整型操作实践.
执行结果:
常用方法:
LPush():将元素压入链表
LInsert():在某个位置插入新元素
LSet():设置某个元素的值
LLen():获取链表元素个数
LIndex():获取链表下标对应的元素
LRange():获取某个选定范围的元素集
LPop()从链表左侧弹出数据
LRem():根据值移除元素
简单示例
执行结果:
常用方法:
SAdd():添加元素
SPop():随机获取一个元素
SRem():删除集合里指定的值
SSMembers():获取所有成员
SIsMember():判断元素是否在集合中
SCard():获取集合元素个数
SUnion():并集,SDiff():差集,SInter():交集
Tips:集合数据的特征,元素不能重复保持唯一性, 元素无序不能使用索引(下标)操作
简单示例
执行结果:
常用方法:
ZAdd():添加元素
ZIncrBy():增加元素分值
ZRange()、ZRevRange():获取根据score排序后的数据段
ZRangeByScore()、ZRevRangeByScore():获取score过滤后排序的数据段
ZCard():获取元素个数
ZCount():获取区间内元素个数
ZScore():获取元素的score
ZRank()、ZRevRank():获取某个元素在集合中的排名
ZRem():删除元素
ZRemRangeByRank():根据排名来删除
ZRemRangeByScore():根据分值区间来删除
简单示例:
执行结果:
常用方法:
HSet():设置
HMset():批量设置
HGet():获取某个元素
HGetAll():获取全部元素
HDel():删除某个元素
HExists():判断元素是否存在
HLen():获取长度
简单示例:
执行结果:
描述: 用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
Tips: 每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数.
示例代码:
执行结果:
描述: 我们可以采用go-redis提供的Do方法,可以让我们直接执行redis-cli中执行的相关指令, 可以极大的便于使用者上手。
简单示例:
执行结果:
描述: Pipeline 主要是一种网络优化,它本质上意味着客户端缓冲一堆命令并一次性将它们发送到服务器。这些命令不能保证在事务中执行。这样做的好处是节省了每个命令的网络往返时间(RTT)。
Pipeline 基本示例如下:
redis server也可以使用Pipelined:
所以在某些场景下,当我们有多条命令要执行时,就可以考虑使用pipeline来优化redis缓冲效率。
Multi/execMULTI/EXEC简单示例:
执行结果:
MULTI/EXECWatch方法接收一个函数和一个或多个key作为参数,其函数原型:
基本使用示例如下:
GET和SETScript 脚本操作描述: 从 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】
专栏书写不易,如果你觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,转个发,这将对我的肯定,谢谢!。
fmt.Printf("不要白嫖哟,亲!")