• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Redis > 简介Lua脚本与Redis数据库的结合使用

简介Lua脚本与Redis数据库的结合使用

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了redis lua脚本,redis lua开发工具,redis lua,nginx lua redis,openresty lua redis等相关知识,希望本文的分享对您有所帮助

 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言。
Hello, Lua!

我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义的方式交互。

return msg</div>

这是非常简单的,第一行代码定义了一个本地变量msg存储我们的信息, 第二行代码表示 从redis 服务端返回msg的值给客户端。 保存这个文件到hello.lua,像这样去运行:

运行这段代码会打印"Hello,world!", EVAL在第一个参数是我们的lua脚本, 这我们用cat命令从文件中读取我们的脚本内容。第二个参数是这个脚本需要访问的Redis 的键的数字号。我们简单的 “Hello Script" 不会访问任何键,所以我们使用0

访问键和参数

假设我们要建立一个URL简写服务器。我们就要去存储每条进入的URL并返回一个唯一数值,以便以后通过这个数值访问到该URL。

我们将利用Lua脚本立即从Redis中用INCRand获取一个唯一标识ID,以这个标识ID作为URL存储于一个哈希中的键值:

redis.call("HSET", KEYS[2], link_id, ARGV[1])
return link_id</div>

我们将用call()函数首次访问Redis。call()的参数就是发给Redis的命令:首先INCR <key>, 然后HSET <key> <field> <value>。这两个命令将依次执行——当这个脚本执行时,Redis不会做任何事,它将非常快地运行。

我们将会访问两个Lua表:KEYS和ARGV。表单是关联性数组和结构化数据的Lua唯一机制。对于我们的意图,你可以把它们看做是一个你所熟悉的任意语言对等的数组,但是提醒两个很容易困扰到新手的两个Lua定则:

  •     表是基于1的,也就是说索引以数值1开始。所以在表中的第一个元素就是mytable[1],第二个就是mytable[2]等等。
  •     表中不能有nil值。如果一个操作表中有[1, nil, 3, 4],那么结果将会是[1]——表将会在第一个nil截断。

当调用这个脚本时,我们还需要传递KEYS和ARGV表的值:


在EVAL语句中,2指出需要传入的KEY的个数,后面跟着需要传入的两个KEY,最后传入是ARGV的值。在Redis中执行Lua脚本时,Redis-cli会检查传入KEY的个数,除非传入的完全是命令。

为了解释得更清楚,下面列出替换KEY和ARGV后的脚本:

redis.call("HSET", "links:urls", link_id, "http://malcolmgladwellbookgenerator.com")
return link_id</div>

为Redis编写Lua脚本时,每个KEY都是通过KEYS表指定。ARGV表用来传递参数,这个例子中ARGV用来传入URL。

逻辑条件:increx与hincrex

上一个例子保存链接为短网址,想要知道这个链接的点击次数,在Redis中添加一个hash计数器。当带有链接标记的用户访问时,我们检查其是否存在,如存在则需要给计数器加1:

return redis.call("HINCR", KEYS[1], ARGV[1])
else
return nil
end</div>

每次有人点击短网址,我们运行这个脚本跟踪这个链接被再次分享。我们用EVAL来调用脚本,传入inlinks:visits(keys[1])和上一个脚本返回的链接标识(ARGV[1])。

这段脚本将检查是否存在相同的hash,如果存在就为这个标准的Redis KEY加1。

return redis.call("INCR",KEYS[1])
else
return nil
end</div>

脚本加载与注册执行

注意,当Redis在运行Lua脚本的时候,其它的事情什么都干不了!脚本最好只是简单的扩展Redis进行较小的原子操作和简单的逻辑控制需要,Lua脚本中的bug可能引发整个Redis服务器锁—最好保持脚本的简短和易于调试。

虽然这些脚本一般都比较短小,但我们还是希望不要每次执行时都使用完整的Lua脚本,实际上可以在程序一步一步(译注:application boots翻译有难度)开发中注册Lua脚本(或者在你部署时注册),然后用注册后生成的SHA-1标识来进行调用。

=> "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
 
redis-cli EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
=> "hello world"</div>


显示调用SCRIPT LOAD通常是不必要的,当一个程序执行EVAL时就已隐式加载了。程序会先尝试EAVALSHA,当脚本没有找到时会调用EVAL。

对于Ruby开发者,可以看一下Shopify's Wolverine,其可以为Ruby应用简单的加载并存储Lua脚本。对于PHP开发者,Predis 支持加载Lua脚本作为普通Redis命令进行调用(译注:需要继承Predis\Command\ScriptedCommand基类,并注册命令)。如果你使用这些或者其它的工具来标准化与Lua的交互,请让我知道,我很感兴趣知道本文之外的内容。

何时使用Lua

Redis支持WATCH/MULTI/EXEC这样的块,能进行一组操作,也能一起提交执行,看起来与Lua有重叠。应该如何进行选择?MULT块中所有操作独立,但在Lua中,后面的操作能依赖前面操作的执行结果。同时使用Lua脚本还能够避免WATCH使用后竞争条件引起客户端反应变慢的情况。

在RedisGreen(译注:国外一家专门提供Redis主机的服务商),我们看到许多应用使用Lua的同时也使用MULTI/EXEC,但两者但不是替代关系。许多成功的Lua脚本都很小,仅仅实现一个你的应用需要而Redis命令中没有单一的功能。

访问库

Redis的Lua解释器加载七个库:base,table,string, math, debug,cjson和cmsgpack。前几个都是标准库,充许你使用任何语言进行基本的操作。后面两个可以让Redis支持JSON和MessagePack—这是非常有用的功能,同时我也很想知道为什么常常看不到这种用法。

Web应用程序常常使用JSON作为api返回数据,你也许也可以把一堆JSON数据存到Redis的key中。当想访问某些JSON数据时,首先需要保存到一个hash中,使用Redis的JSON支持将非常方便:

local payload = redis.call("GET", KEYS[1])
return cjson.decode(payload)[ARGV[1]]
else
return nil
end</div>


在这里我们检查看key是否存在,如不存在则快速返回nil。如存在则从Redis中获取JSON值,用cjson.decode()进行解析,然后返回请求内容。

代码如下:</div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 简介Lua脚本与Redis数据库的结合使用
  • redis中使用java脚本实现分布式锁

相关文章

  • 2017-05-11Redis 中spark参数executor-cores引起的异常解决办法
  • 2017-07-22Redis系列(四)--内存淘汰机制(含单机版内存优化建议)
  • 2017-05-11Redis 集群搭建和简单使用教程
  • 2017-05-11Redis中的动态字符串学习教程
  • 2017-05-11redis2.8配置文件中文翻译版
  • 2017-05-11详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
  • 2017-05-11Redis和Memcached的区别详解
  • 2017-05-11详解SSH框架和Redis的整合
  • 2017-09-02Redis持久化之AOF
  • 2017-05-11Redis教程(十四):内存优化介绍

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 详解Redis中的双链表结构
    • Ubuntu下安装redis的2种方法分享
    • EasyCMS在幼儿园视频直播项目实战中以redis操作池的方式应对高并发的redis操作问题
    • Redis整合Spring结合使用缓存实例
    • 详解Centos7下配置Redis并开机自启动
    • Redis实现多人多聊天室功能
    • 关于redis启动时报错:Could not get a resource from the pool。
    • Redis批量删除KEY的方法
    • CentOS Linux系统下安装Redis过程和配置参数说明
    • Redis缓存技术学习系列之事务处理

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有