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。
