Redis 4.0 RC1 发布了,介绍一下 Redis 模块
总结(因为预计之外地变长了)
-
- Redis 4.0 がもう来年には来そうです!モジュール機能が使えるようになりますよ!
-
- というわけで、現状作られているモジュールを紹介してみます
個人的に特に面白いな/便利そうだなと思ったのは以下です
Redis graph: グラフデータベース
redablooms: ブルームフィルタ
redis-cell: レートリミット (Rust で書かれてる!)
RedisEx: Redis 便利コマンド詰め合わせ
redis-module-shm: 変態モジュール
年末年始は Redis モジュール作ろう!
本編
Redis 4.0 RC1发布了!我关于它的博客文章在这里:https://t.co/sv37Um6Pgb — Salvatore Sanfilippo (@antirez) 2016年12月2日
前几天,Redis 4.0发布了RC1版。Redis 4.0有很多新功能,但个人最关注的是模块功能。
Redis是数据库产品中一种拥有丰富内部数据结构和接口的特点(虽然对其他数据库产品并不特别了解),能够高效地处理特定问题的适用数据结构,无论在时间上还是空间上都具有吸引力。即使对于特定问题,Redis已经提供了相对通用和广泛的数据结构,但有时仍会感到不够满足。虽然可以通过充分利用Lua脚本功能来实现各种操作,但例如构建更高级的跨多个键的数据结构等,我并不是特别想做。总之,我更希望能够接触一些更底层的东西,比如更深入地了解内存等方面的内容。
所以说,这就是模块化的原因。虽然它的可能性不再是无限大了,但是只要是在已经加载了模块的 Redis 服务器进程的权限范围内,它可以做任何事情。(几乎)可以在单线程的 Redis 核心上使用多线程来偷偷摸摸做一些事情,也可以实现流行的深度网络。虽然它本应该是一个充满梦想和希望的功能,但我感觉好像并没有引起太大的热情。因此,在本文中,我打算通过介绍当前正在开发的 Redis 模块来推动模块开发的热潮。
大致分类
-
- データ構造系
-
- 検索系
-
- セキュリティ系
-
- 圧縮系
-
- 機械学習系
- その他
数据结构
Redis 图形
最近刚结束的第一届Redis模块黑客马拉松中,我获得了第三名,所开发的模块是在Redis上构建图数据库的工具。图的节点用Redis的哈希来表示,使用GRAPH.ADDEDGE命令来指定节点之间的关系来构建图。之后,可以使用GRAPH.QUERY命令来搜索节点和获取属性。查询语法基于Neo4j的Cypher语言。虽然只实现了Cypher的一小部分功能,但目前看来已经足够好玩了。
我个人非常喜欢Redis这个模块,它在充分利用之前累积的优势的基础上,还提供了具有潜力的功能,使其具备了进一步发展的可能性。
红色的花朵盛开。
这个模块是把名为Deblooms的布隆过滤器库适配到Redis中使用的。
基本上,通过SBF.ADD命令来添加元素,并通过SBF.CHECK命令进行判断。
如果能直接在Redis中使用就非常方便和高兴了。
ReDe
这似乎是一个用于数据“脱水”(dehydration) 的模块。在这里,所谓的脱水似乎是由开发者提出的概念,其实就是将被放入队列的数据进行延迟。具体而言,可以使用 REDE.PUSH 命令将数据带有 TTL 的方式推送到队列,然后使用 REDE.POLL 命令获取超过 TTL 的数据。但是乍一看,它似乎是使用普通的双向列表实现的,效率可能不太好。
雷迪斯小波树
这是我实现的一个小波树模块。目前还在开发的阶段,内存效率不太理想。
我希望未来能够实现动态小波树,但在阅读论文的过程中,完成可能还需要一段时间。
Redis模块时间序列
这是一个可以处理时间序列数据的Redis模块,它在Redis模块黑客马拉松中获得第二名。通过TS.CREATE命令指定时间段来初始化时间序列数据,然后通过TS.INSERT命令插入数据,最后通过TS.GET命令获取特定时间段的统计信息(总数、平均、数据点数等)。
但是,由于统计信息的计算需要遍历该时间段的所有时间桶,所以当数据量变多时可能会变得非常耗时。如果事先指定架构,也可以将JSON投入其中,这可能会很方便。
搜索系统
热机
该模块可以为Redis中的JSON字符串数据创建类似关系型数据库中索引的模块。目前,它会为所有可解析为JSON的字符串类型的KEY创建索引(未来可能能通过前缀等方式限制目标)。在使用REJI.CREATE命令创建索引后,需要使用REJI.PUT命令来存储新的JSON并更新索引。索引也可以施加唯一约束,如果违反,则REJI.PUT操作将失败。最终可以使用REJI.GET命令使用创建的索引高效地列举JSON记录。
红色搜索
这是一个提供使用倒排索引进行全文检索功能的模块。在使用FT.CREATE命令构建索引后,可以使用FT.ADD命令添加文档,然后使用FT.SEARCH命令进行搜索。还可以对字段进行加权、进行短语搜索,以及使用snowball进行词干处理。
安全领域
Redis-Cell
在Redis模块黑客马拉松中获胜的模块是一个经常在Redis中实现的,提供速率限制功能的模块。据说它实现了通用单元速率算法。它只提供一个命令CL.THROTTLE,可以实现例如“限制60秒内从同一IP发出的请求为30次,并限制同时请求次数为15次”的功能。
此外,这个模块还是使用 Rust 的 FFI 编写的,这也很有趣(或许将来会介绍有关 Rust 编写 Redis 模块的方法)。
Redis密码模块
这是一个用于安全存储密码的模块。
通过 PASSWORD.SET 命令,将经过bcrypt加密的密码字符串作为字符串类型存储。另外,也可以通过 PASSWORD.CHECK 命令来检查存储的密码是否匹配。还有使用哈希值而不是字符串的 PASSWORD.HSET / PASSWORD.HCHECK。
这些命令不被监控,所以也可以放心使用。
pam_auth身份认证
这是一个使用 PAM 来进行认证而不是使用现有的 Redis AUTH 命令的认证的模块。它仅仅作为 Redis 模块的 PoC 被创建,所以在目前阶段并不实用,但我认为可能存在一定的需求。
压缩系统 xì
红实的ZSTD模块
这是一个使用 Facebook 最近几个月开源的 Zstandard 库来压缩和存储字符串的模块。它提供了 zstd.SET/zstd.GET 命令来支持SET/GET操作。此外,还提供了支持字典压缩的 zstd.DICTSET/zstd.DICTGET。
在SET系列命令中,客户端会被阻塞,同时在另一个线程中运行压缩处理,并在完成后返回给客户端,以确保在压缩大型数据时不会阻塞其他请求。
机械学习专业
神经-Redis
一部でバズってたのでご存知の方も多いとは思いますが、一応紹介しておきます。Redis の生みの親である antirez 氏がモジュールのサンプルとして作った多層パーセプトロンです。コマンドは結構いろいろありますが、基本的なものは以下です。
NR.CREATE: ネットワークを構築する
NR.OBSERVE: 教師データを与える (訓練用とテスト用に勝手に振り分け)
NR.TRAIN: 別スレッドで学習を行う。上記テストデータを使って過学習しそうになったら止まる
NR.RUN / NR.CLASS: 未知入力に対する出力を得る。それぞれ回帰と識別用。学習中でも使える
Redis に格納するのはネットワークの重みや勾配情報、教師データあたりのようです。別スレッドで計算を進めておけるあたりが素敵ですね。
Redis-ML (Redis 机器学习)
提供機械學習模型的 Redis 模組。目前看來可供使用的模型如下。
-
- ランダムフォレスト (識別と回帰)
-
- 線形回帰
-
- ロジスティック回帰
- (なぜか) 行列演算
接下来的期望是什么呢?
其他
RedisEx
这个模块为现有的Redis数据类型提供了许多方便的命令。例如,它可以方便地提供各种实用命令。
PKEYS: 正規表現にマッチする KEY を列挙する
CHECKAND: 文字列型に対するコマンドを等値条件付きにできる
LMPOP: リストから複数個ポップする
MSISMEMBER: ある要素が複数のセットのいずれかに含まれているかを判定する
ZUNIONTOP: 複数の順序付きセットの和集合を取って、スコアの低い順から k 個取得する
有诸如此类的选择。
Redis模块共享内存
这是一个相当疯狂的模块(?),当Redis客户端和服务器位于同一主机上时,可以使用共享内存进行通信。在性能基准测试中,它比UNIX套接字快得多。
由于Redis模块无法影响服务器的连接行为,为了使用这个模块,需要在服务器启动时通过LD_PRELOAD插入覆盖read()和write()的对象文件。此外,客户端需要使用hiredis-shm来fork hiredis。
该模块提供的命令是SHM.OPEN,调用此命令后,客户端与服务器之间的通信将经过共享内存。
当模块添加了功能并感到高兴时,突然出现了一种彻底颠覆的非常手法,令人捧腹大笑。
小火堆
这是一个能够在 Redis 服务器上执行 Python 代码的模块。可以将 Python 代码片段存储为字符串并存储在 Redis 中,然后通过PYLD.pyrun命令来执行它。
虽然无法直接操作存储在 Redis 中的代码片段(当然可以使用 Redis 客户端连接),但可以通过返回下一个要执行的代码片段键名的返回值,实现链式处理。
以上,我原本以为没有什么大量的内容,所以随意写下来,但结果变得相当长了。
由于尚未正式发布,模块的完成度往往较低。但是,已经开始出现一些看起来很方便的模块。
因为开发 Redis 模块的人还不多,所以我认为现在是写一个未来可能变得非常重要的模块的机会!