| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  | import socketio | 
					
						
							|  |  |  | import redis | 
					
						
							|  |  |  | from redis import asyncio as aioredis | 
					
						
							|  |  |  | from urllib.parse import urlparse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-03 03:50:00 +08:00
										 |  |  | def parse_redis_service_url(redis_url): | 
					
						
							| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  |     parsed_url = urlparse(redis_url) | 
					
						
							|  |  |  |     if parsed_url.scheme != "redis": | 
					
						
							|  |  |  |         raise ValueError("Invalid Redis URL scheme. Must be 'redis'.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |         "username": parsed_url.username or None, | 
					
						
							|  |  |  |         "password": parsed_url.password or None, | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  |         "service": parsed_url.hostname or "mymaster", | 
					
						
							| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  |         "port": parsed_url.port or 6379, | 
					
						
							|  |  |  |         "db": int(parsed_url.path.lstrip("/") or 0), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-27 15:51:55 +08:00
										 |  |  | def get_redis_connection(redis_url, redis_sentinels, decode_responses=True): | 
					
						
							|  |  |  |     if redis_sentinels: | 
					
						
							| 
									
										
										
										
											2025-04-03 03:50:00 +08:00
										 |  |  |         redis_config = parse_redis_service_url(redis_url) | 
					
						
							| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  |         sentinel = redis.sentinel.Sentinel( | 
					
						
							| 
									
										
										
										
											2025-03-27 15:51:55 +08:00
										 |  |  |             redis_sentinels, | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  |             port=redis_config["port"], | 
					
						
							|  |  |  |             db=redis_config["db"], | 
					
						
							|  |  |  |             username=redis_config["username"], | 
					
						
							|  |  |  |             password=redis_config["password"], | 
					
						
							|  |  |  |             decode_responses=decode_responses, | 
					
						
							| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Get a master connection from Sentinel | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  |         return sentinel.master_for(redis_config["service"]) | 
					
						
							| 
									
										
										
										
											2025-03-18 15:25:31 +08:00
										 |  |  |     else: | 
					
						
							|  |  |  |         # Standard Redis connection | 
					
						
							|  |  |  |         return redis.Redis.from_url(redis_url, decode_responses=decode_responses) | 
					
						
							| 
									
										
										
										
											2025-03-18 16:28:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-27 15:51:55 +08:00
										 |  |  | def get_sentinels_from_env(sentinel_hosts_env, sentinel_port_env): | 
					
						
							| 
									
										
										
										
											2025-03-27 17:22:49 +08:00
										 |  |  |     if sentinel_hosts_env: | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  |         sentinel_hosts = sentinel_hosts_env.split(",") | 
					
						
							|  |  |  |         sentinel_port = int(sentinel_port_env) | 
					
						
							| 
									
										
										
										
											2025-03-27 17:22:49 +08:00
										 |  |  |         return [(host, sentinel_port) for host in sentinel_hosts] | 
					
						
							|  |  |  |     return [] | 
					
						
							| 
									
										
										
										
											2025-03-18 16:28:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-29 02:47:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-03 03:50:00 +08:00
										 |  |  | def get_sentinel_url_from_env(redis_url, sentinel_hosts_env, sentinel_port_env): | 
					
						
							|  |  |  |     redis_config = parse_redis_service_url(redis_url) | 
					
						
							|  |  |  |     username = redis_config["username"] or "" | 
					
						
							|  |  |  |     password = redis_config["password"] or "" | 
					
						
							| 
									
										
										
										
											2025-04-03 14:24:24 +08:00
										 |  |  |     auth_part = "" | 
					
						
							|  |  |  |     if username or password: | 
					
						
							|  |  |  |         auth_part = f"{username}:{password}@" | 
					
						
							| 
									
										
										
										
											2025-04-03 03:50:00 +08:00
										 |  |  |     hosts_part = ",".join(f"{host}:{sentinel_port_env}" for host in sentinel_hosts_env.split(",")) | 
					
						
							| 
									
										
										
										
											2025-04-03 14:24:24 +08:00
										 |  |  |     return f"redis+sentinel://{auth_part}{hosts_part}/{redis_config['db']}/{redis_config['service']}" |