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

相关文章
相关标签/搜索