diff --git a/package-lock.json b/package-lock.json index 9d2cca4..7b9b276 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@litert/redis", - "version": "3.0.1", + "version": "3.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@litert/redis", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "devDependencies": { "@commitlint/cli": "^18.2.0", diff --git a/package.json b/package.json index 520feb4..8d80fb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@litert/redis", - "version": "3.0.1", + "version": "3.0.2", "description": "A redis protocol implement for Node.js.", "main": "./lib/index.js", "scripts": { diff --git a/src/examples/multi.ts b/src/examples/multi.ts index d6ec84f..950a389 100644 --- a/src/examples/multi.ts +++ b/src/examples/multi.ts @@ -16,8 +16,34 @@ /* eslint-disable no-console */ import * as Redis from '../lib'; +export async function testZ(): Promise { + + const cli = Redis.createCommandClient({}); + + await cli.connect(); + + console.log(await cli.zAdd('testZSet', 100, 'z100')); + console.log(await cli.zAdd('testZSet', 99, 'z99')); + console.log(await cli.zAdd('testZSet', 97, 'z97')); + console.log(await cli.zAdd('testZSet', 98, 'z98')); + console.log(await cli.zAdd('testZSet', 95, 'z95')); + console.log(await cli.zAdd('testZSet', 39, 'z39')); + + console.log(await cli.zRangeWithScores('testZSet', 0, 3)); + + console.log(await cli.zRem('testZSet', ['z39', 'z97'])); + + console.log(await cli.zRangeWithScores('testZSet', 0, 3)); + + await cli.close(); +} + (async () => { + await testZ(); + + return; + const cli = Redis.createCommandClient({}); await cli.connect(); diff --git a/src/lib/Commands.ts b/src/lib/Commands.ts index be96912..94bc523 100644 --- a/src/lib/Commands.ts +++ b/src/lib/Commands.ts @@ -1627,7 +1627,7 @@ export const COMMANDS: Record = { * @see https://redis.io/commands/sRem */ 'sRem': { - prepare: createDefaultPreparer('SREM') + prepare: (key: string, members: Array) => ({ args: [key, ...members], cmd: 'SREM' }) }, /** @@ -2085,6 +2085,79 @@ export const COMMANDS: Record = { } }, + /** + * Command: zRem + * @see https://redis.io/commands/zRem + */ + 'zRem': { + prepare: (key: string, members: Array) => ({ args: [key, ...members], cmd: 'ZREM' }) + }, + + /** + * Command: zAdd + * @see https://redis.io/commands/zAdd + */ + 'zAdd': { + prepare: createDefaultPreparer('ZADD'), + process: isIntegerOne + }, + + /** + * Command: zRange + * @see https://redis.io/commands/zRange + */ + 'zRangeWithScores': { + prepare: (key: string, start: number, stop: number) => { + + return { + 'cmd': 'ZRANGE', + 'args': [key, start, stop, 'WITHSCORES'] + }; + }, + process: (items: Array<[number, Buffer]>): Array<{ member: string; score: number; }> => { + + const ret: Array<{ member: string; score: number; }> = []; + + for (let i = 0 ; i < items.length; i = i + 2) { + + ret.push({ + 'member': items[i][1].toString(), + 'score': parseFloat(items[i + 1][1].toString()) + }); + } + + return ret; + } + }, + + /** + * Command: zRange + * @see https://redis.io/commands/zRange + */ + 'zRangeWithScores$': { + prepare: (key: string, start: number, stop: number) => { + + return { + 'cmd': 'ZRANGE', + 'args': [key, start, stop, 'WITHSCORES'] + }; + }, + process: (items: Array<[number, Buffer]>): Array<{ member: Buffer; score: number; }> => { + + const ret: Array<{ member: Buffer; score: number; }> = []; + + for (let i = 0 ; i < items.length; i = i + 2) { + + ret.push({ + 'member': items[i][1], + 'score': parseFloat(items[i + 1][1].toString()) + }); + } + + return ret; + } + }, + /** * Command: pfAdd * @see https://redis.io/commands/pfAdd diff --git a/src/lib/Common.ts b/src/lib/Common.ts index 9e7b8b3..03b82a5 100644 --- a/src/lib/Common.ts +++ b/src/lib/Common.ts @@ -1221,6 +1221,30 @@ export interface ICommandAPIs { */ rPushX(key: string, values: Array): Promise; + /** + * Command: zAdd + * @see https://redis.io/commands/zAdd + */ + zAdd(key: string, score: number, member: string | Buffer): Promise; + + /** + * Command: zRem + * @see https://redis.io/commands/zRem + */ + zRem(key: string, members: Array): Promise; + + /** + * Command: zRange + * @see https://redis.io/commands/zRange + */ + zRangeWithScores(key: string, start: number, stop: number): Promise>; + + /** + * Command: zRange + * @see https://redis.io/commands/zRange + */ + zRangeWithScores$(key: string, start: number, stop: number): Promise>; + /** * Command: pfAdd * @see https://redis.io/commands/pfAdd