IT技术互动交流平台

如何使用lua进行redis数据操作的示范

作者:whl  来源:网络整理  发布日期:2018-11-13 08:32:00

  小编最近在工作的时候碰到了一个难题,百思不得其解,经过查询了大量的资料之后才找到了问题所在。原来是因为返回结果导致了问题的发生,下面小编将如何使用lua进行redis数据操作进行示范,给大家提供的示例代码都是十分详细的,大家完全可以轻易进行操作。

  前言

  为什么要用lua脚本操作redis数据库?

  1.减少开销–减少向redis服务器的请求次数

  2.原子操作–redis将lua脚本作为一个原子执行

  3.可复用–其他客户端可以使用已经执行过的lua脚本

  4.增加redis灵活性–lua脚本可以帮助redis做更多的事情

  lua脚本本身体积小,启动速度快.

  因此,从redis 2.6.0开始,redis在服务器端内置lua解释器,下面话不多说了,来开始本文的正文:

  最近在配合移动端调试的时候,被抓去debug一个在清除redis缓存之后才会出现的网关错误。于是打开服务器上的log定位到类似错误:

类似错误

  [error] 7#7: *12030 lua entry thread aborted: runtime error: /data/share/apps/lua/access_check.lua:133: bad argument #1 to 'decode' (string expected, got userdata)

  该段代码的主要作用是在openresty中lua读取redis中数据并解码为json:

解码为json

  通过查询资料得知原因:lua读取redis数据返回结果为空时,返回的结果不是nil而是userdata类型的ngx.null。

  为什么要这么设计?

  因为nil在lua中有特殊的意义,如果一个变量被设置为nil相当于告知该变量未定义(不存在)一样,如果把redis查询的结果为空设置为nil,而该查询的key对应在redis中又是存在的,就无法把查询为空和未定义区分开来了,这样显然是不合理的。所以必须使用一个userdata类型的值来表示这个查询记录为空,但是又不等同于未定义变量(ngx.null)。

  因此,代码做如下修改即可:

代码做如下修改

  总结

  lua脚本由于体积较小,而且启动速度飞快,这些优点都使得它得到众多用户的喜爱。大家不要看到需要代码就觉得很难操作,大家完全可以先进行复制粘贴试一下,你会发现自己又打开了一扇新的世界的大门。

延伸阅读:

Tag标签: redis数据操作  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规