Redis高级特性和应用:慢查询、Pipeline、事务、Lua

Redis提供了许多高级特性,可以帮助优化和管理系统性能。本文将介绍Redis的慢查询、Pipeline、事务和Lua脚本的使用及其相关配置。

Redis的慢查询

慢查询日志是开发和运维人员定位系统慢操作的重要工具。Redis也提供了类似的功能,通过记录超过预设阀值的命令执行时间来帮助诊断性能问题。

Redis客户端执行命令的过程

Redis客户端执行一条命令的过程可以分为以下四个部分:

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果

image.png

慢查询只统计步骤3的时间,因此没有慢查询并不代表客户端没有超时问题,可能是网络问题或Redis服务繁忙。

慢查询配置

Redis提供了两种方式进行慢查询的配置:

1. 动态设置

慢查询的阈值默认是10毫秒,通过以下命令可以修改阈值:

config set slowlog-log-slower-than 20000

要持久化保存配置,执行以下命令:

config rewrite

image.png

2. 配置文件设置

修改redis.conf文件中的以下配置:

slowlog-log-slower-than 10000
slowlog-max-len 128

慢查询操作命令

Redis提供了一些命令来操作慢查询日志:

  • 获取慢查询日志:slowlog get [n]
  • 获取慢查询日志长度:slowlog len
  • 重置慢查询日志:slowlog reset

慢查询建议

  • slowlog-max-len配置建议:建议调大慢查询列表长度,例如1000以上。
  • slowlog-log-slower-than配置建议:根据Redis并发量调整该值,高OPS场景建议设置为1毫秒或更低。

Pipeline

Pipeline机制能将一组Redis命令通过一次RTT传输给Redis,再将命令的执行结果按顺序返回给客户端,从而减少网络延迟。

image.png

代码示例参见:
image.png
使用Pipeline可以显著提高执行速度,尤其是在网络延迟较大的情况下。

image.png
Redis Pipeline的优势和使用时的一些注意事项:

  1. Pipeline执行速度的优势:使用Pipeline可以减少客户端和服务器之间的往返次数(Round-Trip Time, RTT),将多个命令一次性发送,然后等待服务器一次性返回所有结果,这样可以显著提高执行效率。

  2. 网络延时对Pipeline效果的影响:在网络延时较大的情况下,Pipeline的效果更加明显,因为它减少了因等待单个命令响应而产生的额外延时。

然而,使用Pipeline时也需要考虑以下几点:

  • 命令个数的控制:Pipeline中的命令数量不宜过多,以免造成客户端长时间等待响应或网络阻塞。合理的做法是根据网络条件和服务器性能,将大量命令分散到多个较小的Pipeline中执行。

  • 内核缓冲区大小:考虑到不同操作系统的内核输入输出缓冲区大小不同,通常在4K-8K之间,可以通过系统配置进行调整。Pipeline的数据量应控制在合理的范围内,以避免超出缓冲区限制。

  • MTU和TCP报文大小:最大传输单元(MTU)决定了网络上单个数据帧的最大大小,在以太网中通常为1500字节。扣除IP头(20字节)和TCP头(20字节)后,单个TCP报文的最大负载为1460字节。因此,为了确保数据有效传输,Pipeline的命令和数据量应控制在MTU大小以内。

  • Pipeline与分布式Redis:虽然Pipeline一次只能操作单个Redis实例,但在分布式Redis场景中,可以针对每个节点使用Pipeline,从而在整体上提高操作的效率。

  • 批量操作的优化:在执行批量操作时,合理利用Pipeline可以显著减少网络开销和提高响应速度,尤其是在执行大量简单操作时。

事务

Redis的事务功能允许将一组命令放在multi和exec之间执行,确保这些命令要么全部执行,要么全部不执行。
Redis 的事务功能提供了一种将多个命令打包执行的能力,但它确实有一些限制。以下是 Redis 事务的一些关键点和处理机制:

  1. 事务的开始:当客户端发送 MULTI 命令给 Redis 服务器时,事务开始。从此刻起,直到发送 EXEC 命令之前,所有发送的命令都不会被立即执行,而是被放入一个事务队列中。

  2. 语法命令错误:如果在事务中存在语法错误,如命令写错(例如 sett 而不是 set),Redis 会拒绝执行事务。在这种情况下,EXEC 命令将返回 nil,表示事务队列中的命令都没有被执行。

  3. 运行时错误:如果事务中的命令在语法上是正确的,但存在运行时错误(例如,尝试将一个字符串类型的值作为集合进行 SADD 操作),Redis 会继续执行事务中的其他命令,但出错的命令会返回错误信息。Redis 没有回滚机制,这意味着即使事务中的一部分命令失败,之前已经执行的命令也不会被撤销。

  4. 事务的执行:当客户端发送 EXEC 命令时,Redis 会顺序执行事务队列中的所有命令,并将所有命令的返回值打包在一起返回给客户端。

  5. 事务的原子性:Redis 事务保证的是队列中的命令要么全部执行,要么全部不执行,但是它不保证隔离性。在事务执行期间,其他客户端的命令请求可以插入到事务的命令序列中。

  6. 事务的局限性:Redis 的事务不支持事务回滚,一旦命令被执行,即使后续命令失败,也无法撤销已经执行的操作。因此,开发者在使用事务时需要谨慎,并在可能的情况下进行错误处理和数据修复。

  7. WATCH/UNWATCH:Redis 提供了乐观锁机制,通过 WATCH 命令监控一个或多个键,如果在执行 EXEC 之前这些键的值发生了变化,事务将不会执行,而是返回 nilUNWATCH 命令可以用来取消对所有键的监控。

Redis的watch命令

通过watch命令可以监控某些key,如果这些key在事务执行之前被其他客户端修改,事务将不会执行。

watch key
multi
command1
command2
exec

Pipeline 和事务的区别:

  1. 客户端与服务器端行为

    • Pipeline 是在客户端实现的机制,客户端将多个命令打包在一起发送,但对服务器而言,这些命令还是按顺序逐个接收和执行的。
    • 事务 是在服务器端实现的机制,当客户端发送 MULTI 命令后,服务器将命令缓存,直到收到 EXEC 命令后,才顺序执行缓存的命令。
  2. 命令的执行

    • Pipeline 中,命令几乎立即执行,只是响应会被缓存,直到所有命令发送完毕。
    • 事务 中,命令在 EXEC 之前不会执行,这样可以保证一组命令的原子性执行。
  3. 性能影响

    • Pipeline 可以减少网络往返次数,提高命令发送效率,尤其适合大量命令连续发送的场景。
    • 事务 虽然也批量执行命令,但主要用于保证命令的原子性,可能不如 Pipeline 在网络往返上高效。
  4. 原子性保证

    • Pipeline 本身不保证命令的原子性,如果客户端在发送 Pipeline 过程中断开连接,部分命令可能已经执行。
    • 事务 保证所有命令要么全部执行,要么全部不执行,适合需要严格顺序和原子性的场景。
  5. 网络传输效率

    • 通过 Pipeline,可以减少多次命令发送带来的网络开销。
    • 结合使用 事务Pipeline,可以在保证原子性的同时,减少网络传输次数。
  6. 错误处理

    • Pipeline 中,命令执行不会因单个命令的错误而停止,每个命令的结果都会返回给客户端。
    • 事务 中,如果命令列表中的任何一个命令执行失败,EXEC 将返回 nil,事务中的所有命令都不会执行。
  7. 使用场景

    • Pipeline 适用于大量状态查询或写入操作,命令之间没有依赖关系。
    • 事务 更适合需要顺序执行并且要求操作不可分割的场景。
  8. 高级功能

    • 虽然 Redis 的事务功能相对简单,但通过 Lua 脚本可以实现更复杂的事务逻辑,Lua 脚本在执行时是原子性的,并且可以包含条件判断和循环等控制结构。

结合使用 Pipeline 和事务,以及利用 Lua 脚本来实现复杂的业务逻辑,可以充分利用 Redis 的性能优势,同时保证操作的原子性和逻辑的正确性。

Lua脚本

Lua是一种轻量级脚本语言,Redis内嵌支持Lua环境。使用Lua脚本可以减少网络开销,实现原子操作,并且具有复用性。

Lua脚本的优点

  1. 减少网络开销
  2. 实现原子操作
  3. 脚本复用性

在Redis中使用Lua脚本

Redis通过以下命令执行Lua脚本:

EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 key value

Lua脚本示例

-- Lua脚本内容
local value = redis.call('GET', KEYS[1])
return value

在Redis客户端中执行:

EVAL "local value = redis.call('GET', KEYS[1]) return value" 1 key

总的来说,Redis的慢查询、Pipeline、事务和Lua脚本功能可以显著优化系统性能,提升开发效率。在实际应用中,需要根据具体需求和场景灵活配置和使用这些高级特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【blender特效】卡通火焰

核心思想就是通过多个不同缩放尺寸的沃罗诺伊叠加,分别构成火焰的大型,中型和小型(形状),最后通过自发光纹理实现火焰加亮。 用的是ev渲染,完全可以把噪音贴图都烘焙出来,自己改改shader就可以扔…

STM32无法烧写程序的故障排除

如果你在使用STM32微控制器时遇到无法烧写程序的问题,可以按以下步骤进行故障排除: 1. 确认硬件连接 检查电源:确保STM32板子正确供电。调试器连接:确认ST-LINK调试器或其他编程工具与STM32开发板的连接无误,尤其是S…

利用python爬虫采集苹果公司各产品销售收入统计报告

数据为2013年到2022年苹果公司各产品(iPhone、iPad、Mac等)及服务的销售收入。iPhone是苹果公司销售收入最高的产品。 数据统计单位为:亿美元 。 数据说明: 数据整理自苹果公司历年10-K文件,每年10-K文件可能对之前年…

DP:两个数组的dp问题

解决两个数组的dp问题的常用状态表示: 1、选取第一个字符串[0-i]区间以及第二个字符串[0,j]区间作为研究对象 2、根据题目的要求确定状态表示 字符串dp的常见技巧 1、空串是有研究意义的,引入空串可以帮助我们思考虚拟的边界如何进行初始化。 2、如…

【odoo】odoo常用的ORM方法

概要 在Odoo中,ORM(对象关系映射,Object-Relational Mapping)方法是一种将Python对象映射到数据库表的方法。Odoo的ORM系统使开发者能够使用高级的Python代码而不是复杂的SQL语句来操作数据库。Odoo的ORM方法主要用于创建、读取、…

云服务器Ubuntu系统的vim-plus(youcompleteme)完整安装

一. 安装vim-plus PS:需要在那个用户下配置vim-plus,就到那个用户下执行代码 git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ~/.vimplus ./install.sh二. 解决没有代码自动补全的问题 随便创建一个Test.cpp文件,vim打开…

图像生成新篇章:Stable Diffusion 3 Medium开源评析

摘要 在数字艺术与人工智能的交汇点上,Stable Diffusion 3(SD3)的开源无疑是一场技术革新的盛宴。就在3月份,我撰写了一篇博文,深入探讨了SD3的技术报告内容与介绍,文章发表在CSDN博客上,https:…

如何用多媒体沙盘实现智能交互体验?

随着多媒体技术在内容展示领域的迅猛进步,智能化信息交互方式已然跃升为公众瞩目的焦点,而展厅作为信息传递与产品展示的核心阵地,正面临着提升交互体验、强化信息传递效果的迫切需求。因此,以多媒体沙盘、LED屏幕等创新装置为媒介…

C/C++图形渲染引擎开发方向有钱景吗?

在当前的技术环境下,特别是在图形渲染引擎开发领域,的确存在一些挑战和变化。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私…

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2,也就是一张图片被分割成四份 height, wi…

证照之星是一款很受欢迎的证件照制作软件

证照之星是一款很受欢迎的证件照制作软件,证照之星可以为用户提供“照片旋转、裁切、调色、背景处理”等功能,满足用户对证件照制作的基本需求。本站证照之星下载专题为大家提供了证照之星电脑版、安卓版、个人免费版等多个版本客户端资源,此…

AI图书推荐:用ChatGPT按需DIY定制来赚钱

《用ChatGPT按需DIY定制来赚钱》ChatGPT Print Money Method ,作者是Cindy Donovan 。 下面是图书概要: ### 第一章:什么是按需印刷以及ChatGPT如何使其变得简单易行? 本章介绍了按需印刷的商业模式,即仅在收到订单时…

SpringMVC-基础架构

一、什么是MVC 二、什么是SpringMVC 三、SpringMVC的特点 四、配置SpringMVC 简单流程&#xff1a; 总体框架 1.创建pom.xml依赖 <!--打包方式--><packaging>war</packaging><!--依赖--><dependencies><dependency><groupId>org.s…

使用GPT/文心实现诗词作画

在教育领域中&#xff0c;古诗词一直是培养学生文化素养和审美能力的重要载体。选择合适的古诗词进行学习和欣赏&#xff0c;不仅能够增强他们的语言表达能力&#xff0c;还能促进他们对中国传统文化的理解和热爱。本文将结合AI技术&#xff0c;将古诗词转换为图画。 1、选择适…

IT人的拖延——别让“需求沟通”耽误了你的正事

IT人的工作&#xff0c;很多“需求沟通”的场景&#xff0c;而在沟通需求时&#xff0c;又会因为沟通的不顺畅&#xff0c;没有结果而产生烦躁的情绪或者是悬而未决的不能开始行动&#xff0c;进而间接地造成了拖延。这种拖延的原因&#xff0c;需要从需求沟通的根源来找方案&a…

【云岚到家】-day03-2-门户缓存实现实战

【云岚到家】-day03-2-门户缓存实现实战 5 缓存实现5.2 定时任务更新缓存5.2.1 分布式调度平台5.2.1.1 jdk提供的Timer定时器5.2.1.2 使用第三方Quartz方式5.2.1.3 使用分布式调度平台XXL-JOB 5.2.2 XXL-JOB5.2.2.1 介绍5.2.2.2 部署调度中心5.2.2.3 执行器 5.2.2 定义缓存更新…

Kong AI Gateway 正式 GA !

Kong Gateway 3.7 版本已经重磅上线&#xff0c;我们给 AI Gateway 带来了一系列升级&#xff0c;下面是 AI Gateway 的更新亮点一览。 AI Gateway 正式 GA 在 Kong Gateway 的最新版本 3.7 中&#xff0c;我们正式宣布 Kong AI Gateway 达到了通用可用性&#xff08;GA&…

踩坑!被node-sass折磨的一天

文章目录 被node-sass折磨的一天折磨过程了解原因注意事项 被node-sass折磨的一天 折磨过程 起因是要开发一个老项目&#xff0c;照常拉代码、下依赖、启动三步走 依赖开始下载不对了&#xff0c;以为是node版本问题&#xff0c;寻找node-sass对应的node版本 利用nvm&#…

字符串的复杂操作(字符串的下标和切片、以及字符串的相关操作函数方法)

如果使用不符合标准的标识符,将会报错 SyntaxError: incalid syntax(无效语法) 文章目录 一、字符串的复杂操作1.1 下标&#xff08;也叫索引&#xff09;1.2 切片 一、字符串的复杂操作 1.1 下标&#xff08;也叫索引&#xff09; 下标代表着第几个数据&#xff0c;从0开始计…

【Css】纯css展开、收起超出的文本

效果 展开 收起 未超出 码 -webkit-line-clamp: 3; 设置限制行数 <div class"wrap"> <inputtype"checkbox"id"exp-txt"><div class"text"><labelfor"exp-txt"class"btn"></label&g…