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的子類

r=redis.Redis(host='xxxxx',port=6379,password='xxxx',db=10,decode_responses=True)

  • db=10 :指連接db10數據庫
  • decode_responses=True :默認將返回結果decode,即將bytes類型改為默認utf-8。
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
    • hash哈希類型:可理解為一個字典嵌套。如{“sesssion_hwm":{"huangwenmin":"123456","wuxufang":"123456"}}
    • 增加/修改數據:  
      • r.hset('Fkey','Skey','value') 
        • Fkey  #外層key/大key,惟一的
        • Skey  #Fkey下的內層key/小key,惟一的。同一個Fkey可以有多個Skey。
    • 刪除數據:  
      • r.hdelete('Fkey','Skey')  #刪除指定小key。刪除不存在的key,不會報錯
    • 查詢數據:
      • r.hget('Fkey','Skey')  # 返回小key對應的值。小key不存在,返回None
      • r.hgetall('session_hwm')  #獲取到hash類型里大key對應的所有的數據。如{b'hxf': b'aaaa', b'wumin': b'hahaha'}。如果大key不存在,返回{}
      • r.hkeys('Fkey')  #返回大key對應的所有小key。當Fkey不存在時,返回空列表[]
      • r.hexits('Fkey','Skey')  #判斷小key是否存在。如果存在,返回True; 如果不存在,返回False
  • 4、公用方法:
    • 刪除數據:
      • r.flushdb()  #清空當前所有的key
      • r.delete('Fkey')  #刪除指定大key。不存在的key,不會報錯
    • 查詢數據:
      • r.ttl('key')  # 返回kdy對應的失效時間。如果key設置時沒有指定失效時間,則用ttl方法時會返回None
      • r.type('key')  #返回類型b'string'
      • r.exists('Fkey')  # 判斷最外層key是否存在。如果存在,返回True; 如果不存在,返回False
      • res.decode()  #如果值為中文,返回結果如:\xe5\xa5\xb3,使用decode()將其轉化為中文。
        • res可以如下:res=r.get('hwm_info')     res=r.hget('session_hwm','huangwenmin')
    • 增加/修改數據:
      • r.expire('Fkey',ExpireTime)   #指定Fkey的失效時間。以秒為單位

5、更多操作及參考

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM