
    \i!                         d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m	Z	m
Z
  ej                  e      Z G d d      Z e       ZddgZy)zg
Redis Cache Service for QuantEdge AI
Replaces MySQL NBACacheEntry with high-performance Redis caching
    N)AnyOptionalDict)datetime	timedeltac                      e Zd ZdZd5dedededee   fdZded	ed
efdZ	ded
ee   fdZ
d6dededed
efdZded
efdZded
efdZd7deded
ee   fdZd8dedededed
ef
dZd9ded
ee   fdZd:dededed
efdZd
ee   fdZd;deded
efdZd ed!ed"eeef   d
eeeef      fd#Z	 d<d ed!ed"eeef   d$eeef   d%ed
efd&Zd'ed!ed"eeef   d
eeeef      fd(Z	 d=d'ed!ed"eeef   d)eeef   d%ed
efd*Zd
eeef   fd+Zd
efd,Zd
efd-Zd
efd.Zd6d/ed0eded
efd1Zd/ed
ee   fd2Z d/ed
efd3Z!d>ded
efd4Z"y)?CacheServicezRedis-based caching serviceNhostportdbpasswordc           	      ,   	 t        j                  ||||ddd      | _         | j                   j                          t        j	                  d       d| _        y # t         j                  $ r& t        j                  d       d| _        d | _         Y y w xY w)NT   )r
   r   r   r   decode_responsessocket_timeoutsocket_connect_timeoutu!   ✅ Redis cache service connectedu)   ❌ Redis not available, caching disabledF)redisRedispingloggerinfoenabledConnectionErrorwarning)selfr
   r   r   r   s        cache_service.py__init__zCacheService.__init__   s    	!!% '(DJ JJOOKK;<DL$$ 	NNFG DLDJ	s   AA 6BBprefixdatareturnc                     t        |t              rt        j                  |d      }nt	        |      }t        j                  |j                               }| d|j                         dd  S )zCreate a consistent cache keyT)	sort_keys:N   )	
isinstancedictjsondumpsstrhashlibmd5encode	hexdigest)r   r   r   data_strhash_objs        r   	_make_keyzCacheService._make_key'   s^    dD!zz$$7H4yH ;;x018--/4566    keyc                     | j                   r| j                  sy	 | j                  j                  |      }|rt        j                  |      S 	 y# t
        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zGet value from cacheNzCache get error: )r   r   getr'   loads	Exceptionr   error)r   r2   r   es       r   r4   zCacheService.get3   sq    ||4::	2::>>#&Dzz$'' 
   	2LL,QC011	2s   1A 	A:A55A:valuettl_secondsc                     | j                   r| j                  sy	 t        j                  |      }| j                  j	                  |||      S # t
        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zSet value in cache with TTLFzCache set error: N)r   r   r'   r(   setexr6   r   r7   )r   r2   r9   r:   r   r8   s         r   setzCacheService.setA   se    ||4::	::e$D::##Cd;; 	LL,QC01	s   1A 	A8A33A8c                     | j                   r| j                  sy	 t        | j                  j                  |            S # t        $ r"}t
        j                  d|        Y d}~yd}~ww xY w)zDelete key from cacheFzCache delete error: N)r   r   booldeleter6   r   r7   )r   r2   r8   s      r   r@   zCacheService.deleteM   sX    ||4::	

))#.// 	LL/s34	s   #? 	A*A%%A*patternc                    | j                   r| j                  sy	 | j                  j                  |      }|r | j                  j                  | S 	 y# t        $ r"}t
        j                  d|        Y d}~yd}~ww xY w)zClear all keys matching patternr   zCache clear pattern error: N)r   r   keysr@   r6   r   r7   )r   rA   rC   r8   s       r   clear_patternzCacheService.clear_patternX   sy    ||4::	<::??7+D(tzz(($// 
   	<LL6qc:;;	<s   5A 	A>A99A>seasonlimitc                 N    | j                  d||d      }| j                  |      S )zGet cached NBA games data	nba_gamesrE   rF   r0   r4   )r   rE   rF   r2   s       r   get_nba_gameszCacheService.get_nba_gamesg   s%    nn[Ve*LMxx}r1   games	ttl_hoursc                 X    | j                  d||d      }| j                  |||dz        S )zCache NBA games datarH   rI     r0   r=   )r   rL   rE   rF   rM   r2   s         r   set_nba_gameszCacheService.set_nba_gamesl   s/    nn[Ve*LMxxUI$455r1   c                 L    | j                  dd|i      }| j                  |      S )zGet cached NBA players datanba_playersrF   rJ   )r   rF   r2   s      r   get_nba_playerszCacheService.get_nba_playersq   s%    nn]We,<=xx}r1   playersc                 V    | j                  dd|i      }| j                  |||dz        S )zCache NBA players datarS   rF   rO   rP   )r   rU   rF   rM   r2   s        r   set_nba_playerszCacheService.set_nba_playersv   s/    nn]We,<=xxWi$&677r1   c                 (    d}| j                  |      S )zGet cached NBA teams data	nba_teamsr4   )r   r2   s     r   get_nba_teamszCacheService.get_nba_teams{   s    xx}r1   teamsc                 2    d}| j                  |||dz        S )zACache NBA teams data (longer TTL since teams change infrequently)rY   rO   r=   )r   r\   rM   r2   s       r   set_nba_teamszCacheService.set_nba_teams   s    xxUI$455r1   strategy_namemarketparamsc                 P    | j                  d|||d      }| j                  |      S )zGet cached backtest resultbackteststrategyra   rb   rJ   )r   r`   ra   rb   r2   s        r   get_backtest_resultz CacheService.get_backtest_result   s0    nnZ%*
 
 xx}r1   resultttl_minutesc                 Z    | j                  d|||d      }| j                  |||dz        S )zCache backtest resultrd   re   <   rP   )r   r`   ra   rb   rh   ri   r2   s          r   set_backtest_resultz CacheService.set_backtest_result   s<     nnZ%*
 
 xxV[2%566r1   strategy_codec                     | j                  dt        j                  |j                               j	                         dd ||d      }| j                  |      S )zGet cached strategy signalsstrategy_signalsNr$   	code_hashra   rb   )r0   r*   r+   r,   r-   r4   )r   rm   ra   rb   r2   s        r   get_strategy_signalsz!CacheService.get_strategy_signals   sS    nn/ ]%9%9%;<FFH"M2
 
 xx}r1   signalsc                     | j                  dt        j                  |j                               j	                         dd ||d      }| j                  |||dz        S )zCache strategy signalsro   Nr$   rp   rk   )r0   r*   r+   r,   r-   r=   )r   rm   ra   rb   rs   ri   r2   s          r   set_strategy_signalsz!CacheService.set_strategy_signals   s_     nn/ ]%9%9%;<FFH"M2
 
 xxWkB&677r1   c                    | j                   r| j                  sddiS 	 | j                  j                         }| j                  j                  d      }dt	        |      |j                  dd      |j                  dd      |j                  d	d      d
S # t        $ r0}t        j                  d|        dt        |      dcY d}~S d}~ww xY w)zGet cache statisticsr   F*Tused_memory_humanunknownconnected_clientsr   uptime_in_days)r   
total_keysmemory_usedrz   uptime_dayszCache stats error: )r   r7   N)
r   r   r   rC   lenr4   r6   r   r7   r)   )r   r   rC   r8   s       r   	get_statszCacheService.get_stats   s    ||4::u%%	7::??$D::??3'D!$i#xx(;YG%)XX.A1%E#xx(8!<   	7LL.qc23$s1v66	7s   A5B 	C%CCCc                 H    g d}d}|D ]  }|| j                  |      z  } |S )zClear all NBA-related cache)znba_games:*znba_players:*rY   r   rD   )r   patternstotal_deletedrA   s       r   clear_nba_cachezCacheService.clear_nba_cache   s6    @ 	9GT//88M	9r1   c                 $    | j                  d      S )z Clear all backtest-related cachez
backtest:*r   )r   s    r   clear_backtest_cachez!CacheService.clear_backtest_cache   s    !!,//r1   c                     | j                   r| j                  sy	 | j                  j                         S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zClear all cache datar   zClear all cache error: N)r   r   flushdbr6   r   r7   )r   r8   s     r   clear_all_cachezCacheService.clear_all_cache   sQ    ||4::	::%%'' 	LL21#67	s   5 	A AA job_idjob_datac                 2    d| }| j                  |||      S )zStore a backtest job in Redisjob:r^   )r   r   r   r:   r2   s        r   set_jobzCacheService.set_job   s     VHoxxX{33r1   c                 .    d| }| j                  |      S )z"Retrieve a backtest job from Redisr   rZ   r   r   r2   s      r   get_jobzCacheService.get_job   s    VHoxx}r1   c                 .    d| }| j                  |      S )z Delete a backtest job from Redisr   )r@   r   s      r   
delete_jobzCacheService.delete_job   s    VHo{{3r1   c                     | j                   r| j                  sg S 	 | j                  j                  |      S # t        $ r$}t        j                  d|        g cY d}~S d}~ww xY w)z"List all job keys matching patternzList jobs error: N)r   r   rC   r6   r   r7   )r   rA   r8   s      r   	list_jobszCacheService.list_jobs   sU    ||4::I	::??7++ 	LL,QC01I	s   7 	A$ AA$A$)	localhosti  r   N)rO   )2023-24d   )r   r      )r   )r   r   )   )rk   )   )zjob:*)#__name__
__module____qualname____doc__r)   intr   r   r   r0   r4   r?   r=   r@   rD   listrK   rQ   rT   rW   r[   r_   r   rg   rl   rr   ru   r   r   r   r   r   r   r   r    r1   r   r	   r	      s   %S c c YabeYf (
7 
73 
73 
7s x} 
s 
3 
S 
D 
	# 	$ 	S S C C (SW. 
64 6 6 6_b 6lp 6
S 8D> 
8t 8C 8# 8W[ 8
x~ 
64 6C 6$ 6 c 4PSUXPX> ^fgkloqtltgu^v  GI7 7c 74PSUXPX> 7#'S>7@C7MQ7# s DQTVYQYN _ghlmprumuhv_w  HJ8# 8s 8DQTVYQYN 8$(cN8AD8NR874S> 7& 0c 0	 	4c 4T 4 4t 4
c htn 
     
 4 r1   r	   cache_service)r   r   r'   r*   loggingtypingr   r   r   r   r   	getLoggerr   r   r	   r   __all__r   r1   r   <module>r      sU   
     & & (			8	$a aH  ?
+r1   