python多進程並發redis


Redis支持兩種持久化方式RDB和AOF,RDB持久化能夠快速的儲存和回復數據,但在服務器停機時會丟失大量數據,AOF持久化能夠高效的提高數據的安全性,但在儲存和恢復數據方面要耗費大量的時間,最好的方式是使用RDB-AOF混合持久化。

Redis默認RDB持久化,4.0以上支持混合持久化,首先設置AOF持久化,修改配置文件redis.conf中appendonly yes,然后設置混合持久化aof-use-rdb-preamble yes。

 

這里主要說明redis多進程存儲,獲取對象的三種方式。

  • set、get機制:

數據存儲方式{key:value},AOF持久化能夠保證很高的可靠性。

  • 連接redis:
1 #pool管理對一個redis server的所有連接避免每次建立、釋放連接的開銷
2 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
3 r = redis.StrictRedis(connection_pool=pool)
  • 進程1/2/3…:發布對象
1 r.set(key, pickle.dumps(mem))          
  • 進程N:獲取對象
1 value = r.get(key)
2 value = pickle.loads(value)
  • redis delete數據
1 r.delete(key)
  • pub/sub機制:

程序啟動就一直sub,通過監聽listen()得到數據來獲取對象,類似Queue,系統宕機或應用程序重啟都不能保存住數據

  • 連接redis:
1 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
2 r = redis.StrictRedis(connection_pool=pool)
3 ps = r.pubsub()
4 for channel in channels:
5     ps.subscribe(channel)    #一個channel對應一個進程
  • 進程1/2/3…:發布對象
1 r.publish(mem.topic, pickle.dumps(mem))
  • 進程N: 獲取對象
1 limit=10
2 rows=[]
3 for item in ps.listen():    #獲得listen得到generator
4     if item['type'] == 'message':
5         message = pickle.loads(item['data'])
6         rows.append(message )
7         if len(rows) == limit: #每10個退出,再次運行程序獲取第11個對象
8             break

這里的缺點就是數據取出后就丟失了,redis不會保存subscribe成功后的數據。

  • push/pop機制:

    一個name存儲到一個隊列中, push只管發布,不管對方是否需要都存儲,只要沒有pop都會永久保存在redis中,當對方需要時根據name從相應的隊列pop出來,pop成功后不再保存,感覺這個是比較好用!!!

    擬采用lpush()和brpop()實現,pop可以從左邊pop,也可以從右邊pop,這里采用rpop,根據是否自動創建name,python支持lpush和lpushx。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM