Redis使用lua脚本

Redis使用Lua脚本 考虑到脚本比较长的情况下,如果每次调用都需要将整个脚本传递个redis会占用较网络带宽,为了解决这个问题,redis提供了EVALSHA命令,可以先将脚本加载到redis中,然后再通过sha1调用脚本redis在执行EVAL命令时会计算脚本的sha1,并将保存在redis中,下次执行EVALSHA命令时,会先根据sha1查找redis中是否有对应的脚本,如果有则直接执行,否则会报错。需要注意的是,redis执行lua脚本和普通命令一样,都是会写入AOF文件和发布至主从复制连接上的,有两种方式。 阅读详情

  版本:自2.6.0起可用。

  时间复杂度:取决于执行的脚本。

  使用Lua脚本的好处:

  减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

  如何使用

  基本使用

  命令格式:

  EVAL script numkeys key

  [

  key

  ...]

  arg

  [

  arg

  ...]

  说明:

  script是第一个参数,为Lua 5.1脚本。该脚本不需要定义Lua函数(也不应该)。第二个参数 numkeys指定后续参数有几个key。key[key...],是要操作的键,可以指定多个,在lua脚本中通过 KEYS[1], KEYS[2]获取arg[arg...],参数,在lua脚本中通过 ARGV[1], ARGV[2]获取。

  简单实例:

  127.0

  .

  0.1

  :

  6379

  >

  eval

  "return ARGV[1]"

  0

  100

  "100"

  127.0

  .

  0.1

  :

  6379

  >

  eval

  "return {ARGV[1],ARGV[2]}"

  0

  100

  101

  1

  )

  "100"

  2

  )

  "101"

  127.0

  .

  0.1

  :

  6379

  >

  eval

  "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"

  2

  key1 key2 first second

  1

  )

  "key1"

  2

  )

  "key2"

  3

  )

  "first"

  4

  )

  "second"

  127.0

  .

  0.1

  :

  6379

  >

  eval

  "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;"

  1

  test

  10

  60

  (

  integer

  )

  1

  127.0

  .

  0.1

  :

  6379

  >

  ttl test

  (

  integer

  )

  59

  127.0

  .

  0.1

  :

  6379

  >

  get

  test

  "10"

  注:

  {}在lua里是指数据类型 table,类似数组。redis.call()可以调用redis命令。

  命令行里使用

  如果直接使用 redis-cli命令,格式会有点不一样:

  redis

  -

  cli

  --

  eval

  lua_file key1 key2

  ,

  arg1 arg2 arg3

  注意的地方:

  eval 后面参数是lua脚本文件, .lua后缀不用写 numkeys,而是使用 ,隔开。注意 ,前后有空格。

  示例:

  incrbymul.lua

  local

  num=redis

  .

  call

  (

  'GET'

  ,

  KEYS

  [

  1

  ]);

  if

  not

  num

  then

  return

  0

  ;

  else

  local

  res=num

  *

  ARGV

  [

  1

  ];

  redis

  .

  call

  (

  'SET'

  ,

  KEYS

  [

  1

  ],

  res

  );

  return

  res

  ;

  end

  命令行运行:

  $ redis

  -

  cli

  --

  eval

  incrbymul

  .

  lua lua

  :

  incrbymul

  ,

  8

  (

  integer

  )

  0

  $ redis

  -

  cli incr lua

  :

  incrbymul

  (

  integer

  )

  1

  $ redis

  -

  cli

  --

  eval

  incrbymul

  .

  lua lua

  :

  incrbymul

  ,

  8

  (

  integer

  )

  8

  $ redis

  -

  cli

  --

  eval

  incrbymul

  .

  lua lua

  :

  incrbymul

  ,

  8

  (

  integer

  )

  64

  $ redis

  -

  cli

  --

  eval

  incrbymul

  .

  lua lua

  :

  incrbymul

  ,

  2

  (

  integer

  )

  128

  由于redis没有提供命令可以实现将一个数原子性的乘以N倍,这里我们就用Lua脚本实现了,运行过程中确保不会被其它客户端打断。

  phpredis里使用

  接着上面的例子:

  incrbymul.php

  

  php

  $lua=<<<

  EOF

  local

  num=redis

  .

  call

  (

  'GET'

  ,

  KEYS

  [

  1

  ]);

  if

  not

  num

  then

  return

  0

  ;

  else

  local

  res=num

  *

  ARGV

  [

  1

  ];

  redis

  .

  call

  (

  'SET'

  ,

  KEYS

  [

  1

  ],

  res

  );

  return

  res

  ;

  end

  EOF

  ;

  $redis=new

  Redis

  ();

  $redis

  ->

  connect

  (

  '127.0.0.1'

  ,

  6379

  );

  $ret=$redis

  ->

  eval

  (

  $lua

  ,

  array

  (

  "lua:incrbymul"

  ,

  2

  ),

  1

  );

  echo $ret

  ;

  运行:

  $ redis

  -

  cli

  set

  lua

  :

  incrbymul

  0

  OK

  $ redis

  -

  cli incr lua

  :

  incrbymul

  (

  integer

  )

  1

  $ php incrbymul

  .

  php

  2

  $ php incrbymul

  .

  php

  4

  eval原型:

  Redis

  ::

  eval

  (

  string

  script

  ,

  [

  array keys

  ,

  long

  num_keys

  ])

  eval函数的第3个参数为KEYS个数,phpredis依据此值将KEYS和ARGV做区分。

SAP MTO模式实战:从库存管理到成本核算的深度解析 本文深入解析SAP MTO(Make-to-Order)模式在制造业中的应用,从库存管理到成本核算的全流程实战技巧。通过对比MTS模式,详细阐述MTO的核心逻辑、库存管理配置、成本核算路径及与PP模块的集成要点,帮助企业实现按单生产的高效管理,优化库存水平和资金占用。 阅读详情

相关推荐

GEE APP:时间序列影像批处理工具:按月筛选与智能导出解决方案出工具

本文介绍了一个基于Google Earth Engine(GEE)开发的智能时序影像处理工具,可高效处理遥感影像时间序列数据。该工具采用三栏式交互布局,包含控制面板、地图显示和缩略图预览区域。核心功能包括:1)灵活的时间筛选机制,支持年度范围选择和月份批量选择;2)智能影像筛选算法,基于云量、空间覆盖等条件自动选择最佳影像;3)交互式缩略图预览,支持点击加载完整影像;4)自动化批量导出系统,实现标准化命名和统一存储。工具可广泛应用于农业监测、城市扩张研究、生态环境评估等领域,显著提高遥感数据预处理效率,确保

此星光明博客 93

redis集群下使用lua脚本时有个key的解决办法

redis单节点 key都在同一个节点上; redis集群 key经过算法后,会分布在不同的节点上; lua脚本限制 执行脚本中涉及到的key要在同一个节点上; 解决方案 在key中使用‘{}’,redis计算key要保存到那个节点上时,是根据‘{}’它里面的来计算的,只要这里面的是相同的,就会保存到相同的节点上; 注意:保存的key也会带上‘{}’; 例如 {key}abcd、 {key}1234、abcd{key}1234 集群命令 计算key会保存到的slot; cluster keyslot {

大叶子不小的博客 3738

游戏代练工作室代练报价单页模板

本模板特色如下:轻量高效,快速上线代码精简:去除冗余动画和复杂特效,保留核心交互,加载速度提升 40%,适合各类服务器配置一般的网站结构清晰:HTML 代码按 “导航 – 英雄区 – 核心模块 – 联系区” 分层,后续开发人员可快速修改内容(如替换游戏名称、价格等)无冗余依赖:仅依赖 Tailwind CSS 和 Font Awesome 两个基础库,避免第三方框架导致的加载延迟核心功能完整,满足业务需求游戏分类展示:以卡片形式呈现热门游戏(英雄联盟、王者荣耀等),包含游戏图标和核心服务类型,用户可快速找到对应需求价格表切换:支持 4 大游戏价格一切换,每个游戏包含 5 个主流段位 / 服务套餐,标注 “最受欢迎” 选项,降低用户决策成本客户评价滚动:自动垂直滚动展示真实用户反馈,内容聚焦 “价格优惠” 和 “速度快”,悬停时自动暂停,兼顾浏览效率和阅读体验一下单入口:导航栏、服务卡片、价格表等关位置均有醒目的 “立即下单” 按钮,形成转化闭环响应式设计,适配全设备移动端优化:导航自动折叠为汉堡菜单,价格表从 5 列调整为 1 列,文字大小动态适配,避免小屏显示错乱平板 / PC 端适配:根据屏幕宽度自动调整布局(如服务卡片在平板显示 2 列,PC 显示 3 列),保持视觉平衡交互一致性:无论在手机还是电脑上,价格切换、评价滚动等功能操作逻辑一致,减少用户学习成本视觉风格贴合游戏行业色彩体系:以深紫色为主色调(体现专业),搭配橙色(活力)和绿色(安全),符合游戏用户审美习惯卡片设计:服务卡片、价格卡片均采用 “悬浮 hover 效果”,鼠标经过时轻微上浮,增强交互反馈信任符号:通过盾牌图标(安全)、星星评分(好评)、用户头像(真实)等视觉元素,强化品牌可信度便于二次修改内容替换简单:所有图片使用占位图服务(picsum.phot

redis+lua实现高并发商品秒杀案例

redis+Lua脚本 1、减少网络开销,如果一个功能需要次请求redis,使用脚本完成同样的操作只需要请求一次,减少了网络往返 2、原子操作,redis会将lua脚本作为一个整体执行,中间不会被其他命令插入,无需担心竞态条件,无需使用事务 3、复用,客户端发送的脚本会永久存储在redis中,其他客户端可以复用这一脚本 我用的是单体服务进行跑批。999个商品一万个线程。用了一分钟(redis...

王威振的博客 1643

如何用C++14状态机库SML构建高效可维护的系统

在嵌入式系统、网络协议和游戏开发中,状态机是管理复杂逻辑的核心工具。传统的状态机实现要么过于冗长,要么性能开销巨大。今天,让我们探索一个专为现代C++设计的轻量级解决方案——SML(State Machine Language),它通过单一头文件、零依赖的设计,让你用简洁的语法构建高性能状态机。 ## 项目亮点速览 SML最吸引人的特性可以用四个关词概括: 1. **极简集成** - 只需

gitblog_00692的博客 848

Redis通过Lua一次获取个key

1.获取个key local result ={} for i = 1,#(KEYS) do result[i]= redis.call('get',KEYS[i]) end return result redis-cli示例: eval "local result={} for i = 1,#(KEYS) do result[i]= redis.cal...

weixin_30737433的博客 3916

Redislua脚本

本文已参与[新人创作礼]活动,一起开启掘金创作之路。 一、在redis使用lua脚本的好处 减少网络开销。可以将个请求通过脚本的形式一次发送,减少网络时延。 原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。 复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。 二、在redis使用lua脚本 //返回redis中KEYS[1] 的 retrun redis

weixin_42854904的博客 2万+

RedisRedis使用Lua脚本

Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua具体语法参考:https://www.runoob.com/lua/lua-tutorial.html。

morris 3万+

Redis 使用lua脚本最全教程

1、redis 使用lua脚本的语法 Redis Eval 命令 - 执行 Lua 脚本 redis 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second" 其中 script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。 numkeys: 用于指定

衡与墨的博客 2万+

RedisLua脚本讲解

当涉及Lua编程时,以下是对前述12个关概念的详细说明,附带Lua代码示例以帮助更深入了解这门编程语言@Inherited/*** key*//*** Key的前缀*//*** 一定时间内最访问次数*//*** 给定的时间范围 单位(秒)*///设置value的序列化方式为JSOn // redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

上善若泪 7294

Redis使用Lua脚本详解

前言 本文将讲解 RedisLua脚本的基本操作以及与 Java项目的集成使用Lua脚本 Lua是一个高效的轻量级脚本语言,在葡萄牙语中是“月亮”的意思,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 为什么要在程序中嵌入 Lua脚本?它解决了什么问题? 假设要开发一个 iPhone 的电子宠物游戏,设定玩家每次给宠物喂食,宠物饥饿就会减 N 点,这个 N 如果设置为一个定,以后需要更改的话,玩家就需要到 App Store 中升级游戏

沸羊羊_ 6312

redis初级——Lua脚本

介绍Lua脚本的基本数据结构与用法,以及在Redis中如何使用与管理Lua脚本

weixin_45102042的博客 4297

Redis中如何使用lua脚本-即redislua的相互调用

- 定义一个函数-- 函数体end-- 将函数赋给变量end-- 函数可以借助lua提供的语法糖简写为local funcend。

andrewbytecoder 2427

Redis整合Lua脚本

Lua是一种用C语言编写而成的轻量级的脚本语言

qq_39093474的博客 2678

Redis Lua脚本详解:从基础到高级应用

Redis Lua脚本指南:原子操作与高级应用 本文全面介绍RedisLua脚本使用方法,从基础到高级应用。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 8767

Redis Lua脚本好处、Redis执行Lua的两种方式、Redis缓存Lua脚本Redis Lua原子性验证、Lua脚本IP限流、Lua脚本自乘

以客户端执行乘法脚本为例,在redis客户端执行Lua语言,拼接了很命令,如果这样的一长执行串命令发给服务端,那么网络通信就会产生比较大的开销,所以Redis支持在服务端直接缓存一部分脚本的内容(它是用脚本生成了一段摘要,服务端可以根据这个摘要去执行脚本内容)。Lua脚本实现原子性的原理,就是执行一个Lua脚本的时候,里面有个命令,这个时候会阻塞其它任何命令的执行和其它任何客户端的请求,也就是说,执行Lua的时候,只会执行Lua里的命令,以此来达到Lua里的条命令成为一个整体来执行。

郝开的博客 2665

redislua脚本

在分布式系统与高并发架构的战场中,开发者们始终在与两个永恒的命题博弈:**数据一致性**与**系统性能**。当我们试图用Redis构建高速缓存、实现分布式锁或设计秒杀系统时,往往会陷入这样的困境——如何在保证原子性的同时,避免网络往返带来的性能损耗?如何让复杂的命令操作像单一指令般高效执行? 这正是**Redis Lua脚本**闪耀的舞台。作为Redis的"核武器级"特性,Lua脚本不仅实现了**原子性、隔离性**的操作保障,更能将复杂的业务逻辑压缩成服务端的高性能执行单元。

morris 1万+

Redis Lua脚本 & Debug

Redis Lua脚本Redis Lua脚本Debug

u013433591的博客 1243
上一篇: Spring和SpringMVC父子容器关系初窥
下一篇: 有关 GitHub 仓库分支的几个问题
zouduchen
博客等级 码龄5年 2粉丝 · 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值