对比redis lua和modules模块的性能损耗

文章目录

[隐藏]

  • 前言
  • Redis Lua Scripts的好处
  • Redis modules
  • lua和modules的区别
  • 测试redis原生命令hset的qps
  • 测试redis lua scripts的qps
  • 测试redis modules的hset命令的qps
  • 总之
前言

废话补多少,redis lua是干嘛的? 我们可以自定义逻辑方法,在方法里执行多个redis.call命令,以及各种逻辑的判断。 Redis modules的功能跟Redis lua是很类同的,显而易见的区别是,一个是lua,另一个是c代码。

Redis Lua Scripts的好处

第一,减少了网络的RTT消耗。

第二,原子化的封装,在redis里lua脚本的执行触发原子的,不可被中断的。

不可被中断? 如果发生阻塞命令怎么办? redis lua的wiki里写明了是不允许调用那些堵塞方法的,比如sub订阅,brpop这类的。

Redis modules

redis 4.0版支持扩充自定义的modules模块功能,可以在module里构建各种复杂的逻辑。redis modules兼并了redis lua的优点。较为麻烦的是redis modules需要build动态链接库so,然后loadmodules的方法来外挂启动。每次增加一个新modules的时候,可能就意味着你的redis cluster需要调整下了。

lua和modules的区别

redis官方建议使用redis modules扩充数据结构和实现组合功能,比如 支持json的rejson,支持搜索的RediSearch,支持topk的redis topk等等,而lua更倾向于去实现命令组合原子化。 对于我们业务上的绝大数需求来说,lua更加的好用,不需要每次都加载so,直接注册lua scirpts就可以了。

该文章后续仍在不断的更新修改中, 请移步到原文地址 http://xiaorui.cc/?p=5377

前面说了这么多科普的介绍,那么我们目的在于什么? 我自己一直怀疑redis lua的速度应该是比redis原生命令和redis modules模块慢,但自己没测试过性能会相差多少,所以写了几个benchmark测试下。 需要说明的是,这里使用redis-benchmark的测试方法也有待论证。 原本是想用go写一版,但考虑到go runtime本身也是有抖动的,有失公平。redis-benchmark也是官方推荐的方式。

测试redis原生命令hset的qps

测试redis lua scripts的qps

测试redis modules的hset命令的qps

这里放一个redis modules实现hset调用的代码, 只需要make; redis-server –loadmodule ./module.so 就可以启动加载了。

// xiaorui.cc    int HGetCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {      // we need EXACTLY 4 arguments    if (argc != 4) {      return RedisModule_WrongArity(ctx);    }    RedisModule_AutoMemory(ctx);      // open the key and make sure it's indeed a HASH and not empty    RedisModuleKey *key =        RedisModule_OpenKey(ctx, argv[1], REDISMODULE_READ | REDISMODULE_WRITE);    if (RedisModule_KeyType(key) != REDISMODULE_KEYTYPE_HASH &&        RedisModule_KeyType(key) != REDISMODULE_KEYTYPE_EMPTY) {      return RedisModule_ReplyWithError(ctx, REDISMODULE_ERRORMSG_WRONGTYPE);    }      // set the new value of the element    RedisModuleCallReply *rep =        RedisModule_Call(ctx, "HSET", "sss", argv[1], argv[2], argv[3]);    RMUTIL_ASSERT_NOERROR(ctx, rep);      // if the value was null before - we just return null    if (RedisModule_CallReplyType(rep) == REDISMODULE_REPLY_NULL) {      RedisModule_ReplyWithNull(ctx);      return REDISMODULE_OK;    }      // forward the HGET reply to the client    RedisModule_ReplyWithCallReply(ctx, rep);    return REDISMODULE_OK;  }  

这里的测试都是单命令测试,主要是为了可以对比原生的命令。单纯从benchmark结果来说,原生的命令是最快,其次是redis modules模块,相对慢一点是redis lua scripts, 通过qps对比,redis lua也仅仅慢一点点罢了。 redis lua可随意注册使用,但redis modules相对麻烦了,需要redis-server启动的时候加载该动态链接库。 很多云厂商的redis paas也不支持你这么做。

总之

虽然测试的流程貌似不科学,但单纯看上面的结果来分析,我们不需要担心redis lua和redis modules的性能损耗。

原文出处:xiaorui -> http://xiaorui.cc/2018/07/16/%E5%AF%B9%E6%AF%94redis-lua%E5%92%8Cmodules%E6%A8%A1%E5%9D%97%E7%9A%84%E6%80%A7%E8%83%BD%E6%8D%9F%E8%80%97/

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。