test_redis_modules.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Redis模块测试脚本
  5. 用于检测Redis服务器是否安装了RediSearch和ReJSON模块
  6. """
  7. import redis
  8. import sys
  9. from typing import Dict, Any
  10. def test_redis_modules(host: str = 'localhost', port: int = 6379, password: str = None, db: int = 0) -> Dict[str, Any]:
  11. """
  12. 测试Redis服务器是否安装了RediSearch和ReJSON模块
  13. Args:
  14. host: Redis服务器地址
  15. port: Redis服务器端口
  16. password: Redis密码(可选)
  17. db: 数据库编号
  18. Returns:
  19. 包含测试结果的字典
  20. """
  21. results = {
  22. 'redis_connection': False,
  23. 'redijson_available': False,
  24. 'redisearch_available': False,
  25. 'errors': []
  26. }
  27. try:
  28. # 连接Redis
  29. r = redis.Redis(host=host, port=port, password=password, db=db, decode_responses=True)
  30. # 测试连接
  31. r.ping()
  32. results['redis_connection'] = True
  33. print(f"✅ Redis连接成功 - {host}:{port}")
  34. except Exception as e:
  35. error_msg = f"❌ Redis连接失败: {str(e)}"
  36. results['errors'].append(error_msg)
  37. print(error_msg)
  38. return results
  39. # 测试RedisJSON
  40. try:
  41. # 尝试设置JSON文档
  42. r.execute_command('JSON.SET', 'test_doc', '$', '{"test":"value"}')
  43. # 尝试获取JSON文档
  44. result = r.execute_command('JSON.GET', 'test_doc')
  45. # 清理测试数据
  46. r.execute_command('JSON.DEL', 'test_doc')
  47. results['redijson_available'] = True
  48. print("✅ RedisJSON 模块可用")
  49. except redis.exceptions.ResponseError as e:
  50. error_msg = f"❌ RedisJSON 模块不可用: {str(e)}"
  51. results['errors'].append(error_msg)
  52. print(error_msg)
  53. except Exception as e:
  54. error_msg = f"❌ RedisJSON 测试失败: {str(e)}"
  55. results['errors'].append(error_msg)
  56. print(error_msg)
  57. # 测试RediSearch
  58. try:
  59. # 尝试创建索引
  60. r.execute_command('FT.CREATE', 'test_idx', 'ON', 'HASH', 'PREFIX', '1', 'test:', 'SCHEMA', 'title', 'TEXT')
  61. # 清理测试索引
  62. r.execute_command('FT.DROPINDEX', 'test_idx')
  63. results['redisearch_available'] = True
  64. print("✅ RediSearch 模块可用")
  65. except redis.exceptions.ResponseError as e:
  66. error_msg = f"❌ RediSearch 模块不可用: {str(e)}"
  67. results['errors'].append(error_msg)
  68. print(error_msg)
  69. except Exception as e:
  70. error_msg = f"❌ RediSearch 测试失败: {str(e)}"
  71. results['errors'].append(error_msg)
  72. print(error_msg)
  73. return results
  74. def main():
  75. """主函数"""
  76. print("=" * 60)
  77. print("Redis模块测试工具")
  78. print("=" * 60)
  79. # 获取用户输入的Redis连接信息
  80. print("\n请输入Redis服务器连接信息:")
  81. host = 'localhost'
  82. port_input = '6379'
  83. password = None
  84. db_input = '0'
  85. try:
  86. port = int(port_input)
  87. db = int(db_input)
  88. except ValueError:
  89. print("❌ 端口和数据库编号必须是数字")
  90. sys.exit(1)
  91. print(f"\n正在测试Redis服务器: {host}:{port}")
  92. print("-" * 40)
  93. # 执行测试
  94. results = test_redis_modules(host=host, port=port, password=password, db=db)
  95. # 输出测试总结
  96. print("\n" + "=" * 60)
  97. print("测试结果总结:")
  98. print("=" * 60)
  99. if results['redis_connection']:
  100. print("✅ Redis连接: 成功")
  101. else:
  102. print("❌ Redis连接: 失败")
  103. if results['redijson_available']:
  104. print("✅ RedisJSON: 已安装")
  105. else:
  106. print("❌ RedisJSON: 未安装")
  107. if results['redisearch_available']:
  108. print("✅ RediSearch: 已安装")
  109. else:
  110. print("❌ RediSearch: 未安装")
  111. if results['errors']:
  112. print(f"\n错误信息:")
  113. for error in results['errors']:
  114. print(f" - {error}")
  115. print("\n" + "=" * 60)
  116. # 返回适当的退出码
  117. if results['redis_connection'] and results['redijson_available'] and results['redisearch_available']:
  118. print("🎉 所有模块都可用!")
  119. sys.exit(0)
  120. else:
  121. print("⚠️ 部分模块不可用,请检查Redis配置")
  122. sys.exit(1)
  123. if __name__ == "__main__":
  124. main()