@keyv/redis 2.6.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +35 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -67,6 +67,33 @@ const redis = new Redis.Cluster('redis://user:pass@localhost:6379');
|
|
|
67
67
|
const keyvRedis = new KeyvRedis(redis);
|
|
68
68
|
const keyv = new Keyv({ store: keyvRedis });
|
|
69
69
|
```
|
|
70
|
+
## Options
|
|
71
|
+
|
|
72
|
+
### useRedisSets
|
|
73
|
+
|
|
74
|
+
The `useRedisSets` option lets you decide whether to use Redis sets for key management. By default, this option is set to `true`.
|
|
75
|
+
|
|
76
|
+
When `useRedisSets` is enabled (`true`):
|
|
77
|
+
|
|
78
|
+
- A namespace for the Redis sets is created, and all created keys are added to this. This allows for group management of keys.
|
|
79
|
+
- When a key is deleted, it's removed not only from the main storage but also from the Redis set.
|
|
80
|
+
- When clearing all keys (using the `clear` function), all keys in the Redis set are looked up for deletion. The set itself is also deleted.
|
|
81
|
+
|
|
82
|
+
**Note**: In high-performance scenarios, enabling `useRedisSets` might lead to memory leaks. If you're running a high-performance application or service, it is recommended to set `useRedisSets` to `false`.
|
|
83
|
+
|
|
84
|
+
If you decide to set `useRedisSets` as `false`, keys will be handled individually and Redis sets won't be utilized.
|
|
85
|
+
|
|
86
|
+
However, please note that setting `useRedisSets` to `false` could lead to performance issues in production when using the `clear` function, as it will need to iterate over all keys to delete them.
|
|
87
|
+
|
|
88
|
+
#### Example
|
|
89
|
+
|
|
90
|
+
Here's how you can use the `useRedisSets` option:
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
const Keyv = require('keyv');
|
|
94
|
+
|
|
95
|
+
const keyv = new Keyv('redis://user:pass@localhost:6379', { useRedisSets: false });
|
|
96
|
+
|
|
70
97
|
|
|
71
98
|
## License
|
|
72
99
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import EventEmitter from 'events';
|
|
3
|
-
import { type ClearOutput, type
|
|
3
|
+
import { type ClearOutput, type DeleteOutput, type DisconnectOutput, type GetManyOutput, type GetOutput, type HasOutput, type IteratorOutput, type KeyvRedisOptions, type KeyvUriOptions, type SetOutput } from './types';
|
|
4
4
|
declare class KeyvRedis<Value = any> extends EventEmitter {
|
|
5
5
|
ttlSupport: boolean;
|
|
6
6
|
namespace?: string;
|
|
@@ -8,11 +8,12 @@ declare class KeyvRedis<Value = any> extends EventEmitter {
|
|
|
8
8
|
redis: any;
|
|
9
9
|
constructor(uri: KeyvRedisOptions | KeyvUriOptions, options?: KeyvRedisOptions);
|
|
10
10
|
_getNamespace(): string;
|
|
11
|
+
_getKeyName: (key: string) => string;
|
|
11
12
|
get(key: string): GetOutput<Value>;
|
|
12
13
|
getMany(keys: string[]): GetManyOutput<Value>;
|
|
13
14
|
set(key: string, value: Value, ttl?: number): SetOutput;
|
|
14
15
|
delete(key: string): DeleteOutput;
|
|
15
|
-
deleteMany(
|
|
16
|
+
deleteMany(keys: string[]): DeleteOutput;
|
|
16
17
|
clear(): ClearOutput;
|
|
17
18
|
iterator(namespace?: string): IteratorOutput;
|
|
18
19
|
has(key: string): HasOutput;
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,14 @@ class KeyvRedis extends events_1.default {
|
|
|
8
8
|
constructor(uri, options) {
|
|
9
9
|
super();
|
|
10
10
|
this.ttlSupport = true;
|
|
11
|
+
this._getKeyName = (key) => {
|
|
12
|
+
if (!this.opts.useRedisSets) {
|
|
13
|
+
return `sets:${key}`;
|
|
14
|
+
}
|
|
15
|
+
return key;
|
|
16
|
+
};
|
|
11
17
|
this.opts = {};
|
|
18
|
+
this.opts.useRedisSets = true;
|
|
12
19
|
this.opts.dialect = 'redis';
|
|
13
20
|
if (typeof uri !== 'string' && uri.options && ('family' in uri.options || uri.isCluster)) {
|
|
14
21
|
this.redis = uri;
|
|
@@ -17,6 +24,9 @@ class KeyvRedis extends events_1.default {
|
|
|
17
24
|
options = { ...(typeof uri === 'string' ? { uri } : uri), ...options };
|
|
18
25
|
// @ts-expect-error - uri is a string or RedisOptions
|
|
19
26
|
this.redis = new ioredis_1.default(options.uri, options);
|
|
27
|
+
if (options.useRedisSets === false) {
|
|
28
|
+
this.opts.useRedisSets = false;
|
|
29
|
+
}
|
|
20
30
|
}
|
|
21
31
|
this.redis.on('error', (error) => this.emit('error', error));
|
|
22
32
|
}
|
|
@@ -24,6 +34,7 @@ class KeyvRedis extends events_1.default {
|
|
|
24
34
|
return `namespace:${this.namespace}`;
|
|
25
35
|
}
|
|
26
36
|
async get(key) {
|
|
37
|
+
key = this._getKeyName(key);
|
|
27
38
|
const value = await this.redis.get(key);
|
|
28
39
|
if (value === null) {
|
|
29
40
|
return undefined;
|
|
@@ -31,32 +42,48 @@ class KeyvRedis extends events_1.default {
|
|
|
31
42
|
return value;
|
|
32
43
|
}
|
|
33
44
|
async getMany(keys) {
|
|
34
|
-
|
|
35
|
-
return
|
|
45
|
+
keys = keys.map(this._getKeyName);
|
|
46
|
+
return this.redis.mget(keys);
|
|
36
47
|
}
|
|
37
48
|
async set(key, value, ttl) {
|
|
38
49
|
if (value === undefined) {
|
|
39
50
|
return undefined;
|
|
40
51
|
}
|
|
52
|
+
key = this._getKeyName(key);
|
|
41
53
|
if (typeof ttl === 'number') {
|
|
42
54
|
await this.redis.set(key, value, 'PX', ttl);
|
|
43
55
|
}
|
|
44
56
|
else {
|
|
45
57
|
await this.redis.set(key, value);
|
|
46
58
|
}
|
|
47
|
-
|
|
59
|
+
if (this.opts.useRedisSets) {
|
|
60
|
+
await this.redis.sadd(this._getNamespace(), key);
|
|
61
|
+
}
|
|
48
62
|
}
|
|
49
63
|
async delete(key) {
|
|
64
|
+
key = this._getKeyName(key);
|
|
50
65
|
const items = await this.redis.del(key);
|
|
51
|
-
|
|
66
|
+
if (this.opts.useRedisSets) {
|
|
67
|
+
await this.redis.srem(this._getNamespace(), key);
|
|
68
|
+
}
|
|
52
69
|
return items > 0;
|
|
53
70
|
}
|
|
54
|
-
async deleteMany(
|
|
55
|
-
|
|
71
|
+
async deleteMany(keys) {
|
|
72
|
+
const deletePromises = keys.map(async (key) => this.delete(key));
|
|
73
|
+
const results = await Promise.allSettled(deletePromises);
|
|
74
|
+
// @ts-expect-error - results is an array of objects with status and value
|
|
75
|
+
return results.every(result => result.value);
|
|
56
76
|
}
|
|
57
77
|
async clear() {
|
|
58
|
-
|
|
59
|
-
|
|
78
|
+
if (this.opts.useRedisSets) {
|
|
79
|
+
const keys = await this.redis.smembers(this._getNamespace());
|
|
80
|
+
await this.redis.del([...keys, this._getNamespace()]);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const pattern = 'sets:*';
|
|
84
|
+
const keys = await this.redis.keys(pattern);
|
|
85
|
+
await this.redis.del(keys);
|
|
86
|
+
}
|
|
60
87
|
}
|
|
61
88
|
async *iterator(namespace) {
|
|
62
89
|
const scan = this.redis.scan.bind(this.redis);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAAkC;AAClC,sDAA4B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keyv/redis",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"description": "Redis storage adapter for Keyv",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"@typescript-eslint/no-unsafe-assignment": 0,
|
|
22
22
|
"@typescript-eslint/no-unsafe-return": 0,
|
|
23
23
|
"unicorn/prefer-ternary": 0,
|
|
24
|
+
"unicorn/no-array-callback-reference": 0,
|
|
24
25
|
"ava/no-ignored-test-files": [
|
|
25
26
|
"error",
|
|
26
27
|
{
|
|
@@ -68,7 +69,6 @@
|
|
|
68
69
|
},
|
|
69
70
|
"devDependencies": {
|
|
70
71
|
"@keyv/test-suite": "*",
|
|
71
|
-
"delay": "^6.0.0",
|
|
72
72
|
"keyv": "*",
|
|
73
73
|
"requirable": "^1.0.5",
|
|
74
74
|
"timekeeper": "^2.2.0",
|