Redis中使用Lua的一些优化和注意事项

2023-10-30

EVAL、EVALSHA命令

Redis从2.6.0版本开始提供了eval命令,通过内置的Lua解释器,可以让用户执行一段Lua脚本并返回数据。因为Redis单线程模型的特点,可以保证多个命令的原子性(因为最近的项目才想到用Lua),详细的使用方法请移步官方文档。

脚本性能

  1. Redis保证了脚本执行的原子性,所以在当前脚本没执行完之前,别的命令和脚本都是等待状态,所以一定要控制好脚本中的内容,防止出现需要消耗大量时间的内容(逻辑相对简单)。

带宽优化

  1. 为了避免每次执行都重复的将Lua脚本内容发送,Redis提供了evalsha命令,只需要将Lua脚本内容的SHA1校验和发送即可(evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0)。
  2. Lua脚本中的变量(动态数据)请使用KEYSARGV获取,如果把变量放在脚本中,必然会导致每次的脚本内容都不同(SHA1),Redis缓存大量无用或者一次性的脚本内容。

Redis Cluster 或 阿里云Redis集群版使用注意事项

Redis从3.0开始支持了Cluster功能,之前使用eval的时候可能没什么问题,但当切换成Cluster模式的时候,可能会出现一些问题:

  1. ERR Error running script (call to f_4a610f5543b3c3450220da7bd47825d3b6bffae8): @user_script:1: @user_script: 1: Lua script attempted to access a non local key in a cluster node
  2. ERR eval/evalsha command keys must be in same slot(阿里云Redis集群版)

上面的错误是因为Redis要求单个Lua脚本操作的key必须在同一个节点上,但是Cluster会将数据自动分布到不同的节点(虚拟的16384个slot,具体看官方文档),阿里云集群版的官网其实也有对应说明:在Redis集群版实例中,事务、脚本等命令要求所有的key必须在同一个slot中,如果不在同一个slot中将返回以下错误信息(:command keys must in same slot)

如何解决?

CLUSTER KEYSLOT key的文档中提供了解决方法,你需要将把key中的一部分使用{}包起来,redis将通过{}中间的内容作为计算slot的key,类似key1{mykey}key2{mykey}这样的都会存放到同一个slot中(缺点是不能平滑的过度老业务,需要修改原来使用的key,如果之前的key是统一管理的,也没那么麻烦)

思考

如果某个业务都通过key{mykey}去储存获取内容,所有的操作都会hash到同一个slot,这个slot所在的节点压力就会变大(不均衡),如果解决?欢迎留言讨论~

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

Redis中使用Lua的一些优化和注意事项 的相关文章

随机推荐

  • springboot websocket 传递 头信息 协议头 token 的前后端解决方案

    文章目录 一 前言 二 js websocket 传递token 2 1 基于协议头 三 后台取出websocket协议头的参数 3 1 取出token 3 2 注意大坑 四 结尾 一 前言 关于springboot websocket 可
  • python3 爬虫实战之爬取网易新闻APP端

    一 使用工具 这里使用了火狐浏览器的user agent插件 不懂的可以点这里火狐插件使用 二 爬虫操作步骤 百度 网易新闻并选择 步骤一 步骤二 步骤三 步骤四 最后一步 注意点 1 网易新闻类型 一共是下面的几种 BBM54PGAwan
  • DataSpell学习

    今天刚发现一个有用的数据分析软件DataSpell 下载地址 https www jetbrains com zh cn dataspell features 安装很简单 按照步骤一路来就行了 支持ipynb文件 其实和jupyter no
  • pip3 install命令执行时指定源+指定版本

    1 指定源 用法 pip3 install i https pypi tuna tsinghua edu cn simple 3rd MODULE NAME 例如 pip3 install i https pypi tuna tsinghu
  • Ubuntu下为可执行文件和脚本文件(.sh)生成桌面快捷方式

    1 前言 在Ubuntu中 有些软件是安装的 如deb的安装包 用dpkg i安装 有些软件可能是不需要安装 直接解压tar gz这类文件直接就可以运行了 但是每次运行的时候都要输入一遍命令十分麻烦 因此想把它建个快捷方式放到桌面或启动栏里
  • Segformer网络数据流机制

    代码来源 https github com bubbliiiing segformer pytorch 网络特点 结合了Transformers与轻量级的多层感知机 MLP 解码器 包含一个新颖的分层结构的Transformer编码器 该编
  • Anaconda虚拟环境,更新库

    以管理员身份启动 Anaconda Prompt 1 升级Anaconda前需要先升级conda 升级conda conda update conda 2 升级anaconda conda update anaconda base环境 直接
  • qnap安装Linux程序,[Troy]瞎折腾 篇一:【智能家居】威联通QNAP TS-251A安装Ubuntu+Hassio+Samba经验分享...

    原标题 Troy 瞎折腾 篇一 智能家居 威联通QNAP TS 251A安装Ubuntu Hassio Samba经验分享 Home Assistant是一款基于 Python 的智能家居开源系统 支持众多品牌的智能家居设备 可以轻松实现设
  • win11 vs2019下的qt5.15安装配置

    一 vs2019 先前安装过的版本 在此不做赘述 仅为前提条件 二 qt安装 1 qt版本选择 目前qt更新到6 3 但因为6的版本太新 而5 15是一个LTS长期维护版本 维护期一直到2025年 所以在此选择qt5 15版本 2 qt在线
  • 给Tomcat添加第三方jar包、如何在IDEA中启动部署Web模板

    给Tomcat添加第三方jar包 第一种方式 1 将jar包放到lib目录中 2 将jar包加入到模块中 Add as Library 第二种方式 1 可以打开项目结构菜单项目操作界面 添加一个自己的类库 2 添加你类库需要的jar包 3
  • 美国读研计算机 回国后好就业吗,美国留学归国就业前景如何

    很多在美国留学的小伙伴们都会选择在毕业后回国发展 那么 美国留学归国的就业前景如何呢 感兴趣的小伙伴快来阅读出国留学网的这篇文章吧 希望可以为大家提供参考 美国留学回国就业前景 1 医药领域专业人才和相关人才需求量增加比重最大 其中对应的包
  • LaTex加入新package方法

    1 前几天去 https www ctan org 下载booktabs宏包 下载的文件中没有sty文件 有ins文件 用winedit打开ins文件 用late编译 同一个文件夹中得到了一个sty文件 2 将sty文件拷贝到相应的late
  • numpy--广播及np.shape的案例

    numpy广播 最近有一个小需求 给定 a 0 1 2 M 1 1 1 1 求得 T 0 0 0 0 1 1 1 1 2 2 2 2 经过尝试 终于采用如下代码成功 a reshape 3 1 M reshape 1 4 reshape 3
  • PID算法,计算的是差值,是差值

    typedef struct float Kp 比例系数Proportional float Ki 积分系数Integral float Kd 微分系数Derivative float Ek 当前误差 float Ek1 前一次误差 e k
  • JAVA代码实现抖音转载视频无水印视频,亲测通过

    许多小伙伴想做抖音视频 无奈没有摄影器材 也没有取景材料 就想着去用别人人气视频来提高自己的粉丝量 可问题又来了 别人的视频通过分享 或者链接根本不是原创 上面还带着水印 视频一挂上去就被发现了 小则视频不通过 给出警告 大则封号 降低视频
  • Linux centos8安装docker

    1 下载docker ce的repo curl https download docker com linux centos docker ce repo o etc yum repos d docker ce repo 2 安装依赖 yu
  • vue3实现导航栏绑定内容锚点+滚动动画

    目前用的两种方法实现 第一种 原生js实现 注意 因为移动端可滚动区域可能会嵌套在其他架子下 所以需要用到ref获取滚动区域 正常获取scrollTop 前者基于html 后者基于body scrollTop document docume
  • 017-Java-008

    实例变量 实例变量声明在一个类中 但在方法 构造方法和语句块之外 当一个对象被实例化之后 每个实例变量的值就跟着确定 实例变量在对象创建的时候创建 在对象被销毁的时候销毁 实例变量的值应该至少被一个方法 构造方法或者语句块引用 使得外部能够
  • STM32移植lwip之建立web服务器

    本篇目标 在之前能ping通pc机的工程基础上搭建web服务器 借鉴官方web服务器的程序与网页 能够用pc机浏览器访问web服务器 并返回设置的网页 材料准备 基础工程 修改后能ping通pc机的工程 STM32官方移植lwip修改代码
  • Redis中使用Lua的一些优化和注意事项

    EVAL EVALSHA命令 Redis从2 6 0版本开始提供了eval命令 通过内置的Lua解释器 可以让用户执行一段Lua脚本并返回数据 因为Redis单线程模型的特点 可以保证多个命令的原子性 因为最近的项目才想到用Lua 详细的使