首页 > 代码库 > Redis集成Lua脚本实现

Redis集成Lua脚本实现

  作者:zhanhailiang 日期:2014-12-02

相关依赖

1. 环境部署

  • Redis安装配置教程及phpredis扩展安装测试
  • Redis安装以及php扩展
  • Windows下安装phpredis模块(当前Window环境下的php_redis.dll基本还是2.1.3,而Linux下的redis.so版本已经到了2.2.5,这可能导致部分指令集的支持程度不同)

2. Redis指令手册

  • php-redis中文帮助手册.chm(这份手册相对较旧,请参照Redis Commands)
  • Redis Commands
  • EVAL script numkeys key [key ...] arg [arg ...]

3. Lua语言基础

  • 《Lua 5.1 参考手册》云风 译
  • LUA TABLE 遍历数组的应用

4. Redis与Lua通信原理

  • Lua: 给 Redis 用户的入门指导
  • Redis新分支,进行服务端lua脚本支持的开发
  • 《Redis 2.6 Lua 脚本功能实现分析》

集成Lua脚本操作Redis的优势

能够上Redis更快!很多Redis应用的使用方式是read-compute-write模式,这使得一次简单的数据计算都需要客户端与服务端进行两次通信,而如果把中间的compute过程转移到服务端执行,则可以成倍地减少round-trip时间。
充分利用CPU!Redis的绝大多数应用场景都是IO密集型,即使是到达CPU100%极限(Redis无法使用多核)的,CPU的使用也大多是在网络协议栈的处理上,但如果使用服务端执行的脚本,则可以充分将Redis Server的CPU利用起来。
但最根本的原因在于:这样我们可以只在Redis中实现最基本的能够满足99%用户需求的功能,把其它独特应用场景下的1%的功能留给自定义的服务端执行脚本来实现。对于害怕Redis引入服务端脚本后变得冗余庞大的同学,看到这里可以舒一口气了,因为这就是为了防止满足无休止的需求而提出的终极解决方案。

原文请见:Redis新分支,进行服务端lua脚本支持的开发

应用原理

Redis实现与Lua脚本的通信的方案是通过客户端将lua脚本作为命令传给服务端,服务端读到脚本,调用解释器进行解释后进行执行并返回来实现。

其提供两个接口实现:

[root@~/wade/lua/historyBrowsing]# redis-cli 
127.0.0.1:6379> help eval
 
  EVAL script numkeys key [key ...] arg [arg ...]
  summary: Execute a Lua script server side
  since: 2.6.0
  group: scripting
 
127.0.0.1:6379> help evalsha
 
  EVALSHA sha1 numkeys key [key ...] arg [arg ...]
  summary: Execute a Lua script server side
  since: 2.6.0
  group: scripting

接下来通过一个简单的Demo实现来解释下其应用场景:

在redis服务器上存储了一个key为name2的数据,其存储结构为zset,此时我们可以通过如下方法访问:

127.0.0.1:6379> eval ‘return redis.call("zrange", "name2", 0 , -1);‘ 0
1) "1"

当然以上示例只是为了说明eval的用法,实际操作时直接redis-client zrang name2 0 -1即可。

但是如果我要求可以动态读取key来获取对应的值,此时就需要使用lua脚本来实现对应的功能。

以下托管于github.com的代码实现了浏览历史添加功能,有兴趣的同学可以学习下,不必在意其中具体的业务逻辑,只需关心redis是如何与lua通信的即可:

源码请见:https://github.com/billfeller/historyBrowsing

Redis集成Lua脚本实现