Redis初體驗
前兩天整理使用Python爬蟲下載電子書一文時,提過要給爬蟲程序增加緩存處理。後面花了2天時間把Redis用法摸熟,然後在Mac上配置好了Redis環境。搭好環境後,發現那個爬蟲程序其實非常簡單,使出Redis有點大材小用,於是把Redis用在緩存股票數據上面,結果效果非常好。
關於Redis的緩存處理,我參考了陳皓老師緩存更新的套路文中提到的"Cache Aside Pattern"模式,來進行緩存設計,下面直接引用他博客裡面的內容,非常受啟發。
- 失效:應用程序先從cache取數據,沒有得到,則從資料庫中取數據,成功後,放到緩存中。
- 命中:應用程序從cache中取數據,取到後返回。
- 更新:先把數據存到資料庫中,成功後,再讓緩存失效。
參考上面的兩張圖,在寫資料庫操作後面,增加寫入Redis處理,代碼塊就不貼了;讀取數據操作變成"先讀Redis再讀資料庫"這種模式。
def get_df_from_redis_then_db(table_name): """ get_df_from_redis_then_db: 獲取指定df數據。先讀緩存,如果找到,直接返回緩存;如果緩存沒有, 從資料庫讀取數據,讀取成功後,將資料庫數據寫入緩存。 Parameters ---------- table_name:表名 Return ------ dataframe:返回表名對應的df """ try: df_from_redis = get_df_from_redis(table_name) except: try: df_from_db = fetch_table_from_db(table_name) except Exception as e: print_msg(PGMname, fetch_table_from_db.func_name, error, e) else: print_msg(PGMname, fetch_table_from_db.func_name, success) try: set_df_to_redis(df_from_db, table_name) except Exception as e: print_msg(PGMname, set_df_to_redis.func_name, error, e) else: print_msg(PGMname, set_df_to_redis.func_name, success) return df_from_db else: print_msg(PGMname, get_df_from_redis_then_db.func_name, success) return df_from_redis
程序跑完後,查看寫進Redis裡面的記錄,總共有91條。
JacksonShawnMBP:bin jacksonshawn$ ./redis-cli127.0.0.1:6379> keys * 1) "fund_holdings2016q1" 2) "debtpaying_data2016q3" 3) "report_data2017q3" 4) "k_data" 5) "growth_data2015" 6) "profit_data2017q3" 7) "fund_holdings2015q4" 8) "operation_data2015q1" 9) "debtpaying_data2015"10) "operation_data2016q1"11) "xsg_data"12) "profit_data2016q4"13) "report_data2015q4"14) "growth_data2016q1"15) "debtpaying_data2017"16) "growth_data2017q4"17) "today_all"18) "debtpaying_data2017q2"19) "growth_data2015q2"20) "operation_data2016q2"21) "report_data2016q3"22) "st_classified"23) "profit_data2017q2"24) "profit_data2017q4"25) "debtpaying_data2016"26) "growth_data2017q3"27) "profit_data2017q1"28) "report_data2017"29) "report_data2015q2"30) "growth_data2017"31) "report_data2017q4"32) "debtpaying_data2017q3"33) "debtpaying_data2015q4"34) "operation_data2015q3"35) "fund_holdings2016q4"36) "debtpaying_data2017q4"37) "report_data2015q1"38) "fund_holdings2015q1"39) "profit_data2015q3"40) "new_stocks"41) "profit_data2016"42) "profit_data2017"43) "day_all"44) "report_data2015"45) "growth_data2015q4"46) "debtpaying_data2015q3"47) "fund_holdings2017q2"48) "operation_data2016q4"49) "report_data2017q2"50) "fund_holdings2015q2"51) "growth_data2015q1"52) "fund_holdings2016q2"53) "growth_data2017q2"54) "report_data2016q2"55) "fund_holdings2017q1"56) "fund_holdings2017q4"57) "growth_data2016q3"58) "fund_holdings2015q3"59) "report_data2016"60) "report_data2017q1"61) "profit_data2016q1"62) "profit_data2015q4"63) "debtpaying_data2017q1"64) "debtpaying_data2016q4"65) "industry_classified"66) "report_data2016q1"67) "debtpaying_data2016q2"68) "profit_data2015q1"69) "profit_data2016q2"70) "report_data2016q4"71) "fund_holdings2017q3"72) "debtpaying_data2015q1"73) "debtpaying_data2015q2"74) "operation_data2016q3"75) "operation_data2015q2"76) "Stockxsg"77) "operation_data2016"78) "fund_holdings2016q3"79) "growth_data2016"80) "debtpaying_data2016q1"81) "stock_basics"82) "profit_data2015"83) "profit_data2015q2"84) "growth_data2016q4"85) "operation_data2015q4"86) "growth_data2016q2"87) "operation_data2015"88) "growth_data2017q1"89) "report_data2015q3"90) "profit_data2016q3"91) "growth_data2015q3"
查看Redis消耗的內存空間,目前總共102.76M。相比MBP 8G的內存,這點消耗還算好,如果哪天到了500M,可能就要採用LRU策略來對這些key-value數據進行處理了。
# Memoryused_memory:107750736used_memory_human:102.76M
另外,使用Redis存儲和讀取DataFrame,在網上搜到如下方式,親測有效。我採用的就是這種方式,至於有沒有其它更好的方法,目前暫時沒有時間去研究。
set:
redisConn.set("key", df.to_msgpack(compress=zlib))get:pd.read_msgpack(redisConn.get("key"))
原文出處:
Redis初體驗參考資料:
- Mac系統安裝Redis
- Redis 配置
- mac下設置redis開機啟動方法步驟
- andymccurdy/redis-py
- Welcome to redis-py』s documentation!
推薦閱讀:
※【翻譯】《利用Python進行數據分析·第2版》第5章(中)pandas入門
※Pandas學習-6concat合併
※pandas dataFrame 繪圖函數—plot學習筆記
※Pandas學習-8pandas plot圖表