Skip to content
Bonsai edited this page Apr 12, 2021 · 4 revisions

用Rust快速开发redis-module

在生产环境中经常需要开发一些纯内存读服务,用传统手艺一般来说是提供一个接口层(restful/rpc),然后这个接口服务将业务逻辑转化为redis的命令。编写这种服务会遇到一些问题

  • 业务数据模型需要转化为redis自带的数据结构,如果遇到redis不支持的数据结构,比如说tree. 就要用redis自带的结构去组装
  • 通常业务逻辑是有多个redis命令组成的,通过lua脚本或者pipeline实现,不好调试,同时语言表达能力太弱了

Redis4.0以来,提供redis-module机制支持加载动态链接库。有了这一机制,Redis可以化身高可用网络编程框架。至少有以下一系列的好处。

  • 想用什么数据结构就用什么数据结构
  • 借助redis的生态,什么语言都有一个redis-client的客户端,在封装一下就是一个非常不错的客户端sdk
  • 真微服务!什么叫微服务?一个服务有数据库/缓存/web服务还叫微服务吗?一个redis-server搞定是不是更加微服务一些。
  • 天生高可用/高并发
  • 因为架构简单所以运维友好

但是原本redis-module只能通过C语言实现,对我来说(一个优秀的python程序员--!)有一些缺点

  • 开发效率慢(for me), 其实用过了python,我觉得所有语言开发效率都慢...
  • redis-module提供一部分内置结构的自动内存释放,但是如果是自己的数据结构,需要去操心内存泄漏的问题,特别是我这种解释性语言选手
  • 难以测试,我为了做测试还要引入一套测试框架,好鸡儿复杂。对我来说没有测试过的代码就不应该上生产
  • 引入工具包带来的编译复杂问题,缺乏一个好的工程manifest机制

这个时候,天空一声巨响,rust闪亮登场。 本文大概会粗浅的讲解如何开发用rust开发redis-module. 刚接触rust三个月,只有下班时间才能看看书,有错误大佬喷我教我便是。文章分为以下内容,很多地方都是浅尝则止,我也在不断探索

  1. 快速体验: 先上手写一个最简单的module
  2. redis module大概实现原理是什么,了解之后大概可以明白通过redis-module我们可以干嘛
  3. redis module和lua script的区别? DOC
  4. rust的ffi, 以及bingen如何帮组我们快速的与c交互
  5. redismodule-rs 是如何封装redismoduel-api的
  6. 数据结构:在redis,实现一个tree的原生数据结构
  7. 工程化: 如何交叉编译,黑盒测试,docker, deploy
  8. 类web开发: 权限管理/ratelimiter/middleware/全局字典
  9. 高可用
  10. 压力测试
Clone this wiki locally