Skip to main content
Glama

backup_create

Create Redis database backups with customizable filename, path, and key pattern filters to protect your data.

Instructions

创建 Redis 数据备份

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filenameNo备份文件名(可选)
pathNo备份路径(可选)
includePatternsNo包含的键模式数组(可选,默认为 ["*"])
excludePatternsNo排除的键模式数组(可选)

Implementation Reference

  • The MCP tool handler method for 'backup_create' that ensures Redis connection, prepares backup options from args, delegates to RedisBackupService.backup(), and formats the response as MCP content.
    private async handleBackupCreate(args: any) {
      this.ensureRedisConnection();
      if (!this.backupService) {
        throw new McpError(
          ErrorCode.InternalError,
          'Backup service not initialized'
        );
      }
      
      const options: RedisBackupOptions = {
        filename: args.filename,
        path: args.path,
        includePatterns: args.includePatterns,
        excludePatterns: args.excludePatterns
      };
      
      const result = await this.backupService.backup(options);
      
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify(result, null, 2)
          }
        ]
      };
    }
  • Tool metadata and input schema definition for 'backup_create' returned by ListToolsRequestSchema handler.
    {
      name: 'backup_create',
      description: '创建 Redis 数据备份',
      inputSchema: {
        type: 'object',
        properties: {
          filename: { type: 'string', description: '备份文件名(可选)' },
          path: { type: 'string', description: '备份路径(可选)' },
          includePatterns: { 
            type: 'array', 
            items: { type: 'string' },
            description: '包含的键模式数组(可选,默认为 ["*"])' 
          },
          excludePatterns: { 
            type: 'array', 
            items: { type: 'string' },
            description: '排除的键模式数组(可选)' 
          }
        }
      }
    },
  • Registration/dispatch case in the CallToolRequestSchema switch statement that maps 'backup_create' tool calls to the handler method.
    case 'backup_create':
      return await this.handleBackupCreate(args);
  • Core helper method implementing backup logic: processes include/exclude patterns, fetches keys, retrieves data and TTL by Redis data type (string/hash/list/set/zset), saves structured data to timestamped JSON file in backups directory.
    async backup(options: RedisBackupOptions = {}): Promise<RedisOperationResult<string>> {
      try {
        // 设置默认选项
        const filename = options.filename || `redis-backup-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
        const backupPath = options.path || './backups';
        const includePatterns = options.includePatterns || ['*'];
        const excludePatterns = options.excludePatterns || [];
    
        // 确保备份目录存在
        if (!fs.existsSync(backupPath)) {
          fs.mkdirSync(backupPath, { recursive: true });
        }
    
        const fullPath = path.join(backupPath, filename);
        const backupData: Record<string, any> = {};
    
        // 处理包含的模式
        for (const pattern of includePatterns) {
          // 获取匹配的键
          const keysResult = await this.redisService.keys(pattern);
          if (!keysResult.success || !keysResult.data) {
            continue;
          }
    
          const keys = keysResult.data;
          
          // 过滤排除的键
          const filteredKeys = keys.filter(key => {
            return !excludePatterns.some(excludePattern => {
              // 支持简单的通配符匹配
              const regexPattern = excludePattern
                .replace(/\*/g, '.*')
                .replace(/\?/g, '.');
              return new RegExp(`^${regexPattern}$`).test(key);
            });
          });
    
          // 处理每个键
          for (const key of filteredKeys) {
            const typeResult = await this.redisService.type(key);
            if (!typeResult.success || !typeResult.data) {
              continue;
            }
    
            const type = typeResult.data;
            const ttlResult = await this.redisService.ttl(key);
            const ttl = ttlResult.success ? ttlResult.data : -1;
    
            // 根据类型获取数据
            switch (type) {
              case 'string': {
                const valueResult = await this.redisService.get(key);
                if (valueResult.success && valueResult.data !== null) {
                  backupData[key] = {
                    type,
                    ttl,
                    value: valueResult.data
                  };
                }
                break;
              }
              case 'hash': {
                const valueResult = await this.redisService.hgetall(key);
                if (valueResult.success && valueResult.data) {
                  backupData[key] = {
                    type,
                    ttl,
                    value: valueResult.data
                  };
                }
                break;
              }
              case 'list': {
                const valueResult = await this.redisService.lrange(key, 0, -1);
                if (valueResult.success && valueResult.data) {
                  backupData[key] = {
                    type,
                    ttl,
                    value: valueResult.data
                  };
                }
                break;
              }
              case 'set': {
                const valueResult = await this.redisService.smembers(key);
                if (valueResult.success && valueResult.data) {
                  backupData[key] = {
                    type,
                    ttl,
                    value: valueResult.data
                  };
                }
                break;
              }
              case 'zset': {
                const valueResult = await this.redisService.zrange(key, 0, -1, true);
                if (valueResult.success && valueResult.data) {
                  backupData[key] = {
                    type,
                    ttl,
                    value: valueResult.data
                  };
                }
                break;
              }
            }
          }
        }
    
        // 写入备份文件
        fs.writeFileSync(fullPath, JSON.stringify(backupData, null, 2));
    
        return {
          success: true,
          data: `Backup completed successfully. Saved to ${fullPath}`
        };
      } catch (error) {
        return {
          success: false,
          error: `Backup failed: ${error instanceof Error ? error.message : String(error)}`
        };
      }
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pickstar-2002/redis-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server