refactor(redis): consolidate ID resolution and remove probabilistic refresh hack

This commit is contained in:
Scott Idem
2026-02-10 17:45:31 -05:00
parent 6d5633dc86
commit 17ae70992f
2 changed files with 23 additions and 140 deletions

View File

@@ -10,13 +10,23 @@ from app.config import settings
log = logging.getLogger(__name__)
# --- Global Redis Client ---
# Using a single client instance with internal connection pooling is more efficient.
redis_client = redis.Redis(
host=settings.REDIS['server'],
port=settings.REDIS['port'],
db=7,
password=None,
decode_responses=True
)
def redis_lookup_id_random(
record_id_random: int|str,
table_name: str,
check_int_id: bool = False,
log_lvl: int = logging.WARNING, # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
minutes: int = 30, # Expire the Redis key after 8 minutes
reset_rate: int = 10, # 1 in 10 chance of resetting the Redis key
minutes: int = 30, # Expire the Redis key after 30 minutes
reset_rate: int = 10, # 1 in 10 chance of resetting the Redis key (DEPRECATED)
) -> str|int|bool|None:
"""
Looks up a record ID in Redis, falling back to SQL if not found.
@@ -66,18 +76,21 @@ def redis_lookup_id_random(
log.error('Missing table_name and record_id_random')
return False
r = redis.Redis(host=settings.REDIS['server'], port=settings.REDIS['port'], db=7, password=None, decode_responses=True)
key_name = f'{table_name}:{record_id_random}'
record_id = r.get(key_name)
# Use the global redis client instead of creating a new one every time
record_id = redis_client.get(key_name)
if record_id and random.randint(1, reset_rate) == 1:
log.warning(f'Redis: Randomly (1/{reset_rate}) setting record_id to None. Key="{key_name}" value="{record_id}" TTL={r.ttl(key_name)} seconds')
record_id = None
# ### SECTION ### THE "RESET RATE" WORKAROUND (DEPRECATED) ###
# This was used to force a SQL lookup occasionally to correct stale data.
# We are disabling this for now to see if the recent logic improvements fixed the root cause.
# if record_id and random.randint(1, reset_rate) == 1:
# log.warning(f'Redis: Randomly (1/{reset_rate}) setting record_id to None. Key="{key_name}" value="{record_id}" TTL={redis_client.ttl(key_name)} seconds')
# record_id = None
if record_id:
r.setex(key_name, datetime.timedelta(minutes=minutes), value=record_id)
log.info(f'Redis: Entry found for: Key="{key_name}" value="{record_id}" TTL={r.ttl(key_name)} seconds')
redis_client.setex(key_name, datetime.timedelta(minutes=minutes), value=record_id)
log.info(f'Redis: Entry found for: Key="{key_name}" value="{record_id}" TTL={redis_client.ttl(key_name)} seconds')
return int(record_id)
elif table_name:
data = { 'id_random': record_id_random }
@@ -88,7 +101,7 @@ def redis_lookup_id_random(
if isinstance(select_results, dict):
log.info(f"""SQL: Found ID Random for: {str(record_id_random)} = {str(select_results.get('id'))}""")
if record_id := select_results.get('id'):
r.setex(key_name, datetime.timedelta(minutes=minutes), value=record_id)
redis_client.setex(key_name, datetime.timedelta(minutes=minutes), value=record_id)
return int(record_id)
else:
log.error('The SQL result was not what was expected. The ID field was not found.')