docs: function RedisStore(options) {
    if (!(this instanceof RedisStore)) {
      return new RedisStore(options);
    }
  
    EventEmitter.call(this);
    options = options || {};
  
    let client;
    options.password =
      options.password || options.auth_pass || options.pass || null; // For backwards compatibility
    options.path = options.path || options.socket || null; // For backwards compatibility
    if (!options.client) {
      //
      // TODO: we should probably omit custom options we have
      // in this lib from `options` passed to instances below
      //
      if (options.isRedisCluster) {
        debug('Initializing Redis Cluster');
        delete options.isRedisCluster;
        client = new Redis.Cluster(options.nodes, options.clusterOptions);
      } else {
        debug('Initializing Redis');
        delete options.isRedisCluster;
        delete options.nodes;
        delete options.clusterOptions;
        client = new Redis(options);
      }
    } else if (options.duplicate) {
      // Duplicate client and update with options provided
      debug('Duplicating provided client with new options (if provided)');
      const dupClient = options.client;
      delete options.client;
      delete options.duplicate;
      client = dupClient.duplicate(options); // Useful if you want to use the DB option without adjusting the client DB outside koa-redis
    } else {
      debug('Using provided client');
      client = options.client;
    }
  
    if (options.db) {
      debug('selecting db %s', options.db);
      client.select(options.db);
      client.on('connect', () => {
        client.send_anyways = true;
        client.select(options.db);
        client.send_anyways = false;
      });
    }
  
    ['connect', 'ready', 'error', 'close', 'reconnecting', 'end'].forEach(
      name => {
        this.on(name, () => debug(`redis ${name}`));
        client.on(name, this.emit.bind(this, name));
      }
    );
  
    // For backwards compatibility
    client.on('end', this.emit.bind(this, 'disconnect'));
  
    this.client = client;
  
    Object.defineProperty(this, 'status', {
      get() {
        return this.client.status;
      }
    });
  
    Object.defineProperty(this, 'connected', {
      get() {
        return ['connect', 'ready'].includes(this.status);
      }
    });
  
    // Support optional serialize and unserialize
    this.serialize =
      (typeof options.serialize === 'function' && options.serialize) ||
      JSON.stringify;
    this.unserialize =
      (typeof options.unserialize === 'function' && options.unserialize) ||
      JSON.parse;
  }