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.
Files changed (4) hide show
  1. package/README.md +264 -0
  2. package/index.js +44 -21
  3. package/package.json +5 -5
  4. 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.list = [];
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.list.getObj({
47
- name: key
48
- });
62
+ var obj = this.dict[key];
49
63
  if (obj && obj.expires) {
50
- var cha = Date.parse(obj.expires) - Date.parse(new Date());
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.list.del({
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).toUTCString();
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.list.push(obj);
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).toUTCString();
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
- for (var i = this.list.length - 1; i >= 0; i--) {
334
- if (this.list[i].name.has(key)) {
335
- _this.delObj(this.list[i].name);
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
- for (var i = this.list.length - 1; i >= 0; i--) {
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 list = _this.list.search(key, 'name');
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
- resolve(_this.list.toArr('name'));
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",
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://github.com/qiuwenwu/mm_cachebase.git"
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://github.com/qiuwenwu/mm_cachebase/issues"
29
+ "url": "https://gitee.com/qiuwenwu91/mm_cachebase/issues"
30
30
  },
31
- "homepage": "https://github.com/qiuwenwu/mm_cachebase#readme",
31
+ "homepage": "https://gitee.com/qiuwenwu91/mm_cachebase#readme",
32
32
  "dependencies": {
33
- "mm_expand": "^1.7.2"
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 len = await cache.addStr("a", "丰");
30
- // console.log("追加文本" + len);
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
- // console.log("清空数组" + bl);
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.list);
74
+ console.log("存储的数据字典", cache.dict);
75
+ console.log("存储的数据列表", cache.list);
66
76
  // cache.dispose() // 销毁资源
67
77
  }
68
78
  test();