Python操作redis資料庫
- 2020 年 1 月 16 日
- 筆記
前言:這兩天的事情不多,為了避免之前學習的一點點Python知識遺忘,我在Github上找了一些小項目跟著實踐。之前的工作有寫過相關的Python處理redis處理數據的腳本,但之前沒有養成記錄積累的習慣,所以~~~~(遺忘了),所以趁此機會學習一下Python操作redis。 安裝:
# pip install redis >>> import redis >>> dir(redis) ['AuthenticationError', 'BlockingConnectionPool', 'BusyLoadingError', 'Connection', 'ConnectionError', 'ConnectionPool', 'DataError', 'InvalidResponse', 'PubSubError', 'ReadOnlyError', 'Redis', 'RedisError', 'ResponseError', 'SSLConnection', 'StrictRedis', 'TimeoutError', 'UnixDomainSocketConnection', 'VERSION', 'WatchError', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_compat', 'client', 'connection', 'exceptions', 'from_url', 'int_or_str', 'lock', 'selector', 'utils']
連接redis資料庫:
>>> r = redis.Redis(host='192.168.1.115', port=6379, db=7, password=None, encoding='utf-8') # 默認不支援按指定encoding解析返回值,需要指定 decode_responses=True >>> type(r) <class 'redis.client.Redis'> # redis.client.Redis 對象為大部分的redis命令都實現了介面具體法可以參考對應的redis命令
Python使用連接池來管理redis連接,默認Python會為每一個redis連接創建一個連接池,可以使用 connection_pool 來指定連接池,以此來實現客戶端分片或更精細的控制各個客戶端的管理(這個概念尚不懂,哈哈)。
>>> pool = redis.ConnectionPool(host='192.168.1.115', port=6379, db=7) >>> r = redis.Redis(connection_pool=pool)
操作數據:
>>> r.dbsize() 0 >>> r.set('key1', 'value1') True >>> r.get('key1') b'value1' >>> r.get('key2') >>> for i in range(1000): ... key = 'key%s' % str(i) ... value = 'value{}'.format(str(i)) ... r.set(key, value) ... >>> r.dbsize() 1000 >>> r.randomkey() b'key247' >>> r.get('key247') b'value247' >>> r.scan(0, 'key245*', 500) # *scan命令可以使用對應的*scan_iter,這樣可以避免獲取游標問題 (1022, [b'key245']) >>> r.scan(1022, 'key245*', 500) (0, []) >>> r.delete('key1') # 由於del是Python的保留關鍵字,所有換為delete 1 >>> r.get('key1')
在Python2中默認返回的是str對象,但在Python3中所有返回都是bytes對象,需要自己把bytes解密成是str。
>>> value = r.get('key247') >>> type(value) <class 'bytes'> >>> value.decode(encoding='utf-8') 'value247'
管道:管道可以多條命令以一個請求發送給redis伺服器進行處理,可以顯著的提高效率。
>>> pool = redis.ConnectionPool(host='192.168.1.115', port=6379, db=7, password=None) >>> r = redis.Redis(connection_pool=pool, decode_responses=True, encoding='utf-8') >>> r.set('bing', 'baz') True >>> pipe = r.pipeline(transaction=False) >>> pipe.set('foo1', 'bar1') Pipeline<ConnectionPool<Connection<host=192.168.1.115,port=6379,db=7>>> >>> pipe.get('bing') Pipeline<ConnectionPool<Connection<host=192.168.1.115,port=6379,db=7>>> >>> pipe.execute() [True, b'baz'] # True 為 pipe.set()返回, b'baz' 為pipe.get()返回
關於redis連接關閉問題:
看完整篇文檔之後,我發現並沒有提到redis連接的釋放問題。我記得以前再Python2中使用在最後調用了 closed() 方法,於是查了一下網路資料,發現Python使用連接池來管理redis連接,無需主動關閉連接,連接對象被釋放後對應的連接也會被關閉,按照以前調用 close() 方法其實也是沒有作用的。
後話:我是根據 https://pypi.org/project/redis/ 提供的redis模組官方文檔來學習的,奈何學習redis知識不夠,而且平常很少用到英語,這麼一長篇英文文檔看完注意力還是很難集中,後面的一部分內容就只能大概了解一下,以後如果機會再進行補全。
參考資料:https://pypi.org/project/redis/