redis-----08-----redigo管道以及事务-管道

2023-10-27

1 Redis 管道

在这里插入图片描述
正常的情况下,redis是请求响应模式,一条请求后那么正常就会返回一个响应,例如上图。但是只存在这种情况是无法满足我们开发的需求的。所以redis给我们提供了管道。

redis的管道(pipeline )相关特点:

  • 1)redis的管道pipeline配合事务,可以实现原子操作,保证一次执行多条命令。注意:管道本身不具有原子操作,只是单纯提高传输性能,而原子操作还是由事务和lua脚本实现。
  • 2)它一次可以发送多次请求,然后返回多个响应,这个响应的顺序会依照你请求的顺序进行返回。
  • 3)管道作用:一次可以发送多条请求,并可以一次返回多个响应,例如下图,所以节省大量的网络耗时,减少与redis的交互,主要体现在TCP三次握手与四次挥手。如果将多个请求拆开,势必会效率大打折扣。
  • 4)redis pipeline 是一个由客户端提供的,而不是服务端提供的。
    在这里插入图片描述

下面我们来看一下redigo提供了哪些接口给我们。

type Conn interface { 
	// Close closes the connection. 
	Close() error 
	
	// Err returns a non-nil value when the connection is not usable. 
	Err() error 
	
	// Do sends a command to the server and returns the received reply. 
	Do(commandName string, args ...interface{}) (reply interface{}, err error)
	
	// Do = Send + Flush + Receive 
	
	// Send writes the command to the client's output buffer. 
	Send(commandName string, args ...interface{}) error 
	
	// Flush flushes the output buffer to the Redis server. 
	Flush() error 
	
	// Receive receives a single reply from the Redis server 
	Receive() (reply interface{}, err error) 
}

重点讲解Do和Send、Flush、Receive的关系。

  • 1)Do等价于执行了一次Send、Flush、Receive。
  • 2)Send函数代表往redigo的缓冲区发送消息,相当于写到缓冲区,此时并未发送到redis服务器。
  • 3)Flush函数代表真正的将redigo的缓冲区的内容往redis服务器发送。
  • 4)Receive函数代表从redis服务器中接收返回的信息。

2 管道作用

redis的主要作用上面也说过,就是节省大量的网络耗时,减少与redis的交互,主要体现在TCP三次握手与四次挥手。

3 管道使用技巧

// 1. 批量发送,批量接收。
c.Send(cmd1, ...) 
c.Send(cmd2, ...) 
c.Send(cmd3, ...) 
c.Flush() 	// 将上面的三个命令发送出去 
c.Receive() // cmd1 的返回值 
c.Receive() // cmd2 的返回值 
c.Receive() // cmd3 的返回值 

// 2. 如果不需要关注返回值。
c.Send(cmd1, ...) 
c.Send(cmd2, ...) 
c.Send(cmd3, ...) 
c.Do("") 
// 简单分析Do(""):
// Do=Send、Flush、Receive。而此时传空字符串,那么此时的Send相当于没命令即没意义,
// 那么此时的Do("")等价于连续执行了c.Flush()与c.Receive(),并不关心返回值。

// 3. 如果只关注最后一个命令的返回值。
// 一般这种情况前两条是写,第三条语句是读。
c.Send(cmd1, ...) 
c.Send(cmd2, ...) 
c.Do(cmd3, ...)

但是注意,上面每次调用函数后,都应该去判断返回值,养成良好的习惯,不是说忽略了redis的返回值就不判断错误。
例如忽略返回值但判断错误情况:

ifi( _, err := c.Do("")); err != nil{
	// 错误处理
} 

4 管道代码例子

package main

import (
	"fmt"
	"math/rand"
	"time"

	"github.com/garyburd/redigo/redis"
)

func main() {
	//c, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", "127.0.0.1", 6379))
	c, err := redis.Dial("tcp", "192.168.1.9:6379", redis.DialPassword("123456"))
	if err != nil {
		panic(err)
	}
	defer (func() {
		fmt.Println("connection close")
		c.Close()
	})()

	// 1. 批量发送,批量接收。
	if false {
		c.Send("del", "set", "list", "zset")
		c.Send("sadd", "set", "tyy", "hc", "lqq")
		c.Send("lpush", "list", 10001, 10002, 10003)
		c.Send("smembers", "set")
		c.Send("lrange", "list", 0, -1)
		c.Flush()
		c.Receive() // 忽略del的返回值。
		c.Receive() // 忽略sadd的返回值。
		c.Receive() // 忽略lpush的返回值。

		mbrs, err := redis.Strings(c.Receive()) // 接收smembers返回值。
		if err != redis.ErrNil {
			fmt.Println(mbrs)
		}
		lsts, err := redis.Ints(c.Receive()) // 接收lrange返回值。
		if err != redis.ErrNil {
			fmt.Println(lsts)
		}
	}

	// 2. 如果不需要关注返回值。
	if false {
		c.Send("del", "set", "list", "zset")
		c.Send("sadd", "set", "tyy", "hc", "lqq")
		c.Send("lpush", "list", 10001, 10002, 10003)
		c.Do("")
	}

	// 3. 如果只关注最后一个命令的返回值。
	if false {
		rand.Seed(time.Now().UnixNano())
		c.Send("del", "set", "list", "zset")
		c.Send("sadd", "set", "tyy", "hc", "lqq")
		{
			args := redis.Args{}.Add("zset")
			args = args.Add(rand.Intn(100)).Add("tyy")
			args = args.Add(rand.Intn(100)).Add("hc")
			args = args.Add(rand.Intn(100)).Add("lqq")
			c.Send("zadd", args...)
		}

		// 只关注最后一个命令的返回值。
		{
			args := redis.Args{}.Add("zset")
			args = args.Add(0).Add(-1).Add("withscores")
			vals, err := redis.Values(c.Do("zrange", args...))
			if err != nil {
				panic(err)
			}
			var rets []struct {
				Name  string
				Score int
			}
			if err = redis.ScanSlice(vals, &rets); err != nil {
				panic(err)
			}
			fmt.Println(rets)
		}
	}

}

测试方法:将上面的3个if添加中的false逐个改成true即可测得下面结果。
分别对应上面的结果:

  • 1)
    在这里插入图片描述

  • 2)此时因为程序不关心返回值,所以此时执行完程序结果只会打印connection close,所以我们可以去xshell命令行使用redis-cli查看结果。
    在这里插入图片描述

  • 3)这个结果可能大家都不一样,因为score是使用rand.Intn(100)随机生成的,所以排序可能会不一样。
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis-----08-----redigo管道以及事务-管道 的相关文章

  • 是否可以使用带有 FUSE 文件系统的 Linux VFS 缓存?

    默认情况下 Linux VFS 缓存似乎不适用于 FUSE 文件系统 例如 read 调用似乎被系统地转发到 FUSE 文件系统 我在 FUSE 特定的远程文件系统上工作 我需要一个非常积极的缓存 我需要实现自己的页面缓存吗 或者是否可以为
  • Redis多插入问题

    我尝试多次插入 但它给了我错误 http pastie org 7337421 http pastie org 7337421 cat mass insert txt 3 r n 3 r nSET r n 3 r nkey r n 5 r
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • Docker&Celery - 错误:Pidfile (celerybeat.pid) 已存在

    应用程序包括 姜戈 雷迪斯 芹菜 码头工人 Postgres 在将项目合并到 docker 之前 一切都运行顺利且正常 但是一旦将其移入容器 就开始出现问题 起初它开始得很好 但过了一会儿我确实收到了以下错误 celery beat 1 E
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续

随机推荐

  • Docker之旅:在Docker容器中创建第一个程序

    Docker的概念 Docker是开发人员和系统管理员 使用容器开发 部署和运行应用程序的平台 使用Linux容器来部署应用程序称为集装箱化 容器不是新的事物 但它们用于轻松部署应用程序 一 测试一下Docker的版本 1 查看Docker
  • 实用工具推荐,浏览器必备宝藏插件:Wetab新标签页

    打开浏览器 你的起始页是否充满了广告和各种乱七八糟的信息呢 或者过于单调 而失去了某些你想要的功能 这里给大家推荐一个在Chrome浏览器和edge浏览器上都能愉快使用的浏览器插件 Wetab新标签页 没有广告 页面干净美观且具备各种实用功
  • android live 电视 源码,GitHub - mxiaoguang/LivePlayback: Android TV直播电视节目 ,包含各央视频道及卫视频道...

    Android TV直播电视节目 更多技术博客 项目 欢迎关注公众号 Android TV开发交流群 135622564 传统电视直播节目 在Android TV上起着越来越重要的作用 央视 各地卫视 满足观众日益增长的多元化需求 看下效果
  • IV转换电路原理图

    毫安级IV转换电路如下 如果要uA级转换 可把运放改为 D795 SG 8210 L C6482等输入偏置电流在pA级的运
  • tomcat配置443端口

  • true_type与false_type

    std true type和std false type 实际上是类型别名 是两个类型 类模板 注意区分true type与false type与true和false区别 true type false type代表类型 true fals
  • 【项目实战】Python基于局部离群因子LOF算法(LocalOutlierFactor)实现信用卡数据异常值检测项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 代码讲解 如需数据 代码 文档 代码讲解可以直接到文章最后获取 1 项目背景 异常检测是数据挖掘领域研究的基本问题之一 已被广泛应用于网络入侵检测 信用卡欺诈侦查等领域 局部离群因子 简
  • 以太坊客户端Geth命令用法-参数详解

    Geth是在以太坊智能合约开发中最常用的工具 必备开发工具 一个多用途的命令行工具 熟悉Geth可以让我们有更好的效率 大家可收藏起来作为Geth命令用法手册 本文主要是对geth help的翻译 基于最新的geth 1 7 3 stabl
  • sqlite3查看数据库中有哪些表(代码)

    说实话 用代码实现sqlite3查看数据库中有哪些表我还真的没找到现成资源 网上提供的语句还真用不了 而且大多都是命令行语句 由于的做的MFC项目要用到这个功能 特意学习了下 下面分享我的成果 希望可以帮到你 环境 VS2005 inclu
  • FPGA中值滤波实现并Modelsim仿真,与MATLAB中值滤波进行对比

    文章目录 一 中值滤波算法 二 FPGA实现中值滤波 2 1 3 3窗口的生成 2 2 排序模块 2 3中值滤波模块 2 4 整体RTL图 三 modeslim仿真 四 matlab中值滤波 五 效果对比 一 中值滤波算法 1 中值滤波算法
  • 解决wangEditor表格边框显示不出来、没有的问题

    仔细阅读文档 不过我一直找表格或者边框搜索 发现没有特定的栏目 所以忽略了 当然也有我不够仔细的原因 有点着急莽荒了 链接 在官网的这个页面 从官网贴下来的 把这段复制到想要的地方就可以了
  • 自定义表单控件 [(ngModel)]

    ngModel 拆分 ngModel 将 输入 输出组合起来 进行双向数据绑定 拆分开来 输入属性 ngModel ngModelChange 输出监听元素值的变化 并同步view value与model value
  • 头都给我找烂

    mysql5 6下载 https dev mysql com downloads file id 487425 win10添加本地用户和组 https blog csdn net qq 40151857 article details 89
  • 【Linux命令集】top命令的用法详解

    在使用linux系统中 我们最长用的查看系统性能的方式就是使用命令top 通知我们只关心总体的cpu和内存的使用情况 对其他的参数基本无视 也看不懂 下面来介绍一下top的详细参数的意义 top视图 进入top的基本视图 我们来结合这个视图
  • 电容选型及计算

    一 电容容值计算 1 电容整流波形分析 经过整流后三相电压整流为六脉波电压 电压波形如下图 上图中各时期充电过程如下 在t0 t3阶段是一个T 6周期 一个完整波头阶段 在t0 t1阶段 电容放电 给负载提供能量 此时输入电压小于电容电压
  • openEuler实验之A-Tune智能调优

    1 A Tune介绍 A Tune是一款基于AI开发的系统性能优化引擎 它利用人工智能技术 对业务场景建立精准的系统画像 感知并推理出业务特征 进而做出智能决策 匹配并推荐最佳的系统参数配置组合 使业务处于最佳运行状态 1 1 A Tune
  • redis docker安装、进入命令行后启动服务

    下载redis镜像 首先查看一下redis是否正确 docker search redis 显示 NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source
  • 一文读懂工厂MES系统的详细功能介绍

    一 工单管理 MES通过工单来管理生产执行 工单状态有 创建 下达 执行 完成 取消 计划员创建工单 审核通过后释放到设备或产线 仓库可收到工单下达的通知 及时备料 产线只能看到已下达的工单 执行工单 完成后登记报工 将相关信息反馈回ERP
  • 网络编程——实现HTTP服务器端

    参考 TCP IP网络编程 尹圣雨 Web服务器端 概述 Web服务器端是 基于HTTP Hypertext Transfer Protocol 协议 将网页对应文件传输给客户端的服务器端 Hypertext 超文本 是可以根据客户端请求而
  • redis-----08-----redigo管道以及事务-管道

    1 Redis 管道 正常的情况下 redis是请求响应模式 一条请求后那么正常就会返回一个响应 例如上图 但是只存在这种情况是无法满足我们开发的需求的 所以redis给我们提供了管道 redis的管道 pipeline 相关特点 1 re