1. 程式人生 > >python中redis的連線和操作

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可執行單層樹複製。從盤可以有意無意的對資料進行寫操作。由於完全實現了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息釋出記錄。

redis作為非關係型資料庫,其資料時儲存在記憶體中。(MongoDB同為非關係型資料庫,但是MongoDB的資料時儲存在磁碟上的)

redis 安裝:pip install redis

二、redis資料庫的客戶端連線

1、安裝Redis Desktop Manager

 2、開啟,並建立連線,redis預設埠6379,host為redis所在的ip地址

 

三、python操作redis

1、連線方式

  redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類

import  redis
ip = '127.0.0.1'
password 
= '123456' r1=redis.Redis(host=ip,password=password,port=6379,db=0,decode_responses=True)#redis預設連線db0 r2=redis.Redis(host=ip,password=password,port=6378,db=0,decode_responses=True)#decode_responses=True 自動解碼,輸出的結果自動由bytes型別變為字串型別 print(r1.get('name'))

2、連線池

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

連線池:當程式建立資料來源例項時,系統會一次性建立多個數據庫連線,並把這些資料庫連線儲存在連線池中,當程式需要進行資料庫訪問時,無需重新新建資料庫連線,而是從連線池中取出一個空閒的資料庫連線

import  redis
ip = '127.0.0.1'
password = '123456'

conn_pool = redis.ConnectionPool(host=ip,password=password, port=6379)
r = redis.Redis(connection_pool=conn_pool)
r.set('name','zhangsansan')
print(r.get('name'))

3、string操作

set() 新增或修改redis中的資料,r.set(key,value)

set(name, value, ex=None, px=None, nx=False, xx=False)。在Redis中設定值,預設,不存在則建立,存在則修改

引數:
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設定為True,則只有name不存在時,當前set操作才執行
xx,如果設定為True,則只有name存在時,當前set操作才執行

r1.set('zyh001','89898')#redis中設定值,預設不存在則建立,存在則修改
print(r1.get('zyh001'))
r1.set('zyh_info','{"name":"xxxx","password":"123456","account":11234}') #類似字典的形式插入資料

get()檢視操作的資料,r.get(key),通過key去檢視資料,輸出的結果是value值

res  = r1.get('zyh_info') #如果在連線時,沒加decode_responses=True,則預設輸出結果是bytes型別,前面帶b
print('bytes型別輸出是',res)
print('字串型別輸出是',res.decode()) #由bytes型別轉成字串型別;如果在連線時加上decode_responses=True,則可自動轉成字串,此步驟就不需要了,且加入此步驟還會報錯
# s.encode()  字串變成bytes型別

#輸出結果如下
bytes型別輸出是 b'{"name":"xxxx","password":"123456","account":11234}'  #最前面會顯示一個‘b’
字串型別輸出是 {"name":"xxxx","password":"123456","account":11234}

r.delete(key)、r.flushall()、r.flushdb() 刪除資料

r1.delete('zyh001')#刪除這條資料,print的時候存在返回1,不存在返回0.key不存在的話,也不會報錯
r.flushall() #清空所有資料庫裡面的資料
r.flushdb() #只清空當前資料庫裡面的資料,連線時指定的資料庫:db=10

r.keys()獲取表中所有的key

print(r1.keys())

查詢key的模糊匹配操作

print(r1.keys('*info*'))#模糊匹配所有帶info的key,*代表全部

r.expire()指定key的過期時間,到期後此條資料被自動刪除

r.set('qml_session','sdfsdfsdfss')
r.expire('qml_session',30) #指定過期時間為30秒,單位預設是秒

r.type(key) 獲取key的資料型別

print(r.type('sms_code'))
print(r.type('yulin:xxx'))

#輸出結果:
hash
string

4、hash型別的操作

r.hset(key_A, key_a, value_a) 新增或修改

res1=r1.hset('zyh','123456','09876544')#新增值
r1.hset('zyh','123456','1234567') #修改值,有的時候修改,沒有新增
print(r1.hget('zyh','123456'))

查詢單條key操作 r.hget(key_A, key_a)

print(r1.hget('zyh','123456'))

查詢某個大key_A下的所有內容  r.hgetall(key_A)

print(r1.hgetall('zyh'))
#輸出
{'123456': '1234567', '12345678': '1234567'}

刪除指定的key_a   r.hdel(key_A, key_a)

r1.hdel('zyh','12345678')#刪除指定的小key_a,即使key_a不存在,程式也不會報錯
print(r1.hgetall('zyh'))

r.delete(key-A)刪掉整個key的值

r1.delete('zyh')

獲取資料型別 r.type(key_A)

print(r.type('sms_code'))
print(r.type('yulin:xxx'))

#輸出結果:
hash
string

5、更多操作及參考

http://www.cnblogs.com/melonjiang/p/5342505.html

http://www.cnblogs.com/melonjiang/p/5342383.html

https://www.jianshu.com/p/2639549bedc8