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脚本功能可以显著优化系统性能,提升开发效率。在实际应用中,需要根据具体需求和场景灵活配置和使用这些高级特性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF入门学习主线篇(三十四)—— 图形和动画

C# WPF入门学习主线篇(三十四)—— 图形和动画 图形和动画是WPF的重要组成部分,能够大幅提升应用程序的用户体验。本篇博客将详细介绍WPF中图形和动画的使用方法,涵盖基本图形绘制、动画创建及多媒体的应用。通过本文,…

2024 Idea最新激活码

idea的激活与安装 操作如下: ① 打开网站:https://web.52shizhan.cn 切换到:激活码,点击获取 ② 这个时候就跳转到现成账号页面,点击获取体验号,如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

二十三、生成帮助文档

二十一、Java工具类的创建 二十二、Jar包制作及使用 这一篇开始学习如何生成帮助文档。为什么要学习生成帮助文档? 1、工具类已经制作好了,Java工具类的创建的类是一个.java文件,编译后成.class文件看不懂,所以需要对应的帮助文档…

我的高考往事

高考对于每一个参加过的人来说,都是一段非常难忘的回忆。 我参加高考,是在2001年。虽然迄今已经过去了23年,但很多细节仍然记忆犹新。 今天这篇文章,我就和大家分享一下,我的高考往事。 █ 青少年时代 我的老家是在江西…

函数式开发接口( Consumer、Function)在实际开发中的应用场景

之前有个扫码下载文件需求,由于要同时进行记录下载人的记录。一开始用的是异步进行日志记录。发现有的用户扫码下载了一次文件,日志记录了三条。这种很容易联想到是因为网络抖动造成的。 问题代码 由于日志记录是异步的,文件下载需要时间。同…

TikTok网红营销指南 | 怎么找到TikTok网红并进行合作?

如果你打算在tiktok上进行营销,忽略与tiktok网红合作无异于错失良机,时尚博主Sophia仅用一条30秒的视频展示了自己从一家新兴品牌购买的连衣裙,视频迅速获得了数百万的点赞和评论,也让该品牌的销量翻了好几倍。 这种与网红合作的策…

Mac 下载并激活IDEA

1.https://3.jetbra.in 打开这个网站,点击第一个网速比较快的连接 2.在新页面顶部有一个蓝色的下载链接文字< jetbra.zip(20220801) >点击下载 3.步骤2打开的页面不要关闭后面还有用 4.在idea官网下载idea对应的版本 https://www.jetbrains.com/idea/download/other.htm…

ADALORA: ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING

文章汇总 LoRA&#xff1a; W W ( 0 ) Δ W ( 0 ) B A WW^{(0)}\Delta W^{(0)}BA WW(0)ΔW(0)BA AdaLoRA&#xff1a;$WW^{(0)}\Delta W^{(0)}P\Lambda Q$ AdaLoRA的做法是让模型学习SVD分解的近似。在损失函数中增加了惩罚项(4)&#xff0c;防止矩阵 P P P和 Q Q Q偏离正…

Leetcode 力扣117. 填充每个节点的下一个右侧节点指针 II (抖音号:708231408)

给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#xff0c;所有 next 指针都…

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果&#xff1a; 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 &#xff08;1&#xff09;声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

干货下载 |《数据治理:数据中台建设与能力提升策略》

在当今这个信息爆炸的时代&#xff0c;数据已经成为企业最宝贵的资产之一。数据不仅能帮助企业洞察市场趋势&#xff0c;还能优化业务流程&#xff0c;提升运营效率&#xff0c;进而在激烈的市场竞争中占据优势地位。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;…

Centos: ifconfig command not found且ip addr查不到服务器IP

前段时间部门新派发了服务器&#xff0c;让我过去使用U盘装机&#xff0c;装完后使用ifconfig查不到服务器IP地址&#xff0c;ip addr也是查不到 ifconfig&#xff1a;command not found (这两个图片先用虚拟机的替代一下) 在网上找资料(CSDN&#xff0c;博客园&#xff0c;知乎…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一&#xff0c;FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期&#xff0c;FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink &#xff08;确实开源&#xff09;&#xff0c;为国产开源技术生态注入新活力。…

平安科技智能运维案例

平安科技智能运维案例 在信息技术迅速发展的背景下&#xff0c;平安科技面临着运维规模庞大、内容复杂和交付要求高等挑战。通过探索智能运维&#xff0c;平安科技建立了集中配置管理、完善的运营管理体系和全生命周期运维平台&#xff0c;实施了全链路监控&#xff0c;显著提…

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…

Qt篇——-1: error: fatal error: no input files问题解决

有时在pro或pri中引用的文件被删除或重命名后&#xff0c;会导致pro或pri文件中自动出现两个连续的//&#xff0c;这将导致我们编译时提示&#xff1a;-1: error: fatal error: no input files。 这是因为qmake 语法里每增加一个源文件或一个配置用一个斜杠结束&#x…

SJ901-II安全网耐冲击贯穿测试仪

一、主要用途 依据GB5725-2009最新国家标准研发&#xff0c;主要用于检测安全网的耐冲击性能和贯穿性能。 二、仪器特征 1、测试架采用多模块设计理念&#xff0c;可以实现安全网和安全带的试验。后期如果您们上安全带整体动态和整体静态试验&#xff0c;把所需部件直接安装到…

多商户小程序开发步骤和方法

在当今的数字经济中&#xff0c;多商户小程序作为一种创新的商业平台&#xff0c;提供了一种新的商业模式&#xff0c;使多个商户能够在同一平台上展示和销售他们的产品或服务。这种模式不仅增强了消费者选择的多样性&#xff0c;也为商家提供了一个更广泛的销售渠道。以下是详…

数据防泄密知识集锦|5个有效防止数据泄露的方法,你知道吗?

以下是五个有效防止数据泄露的方法&#xff0c;它们涵盖了从加强员工意识到技术实施等多个方面。 1.部署数据安全防护系统&#xff1a;安企神软件 专业的企业数据防泄密软件能够全方位地保护企业数据的安全。 该系统通常具有强大的文件加密功能、实时监控和异常检测、灵活的权…

常见排序算法——插入排序(直接插入排序 希尔排序)

目录 直接插入排序 基本思想 代码实现 时间复杂度计算 特性总结 希尔排序&#xff08;缩小增量排序&#xff09; 基本思想 代码实现 时间复杂度计算 特性总结 直接插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#…