Redis的SCAN命令可以轻松实现在RxJS中
-
- Redis *SCAN コマンドを非同期実行して簡単にアイテムをとってくる方法を説明します
- ES5, ES6, ES7 それぞれの書き方サンプルあります
在Redis中,可以使用KEYS命令获取键的列表,但是一次处理大量数据会占用Redis的处理时间。由于在生产环境中不实用,因此引入了可以逐步获取的SCAN系列命令来替代。然而,使用SCAN系列命令需要使用游标进行多次执行,对于基于非同步处理的Node来说,直接使用redis.scan或redis.hscan并不容易。本文将介绍如何使用RxJS快速实现所需目标。
准备
首先准备一个名为 redis-scanrx 的库。
由于我之前已经准备好了东西,我将会在npm上进行安装。
npm install redis-scanrx
接下来,将与 node_redis 进行混合。
var redis = require("redis");
require("redis-scanrx")(redis);
只需要按通常步骤创建客户端,准备工作就完成了。
var client = redis.createClient();
装盘示例
使用ES5~ES7各种写法编写一个程序,从Redis中获取以共通前缀sample-app:开头的所有键,并将它们放入一个数组中,同时去除共通前缀,并输出前五个键。
ES5的方式
var redis = require("redis");
require("redis-scanrx")(redis);
var client = redis.createClient();
client.scanrx('sample-app:*')
.map(function (x) {
// ex: 共通プレフィックスを取り除く
return x.replace('sample-app:', '')
})
.take(5) // ex: 先頭5つだけ取得する
.toArray() // ex: 結果を一つの配列にまとめる
.subscribe(
function (x) { console.log(x) }
function (e) { console.error(e) }
function () { console.log("Completed!") }
);
ES6 方法(承诺)
import redis from "redis";
import scanrx from "redis-scanrx";
let client = scanrx(redis).createClient();
client.scanrx('sample-app:*')
// ex: 共通プレフィックスを取り除く
.map(x => x.replace('sample-app:', ''))
.take(5) // ex: 先頭5つだけ取得する
.toArray() // ex: 結果を一つの配列にまとめる
.toPromise()
.then(x => console.log(x), e => console.error(e));
ES7方法(async/await)的方式
import redis from "redis";
import scanrx from "redis-scanrx";
let client = scanrx(redis).createClient();
async function main() {
let result = await client.scanrx('sample-app:*')
// ex: 共通プレフィックスを取り除く
.map(x => x.replace('sample-app:', ''))
.take(5) // ex: 先頭5つだけ取得する
.toArray() // ex: 結果を一つの配列にまとめる
.toPromise();
console.log(result);
}
main();
所有命令
扫描… client.scanrx([pattern])
可以获取Redis上的所有键。
您可以指定匹配条件的模式作为选项。
尽管您也可以在where后面进行过滤,但是使用模式进行过滤可以减少与Redis的通信量。
client.scanrx("key:*")
.subscribeOnNext(x => console.log(x));
// "key:" で始まるキーのみを取得
使用SSCAN … client.sscanrx(key, [pattern])进行遍历并获取匹配指定模式的键/值对。
可以获取与关键字对应的集合中的所有元素。
作为选项,您还可以指定元素的模式。
HSCAN … 客户端使用 client.hscanrx(key, [pattern]) 进行扫描。
获取包含在与给定key对应的HASH中的所有字段\值。您还可以选择指定与字段匹配的模式。每个获取的元素将成为一个类似{ field: “field_1”, value: “value_1” }的对象。
client.hscanrx("hash:1")
.subscribeOnNext(x => console.log(x) );
// => { field: "field_1", value: "value_1" }
// => { field: "field_2", value: "value_2" }
// => { field: "field_3", value: "value_3" }
// => { field: "field_4", value: "value_4" }
// ...
ZSCAN…客户端.zscanrx(key, [pattern])
从与给定键匹配的已排序集合中获取所有元素。
作为选项,您还可以指定与元素匹配的模式。
每个获取的元素将是类似于{ element: “element_1”, score: “1” }的对象。
client.zscanrx("zset:1")
.subscribeOnNext(x => console.log(x) );
// => { element: "element_1", score: "1" }
// => { element: "element_2", score: "2" }
// => { element: "element_3", score: "3" }
// => { element: "element_4", score: "4" }
// ...
LIG INC 先生的《RxJS》初学者入门-改变JavaScript异步处理常识的库是关于如何使用RxJS的明了指南。