Redis集成Lua脚本实现

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

相关依赖

1. 环境部署

2. Redis指令手册

3. Lua语言基础

4. Redis与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

时间: 2024-12-24 07:40:02

Redis集成Lua脚本实现的相关文章

.Net Core使用分布式缓存Redis:Lua脚本

一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行,在Lua脚本中也可以调用大部分的Redis命令.使用脚本有以下三个好处: (1) 减少网络开销:有些时候需要多次请求Redis获取处理数据,而使用脚本功能就可以只使用一次请求完成相同操作,减少了网络往返时延. (2) 原子操作:Redis会将整个脚本作为一个整体

Redis 的 Lua 脚本支持

Redis 2.6.0 内置的Lua Script支持,可以在Redis的Server端一次运行大量逻辑. 整个Script默认是在一个事务里的. Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key. EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值.然后用EVALHASH执行. 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串. 参考:http://www.searchdata

redis之lua脚本

背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事务执行过程中不会被其他工作打断.乐观锁:监视特定的键,防止事务出现竞争条件.虽然这些附加功能都非常有用,但它们也有一些缺陷. 流水线的缺陷尽管使用流水线可以一次发送多个命令,但是对于一个由多个命令组成的复杂操作来说,为了执行该操作而不断地重复发送相同的命令,这并不是最高效的做法,会对网络资源造成浪费

redis 对lua 脚本传出类型的理解

Lua 到 Redis 的转换表. Lua number -> Redis integer reply (the number is converted into an integer) Lua string -> Redis bulk reply Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any) Lua table with a sin

Redis Lua 脚本使用

Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 Lua 的示例,里面注释部分会讲解相关的作用: -- -- -- 拿客 -- 网站:www.coderknock.com -- QQ群:213732117 -- 三产 创建于 2017年06月15日 12:04:54. -- 描述: -- -- local strings website = "coderknock.com" print(we

Redis(六)Lua脚本的支持

Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的难度.在此基础上,Redis通过内置Lua解释器,Redis client可以发起执行Lua脚本,完成特殊的功能需求. Redis中使用Lua脚本 在Redis中可以通过使用eval和evalsha命令提供对执行Lua的支持. eval语法: EVAL script numkeys key [key

Redis进阶应用:Redis+Lua脚本实现复合操作

一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Redis已成为当前架构设计中的首选key-value存储系统. 虽然Redis官网上提供了200多个命令,但做程序设计时还是避免不了为了实现一小步业务逻辑而多次调用Redis的情况. 以compare and set场景为例.如果使用Redis原生命令,需要从Redis中获取这个key,然后提取其中的

redis与lua

内容大纲 redis里使用eval和evalsha redis管理Lua脚本  php里使用redis的lua脚本 在redis里使用lua脚本的好处 1.Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令2.Lua脚本可以帮助开发和运维人员创造出自己定制的命令,并可以将这些命令常驻在Redis内存中,实现复用的效果. 3.Lua脚本可以将多条命令一次性打包,有效地减少网络开销 在redis中 eval的语法格式EVAL script numkeys key [key ...]

redis限速器设计(不使用lua脚本及事物)

公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器. 首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例 FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+":"+ts current = GET(keyname) IF current != N