用CGo实现一个Redis布隆过滤器的Module

之前阅读Redis源码的时候,就发现 Redis 4.0 这个 Module 功能。当时就有想法去用这个来写点东西玩玩,但是找工作各种原因就拖着没写,博客也没怎么更新。

后来也简单起了个头,但刚找到工作,每天也挺晚下班的,周末又懒,所以拖到现在才实现了基本功能,其实也没有几行代码。

为什么用CGo写

其实没为啥,仅仅因为不大想写C,虽然开了头之后发现还不如写C…CGo写起来也挺不爽的,而且RedisModule_*提供出来的函数,都是函数指针,CGo调用起来也有些繁琐。就当练练手,毕竟新工作也是用Golang。

Module的具体实现

Module在Redis大概是怎么实现的,其实我在Redis源码阅读笔记-各命令的执行中有简单提到。

其中最主要是RedisModule_OnLoad()方法,这是每个module必须而且强制要实现的方法,加载自定义的命令都是通过这个函数进行的。

RedisModule_CreateCommand()则是创建自定义命令的方法。

其实官网的2篇文章,就很清晰列出整个流程了,基本上瞄一眼Redis Modules: an introduction to the API (这篇的接口有些老旧,但主要描述真个流程)和Modules API reference 就足够写一个简单的module了。

但想吐槽一下,虽然有RedisModule_Call()这个高层的函数,可以直接调用所有命令,但是集群模式支持并不好。而且,Hash的底层API太少了吧?只有RedisModule_HashGetRedisModule_HashSet?没有列出Hash的key的函数吗?还是我眼拙没发现?

其实这编我也不打算写清楚我是怎么实现的,毕竟很简单的一个东西。项目链接在这个go-redis-boomfilter-module,代码比较丑陋…如果有看到这篇的朋友,万分欢迎指出错误!