1. 程式人生 > >Python Redis

Python Redis

resp blog rem push 發布 while transacti spa def

一、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)
技術分享

Python Redis