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 模块的人还不多,所以我认为现在是写一个未来可能变得非常重要的模块的机会!

广告
将在 10 秒后关闭
bannerAds