UNPKG

koatty_store

Version:
1,148 lines (1,136 loc) 28.6 kB
/*! * @Author: richen * @Date: 2025-06-09 12:32:53 * @License: BSD (3-Clause) * @Copyright (c) - <richenlin(at)gmail.com> * @HomePage: https://koatty.org/ */ import { Cluster } from 'ioredis'; import { ClusterOptions } from 'ioredis'; import { default as default_2 } from 'ioredis'; import { EventEmitter } from 'events'; import genericPool from 'generic-pool'; import { Redis } from 'ioredis'; import { RedisOptions } from 'ioredis'; /** * * * @export * @class Store */ export declare class CacheStore implements CacheStoreInterface { client: MemoryStore | RedisStore; options: StoreOptions; /** * Creates an instance of CacheStore. * @param {StoreOptions} options * @memberof CacheStore */ constructor(options?: StoreOptions); /** * 获取单例实例,支持多配置实例管理 * @static * @param {StoreOptions} [options] * @param {string} [instanceKey='default'] 实例键名,用于区分不同配置的实例 * @returns {CacheStore} */ static getInstance(options?: StoreOptions, instanceKey?: string): CacheStore; /** * 生成配置哈希 * @private * @static * @param {StoreOptions} options * @returns {string} */ /** * 清理指定实例 * @static * @param {string} [instanceKey='default'] */ static clearInstance(instanceKey?: string): Promise<void>; /** * 清理所有实例 * @static */ static clearAllInstances(): Promise<void>; getConnection(): MemoryCache | Promise<Cluster | default_2>; close(): Promise<void>; release(conn: any): Promise<void>; /** * 获取底层实现客户端,用于访问特定实现的功能 * 例如:Redis的defineCommand, getCompare等 * @returns {MemoryStore | RedisStore} */ getRawClient(): MemoryStore | RedisStore; /** * handler for native client * * @param {string} name * @param {any[]} data * @returns {*} * @memberof RedisStore */ /** * 字符串获取 * @param name */ get(name: string): Promise<string | null>; /** * 字符串写入 * @param name * @param value * @param timeout * @returns {Promise} */ set(name: string, value: string | number, timeout?: number): Promise<string>; /** * 以秒为单位,返回给定 key 的剩余生存时间 * @param name * @returns {*} */ ttl(name: string): Promise<number>; /** * 设置key超时属性 * @param name * @param timeout */ expire(name: string, timeout: number): Promise<number>; /** * * * @param {*} name * @returns */ del(name: string): Promise<number>; /** * 判断key是否存在 * @param name */ exists(name: string): Promise<number>; /** * 自增 * @param name */ incr(name: string): Promise<number>; /** * 自减 * @param name * @returns {*} */ decr(name: string): Promise<number>; /** * 将 key 所储存的值增加增量 * @param name * @param incr * @returns {*} */ incrby(name: string, increment: number): Promise<number>; /** * 将 key 所储存的值减去减量 * * @param {any} name * @param {any} decr */ decrby(name: string, decrement: number): Promise<number>; /** * 哈希写入 * @param name * @param key * @param value * @param timeout */ hset(name: string, key: string, value: string | number, timeout?: number): Promise<number>; /** * 哈希获取 * @param name * @param key * @returns {*} */ hget(name: string, key: string): Promise<string | null>; /** * 查看哈希表 hashKey 中,给定域 key 是否存在 * @param name * @param key * @returns {*} */ hexists(name: string, key: string): Promise<number>; /** * 哈希删除 * @param name * @param key * @returns {*} */ hdel(name: string, key: string): Promise<number>; /** * 返回哈希表 key 中域的数量 * @param name * @returns {*} */ hlen(name: string): Promise<number>; /** * 给哈希表指定key,增加increment * @param name * @param key * @param increment * @returns {*} */ hincrby(name: string, key: string, increment: number): Promise<number>; /** * 返回哈希表所有key-value * @param name * @returns {*} */ hgetall(name: string): Promise<any>; /** * 返回哈希表所有key * @param name * @returns {*} */ hkeys(name: string): Promise<string[]>; /** * 返回哈希表所有value * @param name * @returns {*} */ hvals(name: string): Promise<any[]>; /** * 判断列表长度,若不存在则表示为空 * @param name * @returns {*} */ llen(name: string): Promise<number>; /** * 将值插入列表表尾 * @param name * @param value * @returns {*} */ rpush(name: string, value: string | number): Promise<number>; /** * * * @param {string} name * @param {(string | number)} value * @returns {*} * @memberof RedisStore */ lpush(name: string, value: string | number): Promise<number>; /** * 将列表表头取出,并去除 * @param name * @returns {*} */ lpop(name: string): Promise<string | null>; /** * * * @param {string} name * @returns {*} * @memberof RedisStore */ rpop(name: string): Promise<string | null>; /** * 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定 * @param name * @param start * @param stop * @returns {*} */ lrange(name: string, start: number, stop: number): Promise<any[]>; /** * 集合新增 * @param name * @param value * @param timeout * @returns {*} */ sadd(name: string, value: string | number, timeout?: number): Promise<number>; /** * 返回集合的基数(集合中元素的数量) * @param name * @returns {*} */ scard(name: string): Promise<number>; /** * 判断 member 元素是否集合的成员 * @param name * @param key * @returns {*} */ sismember(name: string, key: string): Promise<number>; /** * 返回集合中的所有成员 * @param name * @returns {*} */ smembers(name: string): Promise<any[]>; /** * 移除并返回集合中的一个随机元素 * @param name * @returns {*} */ spop(name: string): Promise<any>; /** * 移除集合 key 中的一个 member 元素 * @param name * @param key * @returns {*} */ srem(name: string, key: string): Promise<number>; /** * 将 member 元素从 source 集合移动到 destination 集合 * @param source * @param destination * @param member * @returns {*} */ smove(source: string, destination: string, member: string): Promise<number>; } declare interface CacheStoreInterface { getConnection(): any; close(): Promise<void>; release(conn: any): Promise<void>; get?(name: string): Promise<string | null>; set?(name: string, value: string | number, timeout?: number): Promise<string>; del?(name: string): Promise<number>; exists?(name: string): Promise<number>; ttl?(name: string): Promise<number>; expire?(name: string, timeout: number): Promise<number>; incr?(name: string): Promise<number>; decr?(name: string): Promise<number>; incrby?(name: string, increment: number): Promise<number>; decrby?(name: string, decrement: number): Promise<number>; hset?(name: string, key: string, value: string | number, timeout?: number): Promise<number>; hget?(name: string, key: string): Promise<string | null>; hdel?(name: string, key: string): Promise<number>; hexists?(name: string, key: string): Promise<number>; hgetall?(name: string): Promise<any>; hkeys?(name: string): Promise<string[]>; hvals?(name: string): Promise<any[]>; hlen?(name: string): Promise<number>; hincrby?(name: string, key: string, increment: number): Promise<number>; lpush?(name: string, value: string | number): Promise<number>; rpush?(name: string, value: string | number): Promise<number>; lpop?(name: string): Promise<string | null>; rpop?(name: string): Promise<string | null>; llen?(name: string): Promise<number>; lrange?(name: string, start: number, stop: number): Promise<any[]>; sadd?(name: string, value: string | number, timeout?: number): Promise<number>; srem?(name: string, key: string): Promise<number>; scard?(name: string): Promise<number>; sismember?(name: string, key: string): Promise<number>; smembers?(name: string): Promise<any[]>; spop?(name: string): Promise<any>; smove?(source: string, destination: string, member: string): Promise<number>; } declare type CallbackFunction<T = any> = (err: Error | null, result?: T) => void; declare class MemoryCache extends EventEmitter { options: MemoryCacheOptions; currentDBIndex: number; connected: boolean; lastSave: number; multiMode: boolean; /** * Creates an instance of MemoryCache. * @param {MemoryCacheOptions} options * @memberof MemoryCache */ constructor(options: MemoryCacheOptions); /** * 创建LRU缓存实例 */ /** * 启动TTL检查定时器 */ /** * 清理过期键 */ /** * 停止TTL检查 */ /** * * * @returns {*} * @memberof MemoryCache */ createClient(): this; /** * * * @returns {*} * @memberof MemoryCache */ quit(): this; /** * * * @returns {*} * @memberof MemoryCache */ end(): this; /** * 获取缓存统计信息 */ info(): any; /** * 估算内存使用量 */ /** * * * @param {string} message * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ echo(message: string, callback?: CallbackFunction): any; /** * * * @param {string} message * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ ping(message: string, callback?: CallbackFunction): any; /** * * * @param {string} password * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ auth(password: string, callback?: CallbackFunction): any; /** * * * @param {number} dbIndex * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ select(dbIndex: number, callback?: CallbackFunction): any; get(key: string, callback?: CallbackFunction): any; /** * set(key, value, ttl, pttl, notexist, onlyexist, callback) * * @param {string} key * @param {(string | number)} value * @param {...any[]} params * @returns {*} * @memberof MemoryCache */ set(key: string, value: string | number, ...params: any[]): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ ttl(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {number} seconds * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ expire(key: string, seconds: number, callback?: CallbackFunction): any; /** * * * @param {...any[]} keys * @returns {*} * @memberof MemoryCache */ del(...keys: any[]): any; /** * * * @param {...any[]} keys * @returns {*} * @memberof MemoryCache */ exists(...keys: any[]): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ incr(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {number} amount * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ incrby(key: string, amount: number, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ decr(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {number} amount * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ decrby(key: string, amount: number, callback?: CallbackFunction): any; hset(key: string, field: string, value: string | number, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {string} field * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hget(key: string, field: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {string} field * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hexists(key: string, field: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {...any[]} fields * @returns {*} * @memberof MemoryCache */ hdel(key: string, ...fields: any[]): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hlen(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {string} field * @param {*} value * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hincrby(key: string, field: string, value: any, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hgetall(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hkeys(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ hvals(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ llen(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {(string | number)} value * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ rpush(key: string, value: string | number, callback?: CallbackFunction): any; /** * List:从左侧推入 * @param key * @param value * @param callback */ lpush(key: string, value: any, callback?: CallbackFunction): any; /** * List:获取指定索引的元素 * @param key * @param index * @param callback */ lindex(key: string, index: number, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ lpop(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ rpop(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {number} start * @param {number} stop * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ lrange(key: string, start: number, stop: number, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {...any[]} members * @returns {*} * @memberof MemoryCache */ sadd(key: string, ...members: string[]): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ scard(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {string} member * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ sismember(key: string, member: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ smembers(key: string, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {number} [count] * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ spop(key: string, count?: number, callback?: CallbackFunction): any; /** * * * @param {string} key * @param {...any[]} members * @returns {*} * @memberof MemoryCache */ srem(key: string, ...members: any[]): any; /** * * * @param {string} sourcekey * @param {string} destkey * @param {string} member * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ smove(sourcekey: string, destkey: string, member: string, callback?: CallbackFunction): any; discard(callback?: CallbackFunction, silent?: boolean): any; /** * * * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @returns {*} {boolean} * @memberof MemoryCache */ /** * * * @private * @param {*} value * @param {string} type * @param {number} timeout * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {number} amount * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {string} type * @param {boolean} [throwError] * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {(number | string)} value * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {string} field * @param {number} [amount] * @param {boolean} [useFloat] * @param {Function} [callback] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {string} field * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {string} key * @param {string} field * @returns {*} {boolean} * @memberof MemoryCache */ /** * * * @param {string} key * @param {string} field * @param {*} value * @memberof MemoryCache */ _setField(key: string, field: string, value: any): void; /** * * * @private * @param {Function} [callback] * @param {(any)} [message] * @param {*} [error] * @param {boolean} [nolog] * @returns {*} * @memberof MemoryCache */ /** * * * @private * @param {any[]} [params] * @returns {*} * @memberof MemoryCache */ /** * 字符串追加操作 * @param key * @param value * @param callback */ append(key: string, value: string, callback?: CallbackFunction): any; /** * 获取字符串长度 * @param key * @param callback */ strlen(key: string, callback?: CallbackFunction): any; /** * 获取子字符串 * @param key * @param start * @param end * @param callback */ getrange(key: string, start: number, end: number, callback?: CallbackFunction): any; /** * 设置子字符串 * @param key * @param offset * @param value * @param callback */ setrange(key: string, offset: number, value: string, callback?: CallbackFunction): any; /** * 批量获取 * @param keys * @param callback */ mget(...keys: any[]): any; /** * 批量设置 * @param keyValuePairs * @param callback */ mset(...keyValuePairs: any[]): any; /** * 获取所有键 * @param pattern * @param callback */ keys(pattern?: string, callback?: CallbackFunction): any; /** * 简单的模式匹配 * @param key * @param pattern */ /** * 获取随机键 * @param callback */ randomkey(callback?: CallbackFunction): any; /** * 重命名键 * @param oldKey * @param newKey * @param callback */ rename(oldKey: string, newKey: string, callback?: CallbackFunction): any; /** * 安全重命名键(目标键不存在时才重命名) * @param oldKey * @param newKey * @param callback */ renamenx(oldKey: string, newKey: string, callback?: CallbackFunction): any; /** * 获取键的类型 * @param key * @param callback */ type(key: string, callback?: CallbackFunction): any; /** * 清空当前数据库 * @param callback */ flushdb(callback?: CallbackFunction): any; /** * 清空所有数据库 * @param callback */ flushall(callback?: CallbackFunction): any; /** * 获取数据库大小 * @param callback */ dbsize(callback?: CallbackFunction): any; /** * Sorted Set基础实现 - 添加成员 * @param key * @param score * @param member * @param callback */ zadd(key: string, score: number, member: string, callback?: CallbackFunction): any; /** * Sorted Set - 获取成员分数 * @param key * @param member * @param callback */ zscore(key: string, member: string, callback?: CallbackFunction): any; /** * Sorted Set - 获取范围内的成员 * @param key * @param start * @param stop * @param callback */ zrange(key: string, start: number, stop: number, callback?: CallbackFunction): any; /** * Sorted Set - 获取成员数量 * @param key * @param callback */ zcard(key: string, callback?: CallbackFunction): any; /** * Sorted Set - 删除成员 * @param key * @param member * @param callback */ zrem(key: string, member: string, callback?: CallbackFunction): any; } /** * * * @interface MemoryCacheOptions */ declare interface MemoryCacheOptions { database: number; maxKeys?: number; maxMemory?: number; evictionPolicy?: 'lru' | 'lfu' | 'random'; ttlCheckInterval?: number; maxAge?: number; } declare class MemoryStore implements CacheStoreInterface { client: any; pool: any; options: MemoryStoreOpt; /** * Creates an instance of MemoryStore. * @param {MemoryStoreOpt} options * @memberof MemoryStore */ constructor(options: MemoryStoreOpt); /** * getConnection * * @returns {*} * @memberof MemoryStore */ getConnection(): MemoryCache; /** * close * * @returns {*} {Promise<void>} * @memberof MemoryStore */ close(): Promise<void>; /** * release * * @param {*} _conn * @returns {*} {Promise<void>} * @memberof MemoryStore */ release(_conn: any): Promise<void>; /** * defineCommand * * @param {string} _name * @param {*} _scripts * @memberof MemoryStore */ defineCommand(_name: string, _scripts: any): Promise<void>; /** * get and compare value * * @param {string} name * @param {(string | number)} value * @returns {*} {Promise<any>} * @memberof MemoryStore */ getCompare(name: string, value: string | number): Promise<any>; /** * 获取缓存统计信息 */ getStats(): any; } declare interface MemoryStoreOpt { type: string; keyPrefix?: string; db?: number; timeout?: number; maxKeys?: number; maxMemory?: number; evictionPolicy?: 'lru' | 'lfu' | 'random'; ttlCheckInterval?: number; } /** * * * @export * @class RedisStore */ declare class RedisStore implements CacheStoreInterface { options: RedisStoreOpt; pool: genericPool.Pool<Redis | Cluster>; client: Redis | Cluster; /** * Creates an instance of RedisStore. * @param {RedisStoreOpt} options * @memberof RedisStore */ constructor(options: RedisStoreOpt); /** * create connection by native with improved error handling * * @param {number} [connNum=0] * @returns {*} {Promise<Redis | Cluster>} * @memberof RedisStore */ /** * 计划重连,使用指数退避策略 * @private * @param {number} connNum */ /** * get connection from pool with improved configuration * * @returns {*} * @memberof RedisStore */ getConnection(): Promise<Cluster | Redis>; /** * close connection with proper cleanup * * @returns {*} * @memberof RedisStore */ close(): Promise<void>; /** * * * @param {*} conn * @returns {*} * @memberof RedisStore */ release(conn: any): Promise<void>; /** * defineCommand * * @param {string} name * @param {{ numberOfKeys?: number; lua?: string; }} scripts * @returns {*} * @memberof RedisStore */ defineCommand(name: string, scripts: { numberOfKeys?: number; lua?: string; }): Promise<any>; /** * get and compare value * * @param {string} name * @param {(string | number)} value * @returns {*} {Promise<any>} * @memberof RedisStore */ getCompare(name: string, value: string | number): Promise<any>; } /** * @description: * @return {*} */ declare interface RedisStoreOpt extends RedisOptions, ClusterOptions { type: string; timeout?: number; poolSize?: number; clusters?: Array<{ host: string; port: number; }>; } export declare type StoreOptions = MemoryStoreOpt | RedisStoreOpt; export { }