python多進程併發redis

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

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

 

這裏主要說明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,系統宕機或應用程序重啓都不能保存住數據app

  • 鏈接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成功後的數據。spa

  • push/pop機制:

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

    擬採用lpush()和brpop()實現,pop能夠從左邊pop,也能夠從右邊pop,這裏採用rpop,根據是否自動建立name,python支持lpush和lpushx。orm

相關文章
相關標籤/搜索