mm_cachebase 1.4.3 → 1.4.5
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 +264 -0
- package/index.js +44 -21
- package/package.json +5 -5
- package/test.js +16 -6
package/README.md
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# mm_cachebase
|
|
2
|
+
|
|
3
|
+
一个轻量级的本地缓存类库,提供了丰富的缓存操作接口,支持过期时间设置、数组操作等功能。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install mm_cachebase
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 基本使用
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
const CacheBase = require('mm_cachebase');
|
|
15
|
+
|
|
16
|
+
// 创建缓存实例
|
|
17
|
+
const cache = new CacheBase();
|
|
18
|
+
|
|
19
|
+
// 基本操作示例
|
|
20
|
+
async function example() {
|
|
21
|
+
// 设置缓存,过期时间为10秒
|
|
22
|
+
await cache.set("name", "张三", 10);
|
|
23
|
+
|
|
24
|
+
// 获取缓存
|
|
25
|
+
const value = await cache.get("name");
|
|
26
|
+
console.log(value); // 输出: 张三
|
|
27
|
+
|
|
28
|
+
// 删除缓存
|
|
29
|
+
await cache.del("name");
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API 说明
|
|
34
|
+
|
|
35
|
+
### 构造函数
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
const cache = new CacheBase();
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
创建一个新的缓存实例。缓存实例包含以下属性:
|
|
42
|
+
- `list`: 存储缓存数据的数组
|
|
43
|
+
- `func`: 到期通知函数(可选)
|
|
44
|
+
|
|
45
|
+
### 基本操作
|
|
46
|
+
|
|
47
|
+
#### 设置缓存
|
|
48
|
+
```javascript
|
|
49
|
+
await cache.set(key, value, maxAge)
|
|
50
|
+
```
|
|
51
|
+
- `key`: 缓存键名
|
|
52
|
+
- `value`: 缓存的值
|
|
53
|
+
- `maxAge`: 过期时间(秒),-1表示永不过期
|
|
54
|
+
- 返回: 设置的值
|
|
55
|
+
|
|
56
|
+
#### 获取缓存
|
|
57
|
+
```javascript
|
|
58
|
+
await cache.get(key)
|
|
59
|
+
```
|
|
60
|
+
- `key`: 缓存键名
|
|
61
|
+
- 返回: 缓存值,不存在则返回undefined
|
|
62
|
+
|
|
63
|
+
#### 删除缓存
|
|
64
|
+
```javascript
|
|
65
|
+
await cache.del(key)
|
|
66
|
+
```
|
|
67
|
+
- `key`: 缓存键名
|
|
68
|
+
- 返回: 成功返回1,失败返回0
|
|
69
|
+
|
|
70
|
+
#### 添加缓存
|
|
71
|
+
```javascript
|
|
72
|
+
await cache.add(key, value, maxAge)
|
|
73
|
+
```
|
|
74
|
+
- 只在键不存在时添加缓存
|
|
75
|
+
- 返回: 添加成功返回值,已存在返回0
|
|
76
|
+
|
|
77
|
+
#### 判断键是否存在
|
|
78
|
+
```javascript
|
|
79
|
+
await cache.has(key)
|
|
80
|
+
```
|
|
81
|
+
- 返回: 存在返回1,不存在返回0
|
|
82
|
+
|
|
83
|
+
### 过期时间操作
|
|
84
|
+
|
|
85
|
+
#### 设置/查询过期时间
|
|
86
|
+
```javascript
|
|
87
|
+
await cache.ttl(key, maxAge)
|
|
88
|
+
```
|
|
89
|
+
- `maxAge`: 不传则查询剩余时间,传入则设置新的过期时间
|
|
90
|
+
- 返回: 查询时返回剩余秒数,设置时返回1
|
|
91
|
+
|
|
92
|
+
### 数值操作
|
|
93
|
+
|
|
94
|
+
#### 增加整数
|
|
95
|
+
```javascript
|
|
96
|
+
await cache.addInt(key, num)
|
|
97
|
+
```
|
|
98
|
+
- `num`: 要增加的数值,可以为负数
|
|
99
|
+
- 返回: 计算后的结果
|
|
100
|
+
|
|
101
|
+
#### 增加浮点数
|
|
102
|
+
```javascript
|
|
103
|
+
await cache.addFloat(key, num)
|
|
104
|
+
```
|
|
105
|
+
- 用法同addInt,支持浮点数
|
|
106
|
+
|
|
107
|
+
### 字符串操作
|
|
108
|
+
|
|
109
|
+
#### 追加字符串
|
|
110
|
+
```javascript
|
|
111
|
+
await cache.addStr(key, str)
|
|
112
|
+
```
|
|
113
|
+
- 在已有字符串后追加新字符串
|
|
114
|
+
- 返回: 追加后的完整字符串
|
|
115
|
+
|
|
116
|
+
#### 获取子字符串
|
|
117
|
+
```javascript
|
|
118
|
+
await cache.getrange(key, start, end)
|
|
119
|
+
```
|
|
120
|
+
- 获取缓存字符串的指定范围
|
|
121
|
+
- 返回: 截取的字符串
|
|
122
|
+
|
|
123
|
+
#### 替换字符串
|
|
124
|
+
```javascript
|
|
125
|
+
await cache.setrange(key, index, value)
|
|
126
|
+
```
|
|
127
|
+
- 从指定位置替换字符串
|
|
128
|
+
|
|
129
|
+
### 数组操作
|
|
130
|
+
|
|
131
|
+
#### 设置数组
|
|
132
|
+
```javascript
|
|
133
|
+
await cache.list_set(key, value, maxAge)
|
|
134
|
+
```
|
|
135
|
+
- 设置一个数组类型的缓存
|
|
136
|
+
|
|
137
|
+
#### 添加数组元素
|
|
138
|
+
```javascript
|
|
139
|
+
await cache.list_add(key, value)
|
|
140
|
+
```
|
|
141
|
+
- 向数组末尾添加元素
|
|
142
|
+
- 返回: 成功返回1,失败返回-1
|
|
143
|
+
|
|
144
|
+
#### 判断数组元素是否存在
|
|
145
|
+
```javascript
|
|
146
|
+
await cache.list_has(key, value)
|
|
147
|
+
```
|
|
148
|
+
- 检查数组中是否包含指定元素
|
|
149
|
+
|
|
150
|
+
#### 获取数组片段
|
|
151
|
+
```javascript
|
|
152
|
+
await cache.list_get(key, start, end)
|
|
153
|
+
```
|
|
154
|
+
- 获取数组的指定范围元素
|
|
155
|
+
|
|
156
|
+
#### 清空/重置数组
|
|
157
|
+
```javascript
|
|
158
|
+
await cache.list_clear(key, value)
|
|
159
|
+
```
|
|
160
|
+
- 清空数组或用新数组替换
|
|
161
|
+
|
|
162
|
+
### 其他操作
|
|
163
|
+
|
|
164
|
+
#### 排序
|
|
165
|
+
```javascript
|
|
166
|
+
await cache.sort(key, way, obj_key)
|
|
167
|
+
```
|
|
168
|
+
- `way`: 'asc'升序或'desc'降序
|
|
169
|
+
- `obj_key`: 如果数组元素是对象,指定排序的键
|
|
170
|
+
|
|
171
|
+
#### 获取所有键名
|
|
172
|
+
```javascript
|
|
173
|
+
await cache.keys(pattern)
|
|
174
|
+
```
|
|
175
|
+
- `pattern`: 支持*通配符的匹配模式
|
|
176
|
+
- 返回: 匹配的键名数组
|
|
177
|
+
|
|
178
|
+
#### 清空缓存
|
|
179
|
+
```javascript
|
|
180
|
+
await cache.clear(pattern)
|
|
181
|
+
```
|
|
182
|
+
- `pattern`: 可选,支持*通配符,清空匹配的键
|
|
183
|
+
- 不传则清空所有缓存
|
|
184
|
+
|
|
185
|
+
## 使用示例
|
|
186
|
+
|
|
187
|
+
### 基本缓存操作
|
|
188
|
+
```javascript
|
|
189
|
+
const cache = new CacheBase();
|
|
190
|
+
|
|
191
|
+
async function example() {
|
|
192
|
+
// 设置缓存
|
|
193
|
+
await cache.set("user", "张三", 60); // 60秒后过期
|
|
194
|
+
|
|
195
|
+
// 获取缓存
|
|
196
|
+
const user = await cache.get("user");
|
|
197
|
+
console.log(user); // 输出: 张三
|
|
198
|
+
|
|
199
|
+
// 检查是否存在
|
|
200
|
+
const exists = await cache.has("user");
|
|
201
|
+
console.log(exists); // 输出: 1
|
|
202
|
+
|
|
203
|
+
// 删除缓存
|
|
204
|
+
await cache.del("user");
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 数组操作示例
|
|
209
|
+
```javascript
|
|
210
|
+
async function arrayExample() {
|
|
211
|
+
// 设置数组
|
|
212
|
+
await cache.list_set("users", ["张三", "李四"], 300);
|
|
213
|
+
|
|
214
|
+
// 添加元素
|
|
215
|
+
await cache.list_add("users", "王五");
|
|
216
|
+
|
|
217
|
+
// 获取数组
|
|
218
|
+
const users = await cache.list_get("users");
|
|
219
|
+
console.log(users); // 输出: ["张三", "李四", "王五"]
|
|
220
|
+
|
|
221
|
+
// 排序
|
|
222
|
+
await cache.sort("users", "asc");
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 过期时间管理
|
|
227
|
+
```javascript
|
|
228
|
+
async function ttlExample() {
|
|
229
|
+
// 设置缓存
|
|
230
|
+
await cache.set("token", "abc123", 30);
|
|
231
|
+
|
|
232
|
+
// 查询剩余时间
|
|
233
|
+
const ttl = await cache.ttl("token");
|
|
234
|
+
console.log(`剩余${ttl}秒`);
|
|
235
|
+
|
|
236
|
+
// 延长过期时间
|
|
237
|
+
await cache.ttl("token", 60);
|
|
238
|
+
|
|
239
|
+
// 设置永不过期
|
|
240
|
+
await cache.ttl("token", -1);
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 批量操作
|
|
245
|
+
```javascript
|
|
246
|
+
async function batchExample() {
|
|
247
|
+
// 获取所有以user开头的键
|
|
248
|
+
const keys = await cache.keys("user*");
|
|
249
|
+
|
|
250
|
+
// 清空所有以temp开头的缓存
|
|
251
|
+
await cache.clear("temp*");
|
|
252
|
+
|
|
253
|
+
// 清空所有缓存
|
|
254
|
+
await cache.clear();
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## 注意事项
|
|
259
|
+
|
|
260
|
+
1. 所有操作方法都是异步的,需要使用async/await或Promise处理
|
|
261
|
+
2. 过期时间单位为秒,-1表示永不过期
|
|
262
|
+
3. 数组操作方法只能用于数组类型的缓存值
|
|
263
|
+
4. 键名支持*通配符匹配,可用于批量操作
|
|
264
|
+
5. 缓存数据存储在内存中,重启后数据会丢失
|
package/index.js
CHANGED
|
@@ -14,7 +14,7 @@ class CacheBase {
|
|
|
14
14
|
*/
|
|
15
15
|
constructor() {
|
|
16
16
|
// 缓存的字典
|
|
17
|
-
this.
|
|
17
|
+
this.dict = {};
|
|
18
18
|
// 到期通知函数
|
|
19
19
|
this.func;
|
|
20
20
|
/*
|
|
@@ -35,6 +35,22 @@ class CacheBase {
|
|
|
35
35
|
}
|
|
36
36
|
*/
|
|
37
37
|
}
|
|
38
|
+
|
|
39
|
+
get list() {
|
|
40
|
+
var list = [];
|
|
41
|
+
for (var key in this.dict) {
|
|
42
|
+
list.push(this.dict[key]);
|
|
43
|
+
}
|
|
44
|
+
return list;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
set list(lt) {
|
|
48
|
+
this.dict = {};
|
|
49
|
+
for (var i = 0; i < lt.length; i++) {
|
|
50
|
+
var o = lt;
|
|
51
|
+
this.dict[o.name] = o;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
38
54
|
}
|
|
39
55
|
|
|
40
56
|
/**
|
|
@@ -43,11 +59,9 @@ class CacheBase {
|
|
|
43
59
|
* @return {String} 对象
|
|
44
60
|
*/
|
|
45
61
|
CacheBase.prototype.getObj = function(key) {
|
|
46
|
-
var obj = this.
|
|
47
|
-
name: key
|
|
48
|
-
});
|
|
62
|
+
var obj = this.dict[key];
|
|
49
63
|
if (obj && obj.expires) {
|
|
50
|
-
var cha =
|
|
64
|
+
var cha = obj.expires - new Date().stamp();
|
|
51
65
|
if (cha < 1) {
|
|
52
66
|
this.delObj(key);
|
|
53
67
|
obj = undefined;
|
|
@@ -61,9 +75,7 @@ CacheBase.prototype.getObj = function(key) {
|
|
|
61
75
|
* @return {Number} 成功返回1,否则返回0
|
|
62
76
|
*/
|
|
63
77
|
CacheBase.prototype.delObj = function(key) {
|
|
64
|
-
this.
|
|
65
|
-
name: key
|
|
66
|
-
}, true);
|
|
78
|
+
delete this.dict[key];
|
|
67
79
|
return 1;
|
|
68
80
|
};
|
|
69
81
|
|
|
@@ -73,16 +85,16 @@ CacheBase.prototype.delObj = function(key) {
|
|
|
73
85
|
* @return {Number} 成功返回1,否则返回0
|
|
74
86
|
*/
|
|
75
87
|
CacheBase.prototype.addObj = function(obj) {
|
|
76
|
-
obj.id = obj.name.md5();
|
|
88
|
+
// obj.id = obj.name.md5();
|
|
77
89
|
var maxAge = obj.maxAge;
|
|
78
90
|
if (maxAge > 0) {
|
|
79
91
|
// 如果maxAge大于0则设置缓存时长
|
|
80
|
-
obj.expires = new Date().addSeconds(maxAge).
|
|
92
|
+
obj.expires = new Date().addSeconds(maxAge).stamp();
|
|
81
93
|
} else {
|
|
82
94
|
obj.maxAge = -1;
|
|
83
95
|
obj.expires = null;
|
|
84
96
|
}
|
|
85
|
-
this.
|
|
97
|
+
this.dict[obj.name] = obj;
|
|
86
98
|
return 1;
|
|
87
99
|
};
|
|
88
100
|
|
|
@@ -111,7 +123,7 @@ CacheBase.prototype.ttl = async function(key, maxAge) {
|
|
|
111
123
|
} else if (maxAge > 0) {
|
|
112
124
|
// 如果maxAge大于0则设置缓存时长
|
|
113
125
|
obj.maxAge = maxAge;
|
|
114
|
-
obj.expires = new Date().addSeconds(maxAge).
|
|
126
|
+
obj.expires = new Date().addSeconds(maxAge).stamp();
|
|
115
127
|
} else if (maxAge < 0) {
|
|
116
128
|
// 如果maxAge小于0则设置缓存时长为永久
|
|
117
129
|
obj.maxAge = -1;
|
|
@@ -330,19 +342,20 @@ CacheBase.prototype.clear = async function(key) {
|
|
|
330
342
|
var _this = this;
|
|
331
343
|
return new Promise((resolve, reject) => {
|
|
332
344
|
if (key) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
345
|
+
var keys = Object.keys(this.dict);
|
|
346
|
+
for (var i = 0; i < keys.length; i++) {
|
|
347
|
+
var name = keys[i];
|
|
348
|
+
if (name.has(key)) {
|
|
349
|
+
_this.delObj(name);
|
|
336
350
|
}
|
|
337
351
|
}
|
|
338
352
|
} else {
|
|
339
|
-
|
|
340
|
-
_this.delObj(this.list[i].name);
|
|
341
|
-
}
|
|
353
|
+
this.dict = {};
|
|
342
354
|
}
|
|
343
355
|
resolve(1);
|
|
344
356
|
});
|
|
345
357
|
};
|
|
358
|
+
|
|
346
359
|
/**
|
|
347
360
|
* @description 排序
|
|
348
361
|
* @param {String} key 键
|
|
@@ -366,6 +379,7 @@ CacheBase.prototype.sort = async function(key, way, obj_key) {
|
|
|
366
379
|
}
|
|
367
380
|
});
|
|
368
381
|
};
|
|
382
|
+
|
|
369
383
|
/**
|
|
370
384
|
* @description 获取所有键名
|
|
371
385
|
* @param {String} key 键 支持*号, 前面加*表示后面名称一致, 前后加*表示包含名称, 后面加*表示前面名称一致
|
|
@@ -375,13 +389,22 @@ CacheBase.prototype.keys = async function(key) {
|
|
|
375
389
|
var _this = this;
|
|
376
390
|
return new Promise((resolve, reject) => {
|
|
377
391
|
if (key) {
|
|
378
|
-
var
|
|
392
|
+
var keys = Object.keys(this.dict);
|
|
393
|
+
var list = [];
|
|
394
|
+
for (var i = 0; i < keys.length; i++) {
|
|
395
|
+
var name = keys[i];
|
|
396
|
+
if (name.has(key)) {
|
|
397
|
+
list.push(name);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
379
400
|
resolve(list.toArr('name'));
|
|
380
401
|
} else {
|
|
381
|
-
|
|
402
|
+
var keys = Object.keys(this.dict);
|
|
403
|
+
resolve(keys);
|
|
382
404
|
}
|
|
383
405
|
});
|
|
384
406
|
};
|
|
407
|
+
|
|
385
408
|
/**
|
|
386
409
|
* @description 修改数组缓存
|
|
387
410
|
* @param {String} key 键
|
|
@@ -511,4 +534,4 @@ CacheBase.prototype.notity = function(obj) {
|
|
|
511
534
|
};
|
|
512
535
|
|
|
513
536
|
// 导出CacheBase函数
|
|
514
|
-
module.exports = CacheBase;
|
|
537
|
+
module.exports = CacheBase;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mm_cachebase",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.5",
|
|
4
4
|
"description": "这是超级美眉cachebase帮助函数模块,一个简单的内存缓存",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "git+https://
|
|
11
|
+
"url": "git+https://gitee.com/qiuwenwu91/mm_cachebase.git"
|
|
12
12
|
},
|
|
13
13
|
"keywords": [
|
|
14
14
|
"cachebase",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"author": "邱文武",
|
|
27
27
|
"license": "ISC",
|
|
28
28
|
"bugs": {
|
|
29
|
-
"url": "https://
|
|
29
|
+
"url": "https://gitee.com/qiuwenwu91/mm_cachebase/issues"
|
|
30
30
|
},
|
|
31
|
-
"homepage": "https://
|
|
31
|
+
"homepage": "https://gitee.com/qiuwenwu91/mm_cachebase#readme",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"mm_expand": "^1.
|
|
33
|
+
"mm_expand": "^1.8.3"
|
|
34
34
|
}
|
|
35
35
|
}
|
package/test.js
CHANGED
|
@@ -10,6 +10,12 @@ async function test() {
|
|
|
10
10
|
// await cache.set("d", "十五", 10);
|
|
11
11
|
// bl = await cache.set("age1", 10, 10);
|
|
12
12
|
bl = await cache.set("age", 13, 10);
|
|
13
|
+
setTimeout(async () => {
|
|
14
|
+
console.log(await cache.get("age"));
|
|
15
|
+
}, 9000);
|
|
16
|
+
setTimeout(async () => {
|
|
17
|
+
console.log(await cache.get("age"));
|
|
18
|
+
}, 10000);
|
|
13
19
|
// bl = await cache.addInt("age", -12);
|
|
14
20
|
// bl = await cache.add("age", 15, 5);
|
|
15
21
|
// console.log(bl);
|
|
@@ -26,18 +32,21 @@ async function test() {
|
|
|
26
32
|
|
|
27
33
|
// msg = await cache.setrange("a", 4, "asd");
|
|
28
34
|
// console.log(msg);
|
|
29
|
-
var
|
|
30
|
-
|
|
35
|
+
var str = await cache.addStr("a", "丰");
|
|
36
|
+
console.log("追加文本" + str);
|
|
31
37
|
// var bl = await cache.has("a");
|
|
32
38
|
// console.log("是否存在" + bl);
|
|
33
39
|
|
|
34
40
|
var num = await cache.add("arr", ['第三', '第四'], 8);
|
|
35
41
|
bl = await cache.list_clear("arr", ['第三', '第四', '第w']); // 清空数组,并重新增加成员
|
|
36
|
-
|
|
42
|
+
console.log("清空数组" + bl);
|
|
37
43
|
//
|
|
38
44
|
// num = await cache.list_set("arr", ['第一', '第三', '第二'], 8);
|
|
39
45
|
num = await cache.list_add("arr", '第s');
|
|
40
46
|
console.log("设置数组" + num);
|
|
47
|
+
var arr = await cache.list_get("arr", 0);
|
|
48
|
+
console.log("查到数组", arr)
|
|
49
|
+
|
|
41
50
|
// time = await cache.ttl("arr");
|
|
42
51
|
// console.log(time);
|
|
43
52
|
// bl = await cache.ttl("arr", -1);
|
|
@@ -46,7 +55,7 @@ async function test() {
|
|
|
46
55
|
// console.log(time);
|
|
47
56
|
|
|
48
57
|
var bl = await cache.list_has("arr", '第一');
|
|
49
|
-
console.log(bl);
|
|
58
|
+
console.log("包含", bl);
|
|
50
59
|
// await cache.sort("arr", 'asc');
|
|
51
60
|
// var ar = await cache.list_get("arr", 2);
|
|
52
61
|
// console.log(ar);
|
|
@@ -57,12 +66,13 @@ async function test() {
|
|
|
57
66
|
// ret = await cache.clear(); // 清空缓存
|
|
58
67
|
// console.log(ret);
|
|
59
68
|
var ret = await cache.getrange("a", 2, 3);
|
|
60
|
-
console.log(ret);
|
|
69
|
+
console.log("这是?", ret);
|
|
61
70
|
// var arr = await cache.keys("a*");
|
|
62
71
|
// console.log(arr);
|
|
63
72
|
// ret = await cache.clear('a*'); // 清空缓存
|
|
64
73
|
// console.log(ret);
|
|
65
|
-
console.log(cache.
|
|
74
|
+
console.log("存储的数据字典", cache.dict);
|
|
75
|
+
console.log("存储的数据列表", cache.list);
|
|
66
76
|
// cache.dispose() // 销毁资源
|
|
67
77
|
}
|
|
68
78
|
test();
|