专栏首页若是烟花Redis的Lua扩展

Redis的Lua扩展

基本环境

# redis
➜  ~ redis-server -v
Redis server v=3.2.6

# lua
➜  ~ lua -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio

参考文档:

概要

Redis从2.6版本开始引入了对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端执行多个Redis命令。

使用脚本的好处

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

使用脚本的限制

  • 不支持集群。
  • 原子操作。如果脚本执行耗时,会对其他操作造成影响

使用

调用Lua脚本的语法

传入脚本文件

# KEYS 与 ARGV 中间使用 “ , ” 逗号分隔,前后有空格
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...

    * --eval,告诉redis-cli读取并运行后面的lua脚本
    * path/to/redis.lua,是lua脚本的位置,也可以直接为脚本字符串。是一个Lua 5.1 script。
    * KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取
    * ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。

传入脚本字符串

127.0.0.1:6379> eval script numkeys key [key ...] arg [arg ...]
    
    * eval: 将要执行脚本
    * script: 脚本字符串
    * numkeys: KEY参数个数
    * key ... : 操作的键
    * arg ... : 参数

使用示例

KEYS ARGV

# xx.lua
return {KEYS, ARGV}
➜  ~ redis-cli --eval xx.lua k1 k2 k3 , a1 a2 a3
1) 1) "k1"
   2) "k2"
   3) "k3"
2) 1) "a1"
   2) "a2"
   3) "a3"
➜  ~ redis-cli
127.0.0.1:6379> eval "redis.call('set', 'name', 'xx')" 0
(nil)
127.0.0.1:6379> eval "redis.call('get', 'name')" 0
(nil)
127.0.0.1:6379> eval "return redis.call('get', 'name')" 0
"xx"

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 七日Python之路--第四天(之Django官方文档)

    源地址:http://django-chinese-docs-16.readthedocs.org/en/latest/intro/overview.html

    lpe234
  • zookeeper集群搭建

    整体的搭建十分简单,只需要区别一些各个实例的dataDir和clientPort配置信息即可。

    lpe234
  • python爬虫----(6. scrapy框架,抓取亚马逊数据)

    利用xpath()分析抓取数据还是比较简单的,只是网址的跳转和递归等比较麻烦。耽误了好久,还是豆瓣好呀,URL那么的规范。唉,亚马逊URL乱七八糟的.... 可...

    lpe234
  • burpsuite IP伪造插件

    在Repeater模块右键选择fakeIp菜单,然后点击inputIP功能,然后输入指定的ip:

    斑马
  • 带你解读NVIDIA Jetson官网最新更新资料

    GPUS Lady
  • 单元测试之差强人意的embedded-redis

    作为Key-Value型的内存数据库,redis已经是Spring开发的标配。在单元测试/集成测试时,如果有一个带有redis服务的独享环境,对于保障测试用例执...

    Antony
  • java 范型

    让 Foo.class 是 Class<Foo> 类型有什么好处?通过类型推理的魔力,可以提高使用反射的代码的类型安全。另外,还不需要将 Foo.class.n...

    乐事
  • Power Query批量导入文件

    在power query中使用如下代码,可以批量导入格式相同的文件,把文件放到文件夹即可

    披头
  • 如何部署 Redis 集群

    Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使...

    大数据弄潮儿
  • 如何在Ubuntu 16.04上安装和配置Redis集群

    Redis集群已经发展成为缓存,队列等的流行工具,因为它具有可扩展性和速度的潜力。本指南旨在使用三个Linode创建一个集群来演示分片。然后,如果发生故障,您将...

    双愚

扫码关注云+社区

领取腾讯云代金券