天天看點

Python—redis

一、redis

  redis是一個key-value存儲系統。和Memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。

  Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP用戶端,使用很友善,Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。從盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。

二、python操作redis

1、連接配接方式

  redis-py提供兩個類Redis和StrictRedis用于實作Redis的指令,StrictRedis用于實作大部分官方的指令,并使用官方的文法和指令,Redis是StrictRedis的子類

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis

r = redis.Redis(host='192.168.0.110', port=6379,db=0)
r.set('name', 'zhangsan')   #添加
print (r.get('name'))   #擷取      

2、連接配接池

  redis-py使用connection pool來管理對一個redis server的所有連接配接,避免每次建立、釋放連接配接的開銷。預設,每個Redis執行個體都會維護一個自己的連接配接池。可以直接建立一個連接配接池,然後作為參數Redis,這樣就可以實作多個Redis執行個體共享一個連接配接池。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis

pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan')   #添加
print (r.get('name'))   #擷取      

3、操作

 redis詳細操作指令

4、管道

  redis-py預設在執行每次請求都會建立(連接配接池申請連接配接)和斷開(歸還連接配接池)一次連接配接操作,如果想要在一次請求中指定多個指令,則可以使用pipline實作一次請求指定多個指令,并且預設情況下一次pipline 是原子性操作。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)

pipe = r.pipeline(transaction=True)

r.set('name', 'zhangsan')
r.set('name', 'lisi')

pipe.execute()      

5、釋出和訂閱

首先定義一個RedisHelper類,連接配接Redis,定義頻道為monitor,定義釋出(publish)及訂閱(subscribe)方法。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis

class RedisHelper(object):
    def __init__(self):
        self.__conn = redis.Redis(host='192.168.0.110',port=6379)#連接配接Redis
        self.channel = 'monitor' #定義名稱

    def publish(self,msg):#定義釋出方法
        self.__conn.publish(self.channel,msg)
        return True

    def subscribe(self):#定義訂閱方法
        pub = self.__conn.pubsub()
        pub.subscribe(self.channel)
        pub.parse_response()
        return pub      

釋出者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#釋出
from RedisHelper import RedisHelper

obj = RedisHelper()
obj.publish('hello')#釋出      

訂閱者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#訂閱
from RedisHelper import RedisHelper

obj = RedisHelper()
redis_sub = obj.subscribe()#調用訂閱方法

while True:
    msg= redis_sub.parse_response()
    print (msg)