{"version":3,"sources":["../src/store/memory_cache.ts","../src/store/memory.ts","../src/store/redis.ts","../src/index.ts"],"names":["messages","MemoryCache","EventEmitter","databases","Map","options","currentDBIndex","connected","lastSave","multiMode","cache","responseMessages","ttlCheckTimer","lock","database","maxKeys","evictionPolicy","ttlCheckInterval","maxAge","Date","now","AsyncLock","has","set","createLRUCache","get","startTTLCheck","LRUCache","max","ttl","updateAgeOnGet","dispose","value","key","reason","emit","onInsert","clearInterval","setInterval","cleanExpiredKeys","_dbIndex","keysToDelete","forEach","item","timeout","push","delete","stopTTLCheck","cleanup","clear","removeAllListeners","createClient","discard","quit","end","info","stats","size","currentDB","keys","length","hits","misses","memory","getMemoryUsage","dump","totalSize","JSON","stringify","echo","message","callback","_handleCallback","ping","auth","password","select","dbIndex","isNumber","retVal","_hasKey","_testType","_getKey","params","flatten","_retrieveCallback","pttl","notexist","onlyexist","param","shift","toString","toLowerCase","parseInt","isNaN","isNil","_makeKey","Math","floor","expire","seconds","del","itr","exists","incr","lockKey","acquire","_addToKey","err","incrby","amount","decr","decrby","hset","field","_hasField","_setField","hashObj","_fieldTTL","persist","hget","hdel","hexists","fields","hlen","hkeys","hincrby","_addToField","hgetall","retVals","Object","entries","filter","k","reduce","acc","v","hvals","map","llen","rpush","lpush","list","unshift","_setKey","lindex","index","lpop","rpop","pop","lrange","start","stop","sadd","members","val","nval","union","newlength","scard","sismember","member","includes","smembers","spop","count","keysLength","randomNum","random","srem","hasOwnProperty","idx","indexOf","splice","smove","sourcekey","destkey","silent","_callback","_key","type","lastAccess","keyValue","throwError","keyType","useFloat","fieldValue","_getField","parseFloat","ky","error","nolog","msg","_logReturn","Error","isUndefined","Array","isArray","append","existingValue","newValue","strlen","getrange","substring","setrange","offset","padEnd","mget","mset","keyValuePairs","replace","i","pattern","_item","matchPattern","regexPattern","regex","RegExp","test","randomkey","randomIndex","rename","oldKey","newKey","renamenx","flushdb","flushall","dbsize","zadd","score","zset","existing","find","sort","a","b","zscore","zrange","slice","zcard","zrem","findIndex","MemoryStore","client","db","maxMemory","getConnection","close","release","_conn","Promise","resolve","defineCommand","_name","_scripts","unsupported","getCompare","name","keyPrefix","getStats","beginTransaction","commit","rollback","RedisStore","pool","reconnectAttempts","maxReconnectAttempts","reconnectDelay","parseOpt","opt","host","port","username","poolSize","connectTimeout","hosts","h","isEmpty","p","toNumber","sentinels","sentinelUsername","sentinelPassword","clusters","connect","connNum","status","defer","getDefer","connection","Cluster","redisOptions","enableOfflineQueue","retryDelayOnFailover","Redis","lazyConnect","on","logger","scheduleReconnect","reject","Warn","Info","promise","delay","pow","setTimeout","catch","factory","create","destroy","resource","disconnect","validate","genericPool","createPool","min","acquireTimeoutMillis","testOnBorrow","evictionRunIntervalMillis","idleTimeoutMillis","softIdleTimeoutMillis","drain","conn","isBorrowedResource","scripts","numberOfKeys","lua","defaultOptions","CacheStore","instances","getInstance","instanceKey","configHash","generateConfigHash","fullKey","instance","configStr","hash","char","charCodeAt","abs","clearInstance","keysToRemove","from","startsWith","clearAllInstances","promises","values","all","getRawClient","wrap","data","res","join","stack","releaseErr","increment","decrement","result","source","destination"],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-12-02 11:03:20\n * @LastEditTime: 2023-12-20 19:04:29\n */\nimport { flatten, isNil, isUndefined, union } from \"lodash\";\nimport * as Helper from \"koatty_lib\";\nimport { EventEmitter } from \"events\";\nimport { LRUCache } from \"lru-cache\";\nimport AsyncLock from \"async-lock\";\n\nexport type CallbackFunction<T = any> = (err: Error | null, result?: T) => void;\n\n/**\n * 缓存项接口\n */\ninterface _CacheItem {\n  value: any;\n  type: string;\n  timeout?: number;\n  lastAccess: number;\n}\n\n/**\n *\n *\n * @enum {number}\n */\nexport enum messages {\n  ok = 'OK',\n  queued = 'QUEUED',\n  pong = 'PONG',\n  noint = 'ERR value is not an integer or out of range',\n  nofloat = 'ERR value is not an float or out of range',\n  nokey = 'ERR no such key',\n  nomultiinmulti = 'ERR MULTI calls can not be nested',\n  nomultiexec = 'ERR EXEC without MULTI',\n  nomultidiscard = 'ERR DISCARD without MULTI',\n  busykey = 'ERR target key name is busy',\n  syntax = 'ERR syntax error',\n  unsupported = 'MemoryCache does not support that operation',\n  wrongTypeOp = 'WRONGTYPE Operation against a key holding the wrong kind of value',\n  wrongPayload = 'DUMP payload version or checksum are wrong',\n  wrongArgCount = 'ERR wrong number of arguments for \\'%0\\' command',\n  bitopnotWrongCount = 'ERR BITOP NOT must be called with a single source key',\n  indexOutOfRange = 'ERR index out of range',\n  invalidLexRange = 'ERR min or max not valid string range item',\n  invalidDBIndex = 'ERR invalid DB index',\n  invalidDBIndexNX = 'ERR invalid DB index, \\'%0\\' does not exist',\n  mutuallyExclusiveNXXX = 'ERR XX and NX options at the same time are not compatible'\n}\n\n/**\n *\n *\n * @interface MemoryCacheOptions\n */\ninterface MemoryCacheOptions {\n  database: number;\n  maxKeys?: number; // 最大键数量，用于LRU\n  maxMemory?: number; // 最大内存使用（字节）\n  evictionPolicy?: 'lru' | 'lfu' | 'random'; // 淘汰策略\n  ttlCheckInterval?: number; // TTL检查间隔（毫秒）\n  maxAge?: number; // 默认过期时间（毫秒）\n}\n\nexport class MemoryCache extends EventEmitter {\n  private databases: Map<number, any> = new Map();\n  options: MemoryCacheOptions;\n  currentDBIndex: number;\n  connected: boolean;\n  lastSave: number;\n  multiMode: boolean;\n  private cache: any;\n  private responseMessages: any[];\n  private ttlCheckTimer: NodeJS.Timeout | null = null;\n  private lock: AsyncLock;\n\n  /**\n   * Creates an instance of MemoryCache.\n   * @param {MemoryCacheOptions} options\n   * @memberof MemoryCache\n   */\n  constructor(options: MemoryCacheOptions) {\n    super();\n    this.options = { \n      database: 0, \n      maxKeys: 1000,\n      evictionPolicy: 'lru',\n      ttlCheckInterval: 60000, // 1分钟检查一次过期键\n      maxAge: 1000 * 60 * 60, // 默认1小时过期\n      ...options \n    };\n    this.currentDBIndex = options.database || 0;\n    this.connected = false;\n    this.lastSave = Date.now();\n    this.multiMode = false;\n    this.responseMessages = [];\n    this.lock = new AsyncLock();\n    \n    // 初始化数据库和缓存\n    if (!this.databases.has(this.currentDBIndex)) {\n      this.databases.set(this.currentDBIndex, this.createLRUCache());\n    }\n    this.cache = this.databases.get(this.currentDBIndex)!;\n    \n    // 启动TTL检查定时器\n    this.startTTLCheck();\n  }\n\n  /**\n   * 创建LRU缓存实例\n   */\n  private createLRUCache(): any {\n    return new LRUCache({\n      max: this.options.maxKeys || 1000,\n      ttl: this.options.maxAge || 1000 * 60 * 60, // 1小时默认\n      updateAgeOnGet: true, // 访问时更新age\n      dispose: (value: any, key: any, reason: string) => {\n        // 键被淘汰时的回调 - 直接使用lru-cache的事件机制\n        this.emit('evict', key, value, reason);\n      },\n      onInsert: (value: any, key: any) => {\n        // 键被插入时的回调\n        this.emit('insert', key, value);\n      }\n    });\n  }\n\n  /**\n   * 启动TTL检查定时器\n   */\n  private startTTLCheck(): void {\n    if (this.ttlCheckTimer) {\n      clearInterval(this.ttlCheckTimer);\n    }\n    \n    this.ttlCheckTimer = setInterval(() => {\n      this.cleanExpiredKeys();\n    }, this.options.ttlCheckInterval || 60000);\n  }\n\n  /**\n   * 清理过期键\n   */\n  private cleanExpiredKeys(): void {\n    for (const [_dbIndex, cache] of this.databases) {\n      const keysToDelete: string[] = [];\n      \n      cache.forEach((item: any, key: any) => {\n        if (item.timeout && item.timeout <= Date.now()) {\n          keysToDelete.push(key);\n        }\n      });\n      \n      keysToDelete.forEach(key => {\n        cache.delete(key);\n        this.emit('expire', key);\n      });\n    }\n  }\n\n  /**\n   * 停止TTL检查\n   */\n  private stopTTLCheck(): void {\n    if (this.ttlCheckTimer) {\n      clearInterval(this.ttlCheckTimer);\n      this.ttlCheckTimer = null;\n    }\n  }\n\n  /**\n   * 清理所有资源\n   * @private\n   */\n  private cleanup(): void {\n    this.stopTTLCheck();\n    this.databases.clear();\n    this.removeAllListeners();\n  }\n\n  /**\n   *\n   *\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  createClient() {\n    if (!this.databases.has(this.options.database)) {\n      this.databases.set(this.options.database, this.createLRUCache());\n    }\n    this.cache = this.databases.get(this.options.database)!;\n    this.connected = true;\n    // exit multi mode if we are in it\n    this.discard(null, true);\n    this.emit('connect');\n    this.emit('ready');\n    return this;\n  }\n\n  /**\n   *\n   *\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  quit() {\n    this.cleanup(); // 调用清理方法\n    this.connected = false;\n    // exit multi mode if we are in it\n    this.discard(null, true);\n    this.emit('end');\n    return this;\n  }\n\n  /**\n   *\n   *\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  end() {\n    return this.quit();\n  }\n\n  /**\n   * 获取缓存统计信息\n   */\n  info(): any {\n    const stats = {\n      databases: this.databases.size,\n      currentDB: this.currentDBIndex,\n      keys: this.cache ? this.cache.length : 0,\n      maxKeys: this.options.maxKeys,\n      hits: 0,\n      misses: 0,\n      memory: this.getMemoryUsage()\n    };\n    \n    // 如果缓存支持统计信息\n    if (this.cache && typeof this.cache.dump === 'function') {\n      const dump = this.cache.dump();\n      stats.keys = dump.length;\n    }\n    \n    return stats;\n  }\n\n  /**\n   * 估算内存使用量\n   */\n  private getMemoryUsage(): number {\n    let totalSize = 0;\n    \n    for (const [, cache] of this.databases) {\n      cache.forEach((item: any, key: any) => {\n        // 粗略估算：key长度 + JSON序列化后的大小\n        totalSize += key.length * 2; // Unicode字符占2字节\n        totalSize += JSON.stringify(item).length * 2;\n      });\n    }\n    \n    return totalSize;\n  }\n\n  /**\n   *\n   *\n   * @param {string} message\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  echo(message: string, callback?: CallbackFunction) {\n    return this._handleCallback(callback, message);\n  }\n\n  /**\n   *\n   *\n   * @param {string} message\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  ping(message: string, callback?: CallbackFunction) {\n    message = message || messages.pong;\n    return this._handleCallback(callback, message);\n  }\n\n  /**\n   *\n   *\n   * @param {string} password\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  auth(password: string, callback?: CallbackFunction) {\n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   *\n   *\n   * @param {number} dbIndex\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  select(dbIndex: number, callback?: CallbackFunction) {\n    if (!Helper.isNumber(dbIndex)) {\n      return this._handleCallback(callback, null, messages.invalidDBIndex);\n    }\n    if (!this.databases.has(dbIndex)) {\n      this.databases.set(dbIndex, this.createLRUCache());\n    }\n    this.multiMode = false;\n    this.currentDBIndex = dbIndex;\n    this.cache = this.databases.get(dbIndex)!;\n\n    return this._handleCallback(callback, messages.ok);\n  }\n\n  // ---------------------------------------\n  // Keys\n  // ---------------------------------------\n  get(key: string, callback?: CallbackFunction) {\n    let retVal = null;\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      retVal = this._getKey(key);\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * set(key, value, ttl, pttl, notexist, onlyexist, callback)\n   *\n   * @param {string} key\n   * @param {(string | number)} value\n   * @param {...any[]} params\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  set(key: string, value: string | number, ...params: any[]) {\n    const retVal: string | number = null;\n    params = flatten(params);\n    const callback = this._retrieveCallback(params);\n    let ttl, pttl, notexist, onlyexist;\n    // parse parameters\n    while (params.length > 0) {\n      const param = params.shift();\n      switch (param.toString().toLowerCase()) {\n        case 'nx':\n          notexist = true;\n          break;\n        case 'xx':\n          onlyexist = true;\n          break;\n        case 'ex':\n          if (params.length === 0) {\n            return this._handleCallback(callback, null, messages.syntax);\n          }\n          ttl = parseInt(params.shift());\n          if (isNaN(ttl)) {\n            return this._handleCallback(callback, null, messages.noint);\n          }\n          break;\n        case 'px':\n          if (params.length === 0) {\n            return this._handleCallback(callback, null, messages.syntax);\n          }\n          pttl = parseInt(params.shift());\n          if (isNaN(pttl)) {\n            return this._handleCallback(callback, null, messages.noint);\n          }\n          break;\n        default:\n          return this._handleCallback(callback, null, messages.syntax);\n      }\n    }\n\n    if (!isNil(ttl) && !isNil(pttl)) {\n      return this._handleCallback(callback, null, messages.syntax);\n    }\n\n    if (notexist && onlyexist) {\n      return this._handleCallback(callback, null, messages.syntax);\n    }\n\n    pttl = pttl || ttl * 1000 || null;\n    if (!isNil(pttl)) {\n      pttl = Date.now() + pttl;\n    }\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      if (notexist) {\n        return this._handleCallback(callback, retVal);\n      }\n    } else if (onlyexist) {\n      return this._handleCallback(callback, retVal);\n    }\n    this.cache.set(key, this._makeKey(value.toString(), 'string', pttl));\n\n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  ttl(key: string, callback?: CallbackFunction) {\n    let retVal = this.pttl(key);\n    if (retVal >= 0 || retVal <= -3) {\n      retVal = Math.floor(retVal / 1000);\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {number} seconds\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  expire(key: string, seconds: number, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      const pttl = seconds * 1000;\n      this.cache.set(key, { ...this.cache.get(key)!, timeout: Date.now() + pttl });\n      retVal = 1;\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {...any[]} keys\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  del(...keys: any[]) {\n    let retVal = 0;\n    const callback = this._retrieveCallback(keys);\n    // Flatten the array in case an array was passed\n    keys = flatten(keys);\n\n    for (let itr = 0; itr < keys.length; itr++) {\n      const key = keys[itr];\n      if (this._hasKey(key)) {\n        this.cache.delete(key);\n        retVal++;\n      }\n    }\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {...any[]} keys\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  exists(...keys: any[]) {\n    let retVal = 0;\n    const callback = this._retrieveCallback(keys);\n\n    for (let itr = 0; itr < keys.length; itr++) {\n      const key = keys[itr];\n      if (this._hasKey(key)) {\n        retVal++;\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  incr(key: string, callback?: CallbackFunction) {\n    // 使用锁保护原子操作\n    const lockKey = `incr:${key}`;\n    return this.lock.acquire(lockKey, () => {\n      let retVal = null;\n      try {\n        retVal = this._addToKey(key, 1);\n      } catch (err) {\n        return this._handleCallback(callback, null, err);\n      }\n      return this._handleCallback(callback, retVal);\n    });\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {number} amount\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  incrby(key: string, amount: number, callback?: CallbackFunction) {\n    // 使用锁保护原子操作\n    const lockKey = `incrby:${key}`;\n    return this.lock.acquire(lockKey, () => {\n      let retVal = null;\n      try {\n        retVal = this._addToKey(key, amount);\n      } catch (err) {\n        return this._handleCallback(callback, null, err);\n      }\n      return this._handleCallback(callback, retVal);\n    });\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  decr(key: string, callback?: CallbackFunction) {\n    // 使用锁保护原子操作\n    const lockKey = `decr:${key}`;\n    return this.lock.acquire(lockKey, () => {\n      let retVal = null;\n      try {\n        retVal = this._addToKey(key, -1);\n      } catch (err) {\n        return this._handleCallback(callback, null, err);\n      }\n      return this._handleCallback(callback, retVal);\n    });\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {number} amount\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  decrby(key: string, amount: number, callback?: CallbackFunction) {\n    // 使用锁保护原子操作\n    const lockKey = `decrby:${key}`;\n    return this.lock.acquire(lockKey, () => {\n      let retVal = null;\n      try {\n        retVal = this._addToKey(key, 0 - amount);\n      } catch (err) {\n        return this._handleCallback(callback, null, err);\n      }\n      return this._handleCallback(callback, retVal);\n    });\n  }\n\n  // ---------------------------------------\n  // ## Hash ##\n  // ---------------------------------------\n  hset(key: string, field: string, value: string | number, timeout?: number, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n    } else {\n      this.cache.set(key, this._makeKey({}, 'hash'));\n    }\n\n    if (!this._hasField(key, field)) {\n      retVal = 1;\n    }\n\n    this._setField(key, field, value.toString());\n    \n    // 如果指定了 timeout，存储字段级别的过期时间\n    if (typeof timeout === 'number') {\n      const hashObj = this.cache.get(key)!.value;\n      if (!hashObj._fieldTTL) {\n        hashObj._fieldTTL = {};\n      }\n      hashObj._fieldTTL[field] = Date.now() + (timeout * 1000);\n    }\n    \n    this.persist(key);\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {string} field\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hget(key: string, field: string, callback?: CallbackFunction) {\n    let retVal = null;\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      \n      // 检查字段级别的过期时间\n      const hashObj = this._getKey(key);\n      if (hashObj && hashObj._fieldTTL && hashObj._fieldTTL[field]) {\n        if (hashObj._fieldTTL[field] <= Date.now()) {\n          // 过期，删除字段\n          this.hdel(key, field);\n          return this._handleCallback(callback, null);\n        }\n      }\n      \n      if (this._hasField(key, field)) {\n        retVal = hashObj[field];\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {string} field\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hexists(key: string, field: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      \n      // 检查字段级别的过期时间\n      const hashObj = this._getKey(key);\n      if (hashObj && hashObj._fieldTTL && hashObj._fieldTTL[field]) {\n        if (hashObj._fieldTTL[field] <= Date.now()) {\n          // 过期，删除字段\n          this.hdel(key, field);\n          return this._handleCallback(callback, 0);\n        }\n      }\n      \n      if (this._hasField(key, field)) {\n        retVal = 1;\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {...any[]} fields\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hdel(key: string, ...fields: any[]) {\n    let retVal = 0;\n    const callback = this._retrieveCallback(fields);\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      const hashObj = this.cache.get(key)!.value;\n      for (let itr = 0; itr < fields.length; itr++) {\n        const field = fields[itr];\n        if (this._hasField(key, field)) {\n          delete hashObj[field];\n          // 清理过期时间记录\n          if (hashObj._fieldTTL && hashObj._fieldTTL[field]) {\n            delete hashObj._fieldTTL[field];\n          }\n          retVal++;\n        }\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hlen(key: string, callback?: CallbackFunction) {\n    const retVal = this.hkeys(key).length;\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {string} field\n   * @param {*} value\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hincrby(key: string, field: string, value: any, callback?: CallbackFunction) {\n    // 使用锁保护原子操作，使用组合 key\n    const lockKey = `hincrby:${key}:${field}`;\n    return this.lock.acquire(lockKey, () => {\n      let retVal;\n      try {\n        retVal = this._addToField(key, field, value, false);\n      } catch (err) {\n        return this._handleCallback(callback, null, err);\n      }\n      return this._handleCallback(callback, retVal);\n    });\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hgetall(key: string, callback?: CallbackFunction) {\n    let retVals = {};\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      const hashObj = this._getKey(key);\n      // 排除内部属性 _fieldTTL\n      retVals = Object.entries(hashObj)\n        .filter(([k]) => k !== '_fieldTTL')\n        .reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {});\n    }\n    return this._handleCallback(callback, retVals);\n  }\n\n  /**\n  *\n  *\n  * @param {string} key\n  * @param {Function} [callback]\n  * @returns {*}  \n  * @memberof MemoryCache\n  */\n  hkeys(key: string, callback?: CallbackFunction) {\n    let retVals: any[] = [];\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      const hashObj = this._getKey(key);\n      // 排除内部属性 _fieldTTL\n      retVals = Object.keys(hashObj).filter(k => k !== '_fieldTTL');\n    }\n\n    return this._handleCallback(callback, retVals);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  hvals(key: string, callback?: CallbackFunction) {\n    let retVals: any[] = [];\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      const hashObj = this._getKey(key);\n      // 排除内部属性 _fieldTTL 的值\n      retVals = Object.entries(hashObj)\n        .filter(([k]) => k !== '_fieldTTL')\n        .map(([, v]) => v);\n    }\n\n    return this._handleCallback(callback, retVals);\n  }\n\n  // ---------------------------------------\n  // Lists (Array / Queue / Stack)\n  // ---------------------------------------\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  llen(key: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n      retVal = this._getKey(key).length || 0;\n    }\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {(string | number)} value\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  rpush(key: string, value: string | number, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n    } else {\n      this.cache.set(key, this._makeKey([], 'list'));\n    }\n\n    this._getKey(key).push(value.toString());\n    retVal = this._getKey(key).length;\n    this.persist(key);\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * List：从左侧推入\n   * @param key \n   * @param value \n   * @param callback \n   */\n  lpush(key: string, value: any, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n    } else {\n      this.cache.set(key, this._makeKey([], 'list'));\n    }\n    const list = this._getKey(key);\n    retVal = list.unshift(value);\n    this._setKey(key, list);\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * List：获取指定索引的元素\n   * @param key \n   * @param index \n   * @param callback \n   */\n  lindex(key: string, index: number, callback?: CallbackFunction) {\n    if (!this._hasKey(key)) {\n      return this._handleCallback(callback, null);\n    }\n    \n    this._testType(key, 'list', true, callback);\n    const list = this._getKey(key);\n    \n    if (index < 0) {\n      index = list.length + index;\n    }\n    \n    const value = index >= 0 && index < list.length ? list[index] : null;\n    return this._handleCallback(callback, value);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  lpop(key: string, callback?: CallbackFunction) {\n    let retVal = null;\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n      const list = this._getKey(key);\n      if (list.length > 0) {\n        retVal = list.shift();\n        this.persist(key);\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  rpop(key: string, callback?: CallbackFunction) {\n    let retVal = null;\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n      const list = this._getKey(key);\n      if (list.length > 0) {\n        retVal = list.pop();\n        this.persist(key);\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {number} start\n   * @param {number} stop\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  lrange(key: string, start: number, stop: number, callback?: CallbackFunction) {\n    const retVal = [];\n    if (this._hasKey(key)) {\n      this._testType(key, 'list', true, callback);\n      const list = this._getKey(key);\n      const length = list.length;\n      if (stop < 0) {\n        stop = length + stop;\n      }\n      if (start < 0) {\n        start = length + start;\n      }\n      if (start < 0) {\n        start = 0;\n      }\n      if (stop >= length) {\n        stop = length - 1;\n      }\n      if (stop >= 0 && stop >= start) {\n        for (let itr = start; itr <= stop; itr++) {\n          retVal.push(list[itr]);\n        }\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  // ---------------------------------------\n  // ## Sets (Unique Lists)##\n  // ---------------------------------------\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {...any[]} members\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  sadd(key: string, ...members: string[]) {\n    let retVal = 0;\n    const callback = this._retrieveCallback(members);\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n    } else {\n      this.cache.set(key, this._makeKey([], 'set'));\n    }\n    const val = this._getKey(key);\n    const length = val.length;\n    const nval = union(val, members);\n    const newlength = nval.length;\n    retVal = newlength - length;\n    this._setKey(key, nval);\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  scard(key: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n      retVal = this._getKey(key).length;\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {string} member\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  sismember(key: string, member: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n      const val = this._getKey(key);\n      if (val.includes(member)) {\n        retVal = 1;\n      }\n    }\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  smembers(key: string, callback?: CallbackFunction) {\n    let retVal = [];\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n      retVal = this._getKey(key);\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {number} [count]\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  spop(key: string, count?: number, callback?: CallbackFunction) {\n    let retVal: any[] = [];\n    count = count || 1;\n    if (typeof count === 'function') {\n      callback = count;\n      count = 1;\n    }\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n      const val = this._getKey(key);\n      const keys = Object.keys(val);\n      const keysLength = keys.length;\n      if (keysLength) {\n        if (count >= keysLength) {\n          retVal = keys;\n          this.del(key);\n        } else {\n          for (let itr = 0; itr < count; itr++) {\n            const randomNum = Math.floor(Math.random() * keys.length);\n            retVal.push(keys[randomNum]);\n            this.srem(key, keys[randomNum]);\n          }\n        }\n      }\n    }\n\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {...any[]} members\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  srem(key: string, ...members: any[]) {\n    let retVal = 0;\n    const callback = this._retrieveCallback(members);\n    if (this._hasKey(key)) {\n      this._testType(key, 'set', true, callback);\n      const val = this._getKey(key);\n      for (const index in members) {\n        if (members.hasOwnProperty(index)) {\n          const member = members[index];\n          const idx = val.indexOf(member);\n          if (idx !== -1) {\n            val.splice(idx, 1);\n            retVal++;\n          }\n        }\n      }\n      this._setKey(key, val);\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @param {string} sourcekey\n   * @param {string} destkey\n   * @param {string} member\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  smove(sourcekey: string, destkey: string, member: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(sourcekey)) {\n      this._testType(sourcekey, 'set', true, callback);\n      const val = this._getKey(sourcekey);\n      const idx = val.indexOf(member);\n      if (idx !== -1) {\n        this.sadd(destkey, member);\n        val.splice(idx, 1);\n        retVal = 1;\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  // ---------------------------------------\n  // ## Transactions (Atomic) ##\n  // ---------------------------------------\n  // TODO: Transaction Queues watch and unwatch\n  // https://redis.io/topics/transactions\n  // This can be accomplished by temporarily swapping this.cache to a temporary copy of the current statement\n  // holding and then using __.merge on actual this.cache with the temp storage.\n  discard(callback?: CallbackFunction, silent?: boolean) {\n    // Clear the queue mode, drain the queue, empty the watch list\n    if (this.multiMode) {\n      this.cache = this.databases.get(this.currentDBIndex)!;\n      this.multiMode = false;\n      this.responseMessages = [];\n    }\n    if (!silent) {\n      return this._handleCallback(callback, messages.ok);\n    }\n    return null;\n  }\n\n  // ---------------------------------------\n  // ## Internal - Key ##\n  // ---------------------------------------\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private pttl(key: string, _callback?: CallbackFunction): number {\n    let retVal = -2;\n    if (this._hasKey(key)) {\n      if (!isNil(this.cache.get(key)?.timeout)) {\n        retVal = this.cache.get(key)!.timeout - Date.now();\n        // Prevent unexpected errors if the actual ttl just happens to be -2 or -1\n        if (retVal < 0 && retVal > -3) {\n          retVal = -3;\n        }\n      } else {\n        retVal = -1;\n      }\n    }\n    return retVal;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private persist(key: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      if (!isNil(this._key(key).timeout)) {\n        this.cache.set(key, { ...this.cache.get(key)!, timeout: null });\n        retVal = 1;\n      }\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @returns {*}  {boolean}\n   * @memberof MemoryCache\n   */\n  private _hasKey(key: string) {\n    return this.cache.has(key);\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {*} value\n   * @param {string} type\n   * @param {number} timeout\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _makeKey(value: any, type: string, timeout?: number) {\n    return { value: value, type: type, timeout: timeout || null, lastAccess: Date.now() };\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _key(key: string) {\n    this.cache.get(key)!.lastAccess = Date.now();\n    return this.cache.get(key)!;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {number} amount\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _addToKey(key: string, amount: number, callback?: CallbackFunction) {\n    let keyValue = 0;\n    if (isNaN(amount) || isNil(amount)) {\n      return this._handleCallback(callback, null, messages.noint);\n    }\n\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      keyValue = parseInt(this._getKey(key));\n      if (isNaN(keyValue) || isNil(keyValue)) {\n        return this._handleCallback(callback, null, messages.noint);\n      }\n    } else {\n      this.cache.set(key, this._makeKey('0', 'string'));\n    }\n    const val = keyValue + amount;\n    this._setKey(key, val.toString());\n    return val;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {string} type\n   * @param {boolean} [throwError]\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _testType(key: string, type: string, throwError?: boolean, callback?: CallbackFunction) {\n    throwError = !!throwError;\n    const keyType = this._key(key).type;\n    if (keyType !== type) {\n      if (throwError) {\n        return this._handleCallback(callback, null, messages.wrongTypeOp);\n      }\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _getKey(key: string) {\n    const _key = this._key(key) || {};\n    if (_key.timeout && _key.timeout <= Date.now()) {\n      this.del(key);\n      return null;\n    }\n    return _key.value;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {(number | string)} value\n   * @memberof MemoryCache\n   */\n  private _setKey(key: string, value: any) {\n    this.cache.set(key, { ...this.cache.get(key)!, value: value, lastAccess: Date.now() });\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {string} field\n   * @param {number} [amount]\n   * @param {boolean} [useFloat]\n   * @param {Function} [callback]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _addToField(key: string, field: string, amount?: number, useFloat?: boolean, callback?: CallbackFunction) {\n    useFloat = useFloat || false;\n    let fieldValue = useFloat ? 0.0 : 0;\n    let value = 0;\n\n    if (isNaN(amount) || isNil(amount)) {\n      return this._handleCallback(callback, null, useFloat ? messages.nofloat : messages.noint);\n    }\n\n    if (this._hasKey(key)) {\n      this._testType(key, 'hash', true, callback);\n      if (this._hasField(key, field)) {\n        value = this._getField(key, field);\n      }\n    } else {\n      this.cache.set(key, this._makeKey({}, 'hash'));\n    }\n\n    fieldValue = useFloat ? parseFloat(`${value}`) : parseInt(`${value}`);\n    amount = useFloat ? parseFloat(`${amount}`) : parseInt(`${amount}`);\n    if (isNaN(fieldValue) || isNil(fieldValue)) {\n      return this._handleCallback(callback, null, useFloat ? messages.nofloat : messages.noint);\n    }\n\n    fieldValue += amount;\n    this._setField(key, field, fieldValue.toString());\n    return fieldValue;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {string} field\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _getField(key: string, field: string) {\n    return this._getKey(key)[field];\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {string} key\n   * @param {string} field\n   * @returns {*}  {boolean}\n   * @memberof MemoryCache\n   */\n  private _hasField(key: string, field: string) {\n    let retVal = false;\n    if (key && field) {\n      const ky = this._getKey(key);\n      if (ky) {\n        // 排除内部属性 _fieldTTL\n        retVal = field !== '_fieldTTL' && ky.hasOwnProperty(field);\n      }\n    }\n    return retVal;\n  }\n\n  /**\n   *\n   *\n   * @param {string} key\n   * @param {string} field\n   * @param {*} value\n   * @memberof MemoryCache\n   */\n  _setField(key: string, field: string, value: any) {\n    this._getKey(key)[field] = value;\n  }\n\n  /**\n   * \n   *\n   * @private\n   * @param {Function} [callback]\n   * @param {(any)} [message]\n   * @param {*} [error]\n   * @param {boolean} [nolog]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _handleCallback(callback?: CallbackFunction<any>, message?: any, error?: any, nolog?: boolean) {\n    let err = error;\n    let msg = message;\n    nolog = isNil(nolog) ? true : nolog;\n    if (nolog) {\n      err = this._logReturn(error);\n      msg = this._logReturn(message);\n    }\n    if (typeof callback === 'function') {\n      callback(err, msg);\n      return;\n    }\n    if (err) {\n      throw new Error(err);\n    }\n    return msg;\n  }\n\n  private _logReturn(message: string | number) {\n    if (!isUndefined(message)) {\n      if (this.multiMode) {\n        if (!isNil(this.responseMessages)) {\n          this.responseMessages.push(message);\n          if (message === messages.ok) {\n            message = messages.queued;\n          }\n        }\n      }\n      return message;\n    }\n    return;\n  }\n\n  /**\n   *\n   *\n   * @private\n   * @param {any[]} [params]\n   * @returns {*}  \n   * @memberof MemoryCache\n   */\n  private _retrieveCallback(params?: any[]) {\n    if (Array.isArray(params) && params.length > 0 && typeof params[params.length - 1] === 'function') {\n      return params.pop();\n    }\n    return;\n  }\n\n  /**\n   * 字符串追加操作\n   * @param key \n   * @param value \n   * @param callback \n   */\n  append(key: string, value: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      const existingValue = this._getKey(key);\n      const newValue = existingValue + value;\n      this._setKey(key, newValue);\n      retVal = newValue.length;\n    } else {\n      this.cache.set(key, this._makeKey(value, 'string'));\n      retVal = value.length;\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 获取字符串长度\n   * @param key \n   * @param callback \n   */\n  strlen(key: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      retVal = this._getKey(key).length;\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 获取子字符串\n   * @param key \n   * @param start \n   * @param end \n   * @param callback \n   */\n  getrange(key: string, start: number, end: number, callback?: CallbackFunction) {\n    let retVal = '';\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      const value = this._getKey(key);\n      retVal = value.substring(start, end + 1);\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 设置子字符串\n   * @param key \n   * @param offset \n   * @param value \n   * @param callback \n   */\n  setrange(key: string, offset: number, value: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    if (this._hasKey(key)) {\n      this._testType(key, 'string', true, callback);\n      const existingValue = this._getKey(key);\n      const newValue = existingValue.substring(0, offset) + value + existingValue.substring(offset + value.length);\n      this._setKey(key, newValue);\n      retVal = newValue.length;\n    } else {\n      // 如果键不存在，创建一个足够长的字符串\n      const newValue = ''.padEnd(offset, '\\0') + value;\n      this.cache.set(key, this._makeKey(newValue, 'string'));\n      retVal = newValue.length;\n    }\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 批量获取\n   * @param keys \n   * @param callback \n   */\n  mget(...keys: any[]) {\n    const callback = this._retrieveCallback(keys);\n    const retVal: any[] = [];\n    \n    for (const key of keys) {\n      if (this._hasKey(key)) {\n        this._testType(key, 'string', false, callback);\n        retVal.push(this._getKey(key));\n      } else {\n        retVal.push(null);\n      }\n    }\n    \n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 批量设置\n   * @param keyValuePairs \n   * @param callback \n   */\n  mset(...keyValuePairs: any[]) {\n    const callback = this._retrieveCallback(keyValuePairs);\n    \n    // 确保参数是偶数个\n    if (keyValuePairs.length % 2 !== 0) {\n      return this._handleCallback(callback, null, messages.wrongArgCount.replace('%0', 'mset'));\n    }\n    \n    for (let i = 0; i < keyValuePairs.length; i += 2) {\n      const key = keyValuePairs[i];\n      const value = keyValuePairs[i + 1];\n      this.cache.set(key, this._makeKey(value.toString(), 'string'));\n    }\n    \n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   * 获取所有键\n   * @param pattern \n   * @param callback \n   */\n  keys(pattern: string = '*', callback?: CallbackFunction) {\n    const retVal: string[] = [];\n    \n    this.cache.forEach((_item: any, key: any) => {\n      if (pattern === '*' || this.matchPattern(key, pattern)) {\n        retVal.push(key);\n      }\n    });\n    \n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * 简单的模式匹配\n   * @param key \n   * @param pattern \n   */\n  private matchPattern(key: string, pattern: string): boolean {\n    if (pattern === '*') return true;\n    \n    // 转换glob模式为正则表达式\n    const regexPattern = pattern\n      .replace(/\\*/g, '.*')\n      .replace(/\\?/g, '.')\n      .replace(/\\[([^\\]]*)\\]/g, '[$1]');\n    \n    const regex = new RegExp(`^${regexPattern}$`);\n    return regex.test(key);\n  }\n\n  /**\n   * 获取随机键\n   * @param callback \n   */\n  randomkey(callback?: CallbackFunction) {\n    const keys: string[] = [];\n    this.cache.forEach((_item: any, key: any) => {\n      keys.push(key);\n    });\n    \n    if (keys.length === 0) {\n      return this._handleCallback(callback, null);\n    }\n    \n    const randomIndex = Math.floor(Math.random() * keys.length);\n    return this._handleCallback(callback, keys[randomIndex]);\n  }\n\n  /**\n   * 重命名键\n   * @param oldKey \n   * @param newKey \n   * @param callback \n   */\n  rename(oldKey: string, newKey: string, callback?: CallbackFunction) {\n    if (!this._hasKey(oldKey)) {\n      return this._handleCallback(callback, null, messages.nokey);\n    }\n    \n    const value = this.cache.get(oldKey);\n    this.cache.set(newKey, value);\n    this.cache.delete(oldKey);\n    \n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   * 安全重命名键（目标键不存在时才重命名）\n   * @param oldKey \n   * @param newKey \n   * @param callback \n   */\n  renamenx(oldKey: string, newKey: string, callback?: CallbackFunction) {\n    if (!this._hasKey(oldKey)) {\n      return this._handleCallback(callback, null, messages.nokey);\n    }\n    \n    if (this._hasKey(newKey)) {\n      return this._handleCallback(callback, 0);\n    }\n    \n    const value = this.cache.get(oldKey);\n    this.cache.set(newKey, value);\n    this.cache.delete(oldKey);\n    \n    return this._handleCallback(callback, 1);\n  }\n\n  /**\n   * 获取键的类型\n   * @param key \n   * @param callback \n   */\n  type(key: string, callback?: CallbackFunction) {\n    if (!this._hasKey(key)) {\n      return this._handleCallback(callback, 'none');\n    }\n    \n    const item = this.cache.get(key);\n    return this._handleCallback(callback, item.type);\n  }\n\n  /**\n   * 清空当前数据库\n   * @param callback \n   */\n  flushdb(callback?: CallbackFunction) {\n    this.cache.clear();\n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   * 清空所有数据库\n   * @param callback \n   */\n  flushall(callback?: CallbackFunction) {\n    this.databases.clear();\n    this.cache = this.createLRUCache();\n    this.databases.set(this.currentDBIndex, this.cache);\n    return this._handleCallback(callback, messages.ok);\n  }\n\n  /**\n   * 获取数据库大小\n   * @param callback \n   */\n  dbsize(callback?: CallbackFunction) {\n    const size = this.cache.size || 0;\n    return this._handleCallback(callback, size);\n  }\n\n  /**\n   * Sorted Set基础实现 - 添加成员\n   * @param key \n   * @param score \n   * @param member \n   * @param callback \n   */\n  zadd(key: string, score: number, member: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    \n    if (this._hasKey(key)) {\n      this._testType(key, 'zset', true, callback);\n    } else {\n      this.cache.set(key, this._makeKey([], 'zset'));\n    }\n    \n    const zset = this._getKey(key);\n    const existing = zset.find((item: any) => item.member === member);\n    \n    if (existing) {\n      existing.score = score;\n    } else {\n      zset.push({ score, member });\n      retVal = 1;\n    }\n    \n    // 按分数排序\n    zset.sort((a: any, b: any) => a.score - b.score);\n    this._setKey(key, zset);\n    \n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * Sorted Set - 获取成员分数\n   * @param key \n   * @param member \n   * @param callback \n   */\n  zscore(key: string, member: string, callback?: CallbackFunction) {\n    if (!this._hasKey(key)) {\n      return this._handleCallback(callback, null);\n    }\n    \n    this._testType(key, 'zset', true, callback);\n    const zset = this._getKey(key);\n    const item = zset.find((item: any) => item.member === member);\n    \n    return this._handleCallback(callback, item ? item.score : null);\n  }\n\n  /**\n   * Sorted Set - 获取范围内的成员\n   * @param key \n   * @param start \n   * @param stop \n   * @param callback \n   */\n  zrange(key: string, start: number, stop: number, callback?: CallbackFunction) {\n    if (!this._hasKey(key)) {\n      return this._handleCallback(callback, []);\n    }\n    \n    this._testType(key, 'zset', true, callback);\n    const zset = this._getKey(key);\n    const length = zset.length;\n    \n    if (stop < 0) {\n      stop = length + stop;\n    }\n    if (start < 0) {\n      start = length + start;\n    }\n    \n    const retVal = zset.slice(start, stop + 1).map((item: any) => item.member);\n    return this._handleCallback(callback, retVal);\n  }\n\n  /**\n   * Sorted Set - 获取成员数量\n   * @param key \n   * @param callback \n   */\n  zcard(key: string, callback?: CallbackFunction) {\n    if (!this._hasKey(key)) {\n      return this._handleCallback(callback, 0);\n    }\n    \n    this._testType(key, 'zset', true, callback);\n    const zset = this._getKey(key);\n    return this._handleCallback(callback, zset.length);\n  }\n\n  /**\n   * Sorted Set - 删除成员\n   * @param key \n   * @param member \n   * @param callback \n   */\n  zrem(key: string, member: string, callback?: CallbackFunction) {\n    let retVal = 0;\n    \n    if (this._hasKey(key)) {\n      this._testType(key, 'zset', true, callback);\n      const zset = this._getKey(key);\n      const index = zset.findIndex((item: any) => item.member === member);\n      \n      if (index !== -1) {\n        zset.splice(index, 1);\n        retVal = 1;\n        this._setKey(key, zset);\n      }\n    }\n    \n    return this._handleCallback(callback, retVal);\n  }\n}","import { MemoryCache, messages } from \"./memory_cache\";\n// const MemoryCache = require('@outofsync/memory-cache');\n\nexport interface MemoryStoreOpt {\n  type: string;\n  keyPrefix?: string;\n  db?: number;\n  timeout?: number; // seconds\n  maxKeys?: number; // LRU最大键数量\n  maxMemory?: number; // 最大内存使用（字节）\n  evictionPolicy?: 'lru' | 'lfu' | 'random'; // 淘汰策略\n  ttlCheckInterval?: number; // TTL检查间隔（毫秒）\n}\n/*\n * @Description:\n * @Usage:\n * @Author: richen\n * @Date: 2021-06-29 19:07:57\n * @LastEditTime: 2023-02-18 23:52:47\n */\nexport class MemoryStore {\n  client: MemoryCache;\n  options: MemoryStoreOpt;\n\n  /**\n   * Creates an instance of MemoryStore.\n   * @param {MemoryStoreOpt} options\n   * @memberof MemoryStore\n   */\n  constructor(options: MemoryStoreOpt) {\n    this.options = {\n      maxKeys: 1000,\n      evictionPolicy: 'lru',\n      ttlCheckInterval: 60000, // 1分钟\n      ...options\n    };\n    // 直接创建 MemoryCache 实例\n    this.client = new MemoryCache({\n      database: this.options.db || 0,\n      maxKeys: this.options.maxKeys,\n      maxMemory: this.options.maxMemory,\n      evictionPolicy: this.options.evictionPolicy,\n      ttlCheckInterval: this.options.ttlCheckInterval\n    });\n    this.client.createClient();\n  }\n\n  /**\n   * getConnection\n   *\n   * @returns {*}  \n   * @memberof MemoryStore\n   */\n  getConnection(): MemoryCache {\n    // 直接返回 MemoryCache 实例\n    return this.client;\n  }\n\n  /**\n   * close\n   *\n   * @returns {*}  {Promise<void>}\n   * @memberof MemoryStore\n   */\n  async close(): Promise<void> {\n    if (this.client) {\n      this.client.end();\n      this.client = null;\n    }\n  }\n  /**\n   * release\n   *\n   * @param {*} _conn\n   * @returns {*}  {Promise<void>}\n   * @memberof MemoryStore\n   */\n  async release(_conn: any): Promise<void> {\n    // 对于内存存储，不需要释放连接\n    return Promise.resolve();\n  }\n\n  /**\n   * defineCommand\n   *\n   * @param {string} _name\n   * @param {*} _scripts\n   * @memberof MemoryStore\n   */\n  async defineCommand(_name: string, _scripts: any) {\n    throw new Error(messages.unsupported);\n  }\n\n  /**\n   * get and compare value\n   *\n   * @param {string} name\n   * @param {(string | number)} value\n   * @returns {*}  {Promise<any>}\n   * @memberof MemoryStore\n   */\n  async getCompare(name: string, value: string | number): Promise<any> {\n    const client = this.getConnection();\n    const val = client.get(`${this.options.keyPrefix}${name}`);\n    if (!val) {\n      return 0;\n    } else if (val == value) {\n      return client.del(`${this.options.keyPrefix}${name}`);\n    } else {\n      return -1;\n    }\n  }\n\n  /**\n   * 获取缓存统计信息\n   */\n  getStats(): any {\n    if (this.client) {\n      return this.client.info();\n    }\n    return {\n      keys: 0,\n      memory: 0,\n      hits: 0,\n      misses: 0\n    };\n  }\n\n  /**\n   * Begin a transaction (not supported by MemoryStore)\n   * @throws {Error} Transactions are not supported by MemoryStore\n   */\n  async beginTransaction(): Promise<void> {\n    throw new Error('Transactions are not supported by MemoryStore. Use RedisStore for transaction support.');\n  }\n\n  /**\n   * Commit a transaction (not supported by MemoryStore)\n   * @throws {Error} Transactions are not supported by MemoryStore\n   */\n  async commit(): Promise<void> {\n    throw new Error('Transactions are not supported by MemoryStore. Use RedisStore for transaction support.');\n  }\n\n  /**\n   * Rollback a transaction (not supported by MemoryStore)\n   * @throws {Error} Transactions are not supported by MemoryStore\n   */\n  async rollback(): Promise<void> {\n    throw new Error('Transactions are not supported by MemoryStore. Use RedisStore for transaction support.');\n  }\n}\n","/*\n * @Author: richen\n * @Date: 2020-11-30 15:56:08\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2023-02-19 00:02:09\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\nimport * as helper from \"koatty_lib\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { Redis, Cluster, RedisOptions, ClusterOptions } from \"ioredis\";\nimport genericPool from \"generic-pool\";\n\n/**\n * @description: \n * @return {*}\n */\nexport interface RedisStoreOpt extends RedisOptions, ClusterOptions {\n  type: string;\n  timeout?: number;\n  poolSize?: number;\n  clusters?: Array<{ host: string; port: number }>;\n}\n/**\n *\n *\n * @export\n * @class RedisStore\n */\nexport class RedisStore {\n  options: RedisStoreOpt;\n  pool: genericPool.Pool<Redis | Cluster>;\n  public client: Redis | Cluster;\n  private reconnectAttempts = 0;\n  private maxReconnectAttempts = 5;\n  private reconnectDelay = 1000; // 初始重连延迟1秒\n\n  /**\n   * Creates an instance of RedisStore.\n   * @param {RedisStoreOpt} options\n   * @memberof RedisStore\n   */\n  constructor(options: RedisStoreOpt) {\n    this.options = this.parseOpt(options);\n    this.pool = null;\n  }\n\n  // parseOpt\n  private parseOpt(options: RedisStoreOpt) {\n    const opt: RedisStoreOpt = {\n      type: options.type,\n      host: options.host || '127.0.0.1',\n      port: options.port || 3306,\n      username: options.username || \"\",\n      password: options.password || \"\",\n      db: options.db || 0,\n      timeout: options.timeout,\n      keyPrefix: options.keyPrefix || '',\n      poolSize: options.poolSize || 10,\n      connectTimeout: options.connectTimeout || 500,\n    };\n\n    if (helper.isArray(options.host)) {\n      const hosts: Array<{ host: string; port: number }> = [];\n      for (let i = 0; i < options.host.length; i++) {\n        const h = options.host[i];\n        if (!helper.isEmpty(options.host[i])) {\n          let p: number;\n          if (helper.isArray(options.port)) {\n            p = options.port[i];\n          } else {\n            p = options.port || 6379;\n          }\n          hosts.push({\n            host: h,\n            port: helper.toNumber(p),\n          })\n        }\n      }\n      // sentinel\n      if (!helper.isEmpty(options.name)) {\n        opt.host = \"\";\n        opt.port = null;\n        opt.sentinels = [...hosts];\n        opt.sentinelUsername = options.username;\n        opt.sentinelPassword = options.password;\n      } else {\n        // cluster\n        opt.host = \"\";\n        opt.port = null;\n        opt.clusters = [...hosts];\n      }\n    }\n    return opt;\n  }\n\n  /**\n   * create connection by native with improved error handling\n   *\n   * @param {number} [connNum=0]\n   * @returns {*}  {Promise<Redis | Cluster>}\n   * @memberof RedisStore\n   */\n  private async connect(connNum = 0): Promise<Redis | Cluster> {\n    if (this.client && this.client.status === 'ready') {\n      return this.client;\n    }\n\n    const defer = helper.getDefer();\n    let connection: Redis | Cluster;\n    \n    try {\n      if (!helper.isEmpty(this.options.clusters)) {\n        connection = new Cluster([...this.options.clusters], { \n          redisOptions: this.options,\n          enableOfflineQueue: false,\n          retryDelayOnFailover: 100\n        });\n      } else {\n        connection = new Redis({\n          ...this.options,\n          enableOfflineQueue: false,\n          retryDelayOnFailover: 100,\n          lazyConnect: true\n        } as RedisOptions);\n      }\n      \n      // 去除prefix, 防止重复\n      this.options.keyPrefix = \"\";\n      \n      connection.on('error', (err) => {\n        logger.Error(`Redis connection error: ${err.message}`);\n        if (this.reconnectAttempts < this.maxReconnectAttempts) {\n          this.scheduleReconnect(connNum);\n        } else {\n          defer.reject(new Error(`Redis connection failed after ${this.maxReconnectAttempts} attempts`));\n        }\n      });\n      \n      connection.on('end', () => {\n        logger.Warn('Redis connection ended');\n        if (connNum < 3) {\n          this.scheduleReconnect(connNum + 1);\n        } else {\n          this.close();\n          defer.reject(new Error('Redis connection end after 3 attempts'));\n        }\n      });\n      \n      connection.on('ready', () => {\n        logger.Info('Redis connection ready');\n        this.client = connection;\n        this.reconnectAttempts = 0; // 重置重连计数\n        defer.resolve(connection);\n      });\n\n      // 主动连接\n      if (connection instanceof Redis) {\n        await connection.connect();\n      }\n      \n    } catch (error) {\n      logger.Error(`Failed to create Redis connection: ${error.message}`);\n      defer.reject(error);\n    }\n\n    return defer.promise;\n  }\n\n  /**\n   * 计划重连，使用指数退避策略\n   * @private\n   * @param {number} connNum\n   */\n  private scheduleReconnect(connNum: number): void {\n    this.reconnectAttempts++;\n    const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n    \n    logger.Info(`Scheduling Redis reconnect attempt ${this.reconnectAttempts} in ${delay}ms`);\n    \n    setTimeout(() => {\n      this.connect(connNum).catch(err => {\n        logger.Error(`Reconnect attempt ${this.reconnectAttempts} failed: ${err.message}`);\n      });\n    }, delay);\n  }\n\n  /**\n   * get connection from pool with improved configuration\n   *\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  getConnection() {\n    if (!this.pool || !this.pool.acquire) {\n      const factory = {\n        create: () => {\n          return this.connect();\n        },\n        destroy: (resource: Redis | Cluster) => {\n          if (resource && typeof resource.disconnect === 'function') {\n            resource.disconnect();\n          }\n          return Promise.resolve();\n        },\n        validate: (resource: Redis | Cluster) => {\n          return Promise.resolve(resource && resource.status === 'ready');\n        }\n      };\n      \n      this.pool = genericPool.createPool(factory, {\n        max: this.options.poolSize || 10, // maximum size of the pool\n        min: Math.min(2, this.options.poolSize || 2), // minimum size of the pool\n        acquireTimeoutMillis: 30000, // 30秒获取连接超时\n        testOnBorrow: true, // 借用时测试连接\n        evictionRunIntervalMillis: 30000, // 30秒检查一次空闲连接\n        idleTimeoutMillis: 300000, // 5分钟空闲超时\n        softIdleTimeoutMillis: 180000 // 3分钟软空闲超时\n      });\n      \n      this.pool.on('factoryCreateError', function (err) {\n        logger.Error(`Redis pool create error: ${err.message}`);\n      });\n      \n      this.pool.on('factoryDestroyError', function (err) {\n        logger.Error(`Redis pool destroy error: ${err.message}`);\n      });\n    }\n\n    return this.pool.acquire();\n  }\n\n  /**\n   * close connection with proper cleanup\n   *\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  async close() {\n    try {\n      if (this.pool) {\n        await this.pool.drain();\n        await this.pool.clear();\n        this.pool = null;\n      }\n      \n      if (this.client) {\n        if (typeof this.client.disconnect === 'function') {\n          this.client.disconnect();\n        }\n        this.client = null;\n      }\n    } catch (error) {\n      logger.Error(`Error closing Redis connection: ${error.message}`);\n    }\n  }\n\n  /**\n   *\n   *\n   * @param {*} conn\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  async release(conn: any) {\n    if (this.pool.isBorrowedResource(conn)) {\n      return this.pool.release(conn);\n    }\n    return Promise.resolve();\n  }\n\n  /**\n   * defineCommand\n   *\n   * @param {string} name\n   * @param {{ numberOfKeys?: number; lua?: string; }} scripts\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  async defineCommand(name: string, scripts: { numberOfKeys?: number; lua?: string; }) {\n    const conn: any = await this.getConnection();\n    if (!conn[name]) {\n      conn.defineCommand(name, scripts);\n    }\n\n    return conn;\n  }\n\n  /**\n   * get and compare value\n   *\n   * @param {string} name\n   * @param {(string | number)} value\n   * @returns {*}  {Promise<any>}\n   * @memberof RedisStore\n   */\n  async getCompare(name: string, value: string | number): Promise<any> {\n    let conn: any;\n    try {\n      conn = await this.defineCommand(\"getCompare\", {\n        numberOfKeys: 1,\n        lua: `\n                    local remote_value = redis.call(\"get\",KEYS[1])\n                    \n                    if (not remote_value) then\n                        return 0\n                    elseif (remote_value == ARGV[1]) then\n                        return redis.call(\"del\",KEYS[1])\n                    else\n                        return -1\n                    end\n            `});\n      return conn.getCompare(name, value);\n    } catch (error) {\n      throw error;\n    } finally {\n      this.release(conn);\n    }\n  }\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-12-02 15:26:55\n * @LastEditTime: 2024-11-07 14:27:25\n */\nimport { MemoryStore, MemoryStoreOpt } from \"./store/memory\";\nimport { RedisStore, RedisStoreOpt } from \"./store/redis\";\nimport { CacheStoreInterface } from \"./store/interface\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\n\nexport type StoreOptions = MemoryStoreOpt | RedisStoreOpt;\n\nconst defaultOptions = {\n  type: 'memory', // memory | redis\n  host: '',\n  port: 0,\n  keyPrefix: 'Koatty',\n  timeout: 600,\n  poolSize: 10,\n  connectTimeout: 500,\n  db: 0\n};\n/**\n *\n *\n * @export\n * @class Store\n */\nexport class CacheStore implements CacheStoreInterface {\n  client: MemoryStore | RedisStore;\n  options: StoreOptions;\n  private static instances: Map<string, CacheStore> = new Map();\n\n  /**\n   * Creates an instance of CacheStore.\n   * @param {StoreOptions} options\n   * @memberof CacheStore\n   */\n  constructor(options?: StoreOptions) {\n    this.options = options ? { ...defaultOptions, ...options } : defaultOptions;\n    this.client = null;\n    switch (this.options.type) {\n      case \"redis\":\n        this.client = new RedisStore(this.options);\n        break;\n      case \"memory\":\n      default:\n        this.client = new MemoryStore(this.options);\n        break;\n    }\n  }\n\n  /**\n   * 获取单例实例，支持多配置实例管理\n   * @static\n   * @param {StoreOptions} [options]\n   * @param {string} [instanceKey='default'] 实例键名，用于区分不同配置的实例\n   * @returns {CacheStore}\n   */\n  static getInstance(options?: StoreOptions, instanceKey = 'default'): CacheStore {\n    // 生成配置哈希作为实例键的一部分\n    const configHash = options ? this.generateConfigHash(options) : 'default';\n    const fullKey = `${instanceKey}_${configHash}`;\n    \n    if (this.instances.has(fullKey)) {\n      return this.instances.get(fullKey)!;\n    }\n    \n    const instance = new CacheStore(options);\n    this.instances.set(fullKey, instance);\n    return instance;\n  }\n\n  /**\n   * 生成配置哈希\n   * @private\n   * @static\n   * @param {StoreOptions} options\n   * @returns {string}\n   */\n  private static generateConfigHash(options: StoreOptions): string {\n    const configStr = JSON.stringify({\n      type: options.type,\n      host: (options as any).host,\n      port: (options as any).port,\n      db: options.db,\n      keyPrefix: options.keyPrefix\n    });\n    // 简单哈希函数\n    let hash = 0;\n    for (let i = 0; i < configStr.length; i++) {\n      const char = configStr.charCodeAt(i);\n      hash = ((hash << 5) - hash) + char;\n      hash = hash & hash; // 转换为32位整数\n    }\n    return Math.abs(hash).toString(36);\n  }\n\n  /**\n   * 清理指定实例\n   * @static\n   * @param {string} [instanceKey='default']\n   */\n  static async clearInstance(instanceKey = 'default'): Promise<void> {\n    const keysToRemove = Array.from(this.instances.keys()).filter(key => \n      key.startsWith(`${instanceKey}_`)\n    );\n    \n    for (const key of keysToRemove) {\n      const instance = this.instances.get(key);\n      if (instance) {\n        await instance.close();\n        this.instances.delete(key);\n      }\n    }\n  }\n\n  /**\n   * 清理所有实例\n   * @static\n   */\n  static async clearAllInstances(): Promise<void> {\n    const promises = Array.from(this.instances.values()).map(instance => instance.close());\n    await Promise.all(promises);\n    this.instances.clear();\n  }\n\n  getConnection() {\n    return this.client.getConnection();\n  }\n  close(): Promise<void> {\n    return this.client.close();\n  }\n  release(conn: any): Promise<void> {\n    return this.client.release(conn);\n  }\n\n  /**\n   * 获取底层实现客户端，用于访问特定实现的功能\n   * 例如：Redis的defineCommand, getCompare等\n   * @returns {MemoryStore | RedisStore}\n   */\n  getRawClient(): MemoryStore | RedisStore {\n    return this.client;\n  }\n\n  /**\n   * handler for native client\n   *\n   * @param {string} name\n   * @param {any[]} data\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  protected async wrap(name: string, data: any[]) {\n    let conn: any;\n    try {\n      conn = await this.getConnection();\n      const res = await conn[name](...data);\n      return res;\n    } catch (err) {\n      // 添加详细的错误信息\n      const error = new Error(`Cache operation failed: ${name}(${data.slice(0, 2).join(', ')}${data.length > 2 ? '...' : ''}) - ${err.message}`);\n      error.stack = err.stack;\n      throw error;\n    } finally {\n      // 安全地释放连接\n      if (conn) {\n        try {\n          await this.release(conn);\n        } catch (releaseErr) {\n          // 记录但不抛出，避免掩盖原始错误\n          logger.Error(`Failed to release connection: ${releaseErr.message}`);\n        }\n      }\n    }\n  }\n\n  /**\n   * 字符串获取\n   * @param name\n   */\n  get(name: string): Promise<string | null> {\n    return this.wrap('get', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 字符串写入\n   * @param name\n   * @param value\n   * @param timeout\n   * @returns {Promise}\n   */\n  set(name: string, value: string | number, timeout?: number): Promise<string> {\n    if (typeof timeout !== 'number') {\n      timeout = this.options.timeout;\n    }\n    return this.wrap('set', [`${this.options.keyPrefix || \"\"}${name}`, value, 'ex', timeout]);\n  }\n\n  /**\n   * 以秒为单位，返回给定 key 的剩余生存时间\n   * @param name\n   * @returns {*}\n   */\n  ttl(name: string): Promise<number> {\n    return this.wrap('ttl', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 设置key超时属性\n   * @param name\n   * @param timeout\n   */\n  expire(name: string, timeout: number): Promise<number> {\n    return this.wrap('expire', [`${this.options.keyPrefix || \"\"}${name}`, timeout]);\n  }\n\n  /**\n   *\n   *\n   * @param {*} name\n   * @returns\n   */\n  del(name: string): Promise<number> {\n    return this.wrap('del', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 判断key是否存在\n   * @param name\n   */\n  exists(name: string): Promise<number> {\n    return this.wrap('exists', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 自增\n   * @param name\n   */\n  incr(name: string): Promise<number> {\n    return this.wrap('incr', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 自减\n   * @param name\n   * @returns {*}\n   */\n  decr(name: string): Promise<number> {\n    return this.wrap('decr', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 将 key 所储存的值增加增量 \n   * @param name\n   * @param incr\n   * @returns {*}\n   */\n  incrby(name: string, increment: number): Promise<number> {\n    return this.wrap('incrby', [`${this.options.keyPrefix || \"\"}${name}`, increment]);\n  }\n\n  /**\n   * 将 key 所储存的值减去减量 \n   * \n   * @param {any} name \n   * @param {any} decr \n   */\n  decrby(name: string, decrement: number): Promise<number> {\n    return this.wrap('decrby', [`${this.options.keyPrefix || \"\"}${name}`, decrement]);\n  }\n\n  /**\n   * 哈希写入\n   * @param name\n   * @param key\n   * @param value\n   * @param timeout\n   */\n  async hset(name: string, key: string, value: string | number, timeout?: number): Promise<number> {\n    // MemoryStore 直接支持字段级 TTL，传递 timeout 参数\n    return this.wrap('hset', [`${this.options.keyPrefix || \"\"}${name}`, key, value, timeout]);\n  }\n\n  /**\n   * 哈希获取\n   * @param name\n   * @param key\n   * @returns {*}\n   */\n  hget(name: string, key: string): Promise<string | null> {\n    // 直接调用底层实现，TTL 检查在 MemoryCache 中处理\n    return this.wrap('hget', [`${this.options.keyPrefix || \"\"}${name}`, key]);\n  }\n\n  /**\n   * 查看哈希表 hashKey 中，给定域 key 是否存在\n   * @param name\n   * @param key\n   * @returns {*}\n   */\n  hexists(name: string, key: string): Promise<number> {\n    // 直接调用底层实现，TTL 检查在 MemoryCache 中处理\n    return this.wrap('hexists', [`${this.options.keyPrefix || \"\"}${name}`, key]);\n  }\n\n  /**\n   * 哈希删除\n   * @param name\n   * @param key\n   * @returns {*}\n   */\n  async hdel(name: string, key: string): Promise<number> {\n    // 直接调用底层实现，TTL 清理在 MemoryCache 中处理\n    return this.wrap('hdel', [`${this.options.keyPrefix || \"\"}${name}`, key]);\n  }\n\n  /**\n   * 返回哈希表 key 中域的数量\n   * @param name\n   * @returns {*}\n   */\n  hlen(name: string): Promise<number> {\n    return this.wrap('hlen', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 给哈希表指定key，增加increment\n   * @param name\n   * @param key\n   * @param increment\n   * @returns {*}\n   */\n  hincrby(name: string, key: string, increment: number): Promise<number> {\n    return this.wrap('hincrby', [`${this.options.keyPrefix || \"\"}${name}`, key, increment]);\n  }\n\n  /**\n   * 返回哈希表所有key-value\n   * @param name\n   * @returns {*}\n   */\n  hgetall(name: string): Promise<any> {\n    return this.wrap('hgetall', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 返回哈希表所有key\n   * @param name\n   * @returns {*}\n   */\n  hkeys(name: string): Promise<string[]> {\n    return this.wrap('hkeys', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 返回哈希表所有value\n   * @param name\n   * @returns {*}\n   */\n  hvals(name: string): Promise<any[]> {\n    return this.wrap('hvals', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 判断列表长度，若不存在则表示为空\n   * @param name\n   * @returns {*}\n   */\n  llen(name: string): Promise<number> {\n    return this.wrap('llen', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 将值插入列表表尾\n   * @param name\n   * @param value\n   * @returns {*}\n   */\n  rpush(name: string, value: string | number): Promise<number> {\n    return this.wrap('rpush', [`${this.options.keyPrefix || \"\"}${name}`, value]);\n  }\n\n  /**\n   *\n   *\n   * @param {string} name\n   * @param {(string | number)} value\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  lpush(name: string, value: string | number): Promise<number> {\n    return this.wrap('lpush', [`${this.options.keyPrefix || \"\"}${name}`, value]);\n  }\n\n  /**\n   * 将列表表头取出，并去除\n   * @param name\n   * @returns {*}\n   */\n  lpop(name: string): Promise<string | null> {\n    return this.wrap('lpop', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   *\n   *\n   * @param {string} name\n   * @returns {*}  \n   * @memberof RedisStore\n   */\n  rpop(name: string): Promise<string | null> {\n    return this.wrap('rpop', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 返回列表 key 中指定区间内的元素，区间以偏移量 start 和 stop 指定\n   * @param name\n   * @param start\n   * @param stop\n   * @returns {*}\n   */\n  lrange(name: string, start: number, stop: number): Promise<any[]> {\n    return this.wrap('lrange', [`${this.options.keyPrefix || \"\"}${name}`, start, stop]);\n  }\n\n  /**\n   * 集合新增\n   * @param name\n   * @param value\n   * @param timeout\n   * @returns {*}\n   */\n  async sadd(name: string, value: string | number, timeout?: number): Promise<number> {\n    const result = await this.wrap('sadd', [`${this.options.keyPrefix || \"\"}${name}`, value]);\n    if (typeof timeout === 'number') {\n      await this.wrap('expire', [`${this.options.keyPrefix || \"\"}${name}`, timeout]);\n    }\n    return result;\n  }\n\n  /**\n   * 返回集合的基数(集合中元素的数量)\n   * @param name\n   * @returns {*}\n   */\n  scard(name: string): Promise<number> {\n    return this.wrap('scard', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 判断 member 元素是否集合的成员\n   * @param name\n   * @param key\n   * @returns {*}\n   */\n  sismember(name: string, key: string): Promise<number> {\n    return this.wrap('sismember', [`${this.options.keyPrefix || \"\"}${name}`, key]);\n  }\n\n  /**\n   * 返回集合中的所有成员\n   * @param name\n   * @returns {*}\n   */\n  smembers(name: string): Promise<any[]> {\n    return this.wrap('smembers', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 移除并返回集合中的一个随机元素\n   * @param name\n   * @returns {*}\n   */\n  spop(name: string): Promise<any> {\n    return this.wrap('spop', [`${this.options.keyPrefix || \"\"}${name}`]);\n  }\n\n  /**\n   * 移除集合 key 中的一个 member 元素\n   * @param name\n   * @param key\n   * @returns {*}\n   */\n  srem(name: string, key: string): Promise<number> {\n    return this.wrap('srem', [`${this.options.keyPrefix || \"\"}${name}`, key]);\n  }\n\n  /**\n   * 将 member 元素从 source 集合移动到 destination 集合\n   * @param source\n   * @param destination\n   * @param member\n   * @returns {*}\n   */\n  smove(source: string, destination: string, member: string): Promise<number> {\n    return this.wrap('smove', [`${this.options.keyPrefix || \"\"}${source}`, `${this.options.keyPrefix || \"\"}${destination}`, member]);\n  }\n\n  /**\n   * Begin a transaction\n   * Note: Only supported by RedisStore, will throw error for MemoryStore\n   * @returns {Promise<void>}\n   */\n  async beginTransaction(): Promise<void> {\n    if (this.client && typeof (this.client as any).beginTransaction === 'function') {\n      return (this.client as any).beginTransaction();\n    }\n    throw new Error('Transactions are not supported by the current store type.');\n  }\n\n  /**\n   * Commit a transaction\n   * Note: Only supported by RedisStore, will throw error for MemoryStore\n   * @returns {Promise<void>}\n   */\n  async commit(): Promise<void> {\n    if (this.client && typeof (this.client as any).commit === 'function') {\n      return (this.client as any).commit();\n    }\n    throw new Error('Transactions are not supported by the current store type.');\n  }\n\n  /**\n   * Rollback a transaction\n   * Note: Only supported by RedisStore, will throw error for MemoryStore\n   * @returns {Promise<void>}\n   */\n  async rollback(): Promise<void> {\n    if (this.client && typeof (this.client as any).rollback === 'function') {\n      return (this.client as any).rollback();\n    }\n    throw new Error('Transactions are not supported by the current store type.');\n  }\n\n}"]}