記一次安裝zsh外掛編碼^M異常操作
安裝與連線
安裝redis
使用python操作redis,需要先安裝redis模組,請使用以下命令安裝
pip3 install redis
或python3 -m pip install redis
連線redis
redis庫提供了兩個類Redis和StrictRedis來實現Redis的命令操作。
StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令(如:SET命令對應StrictRedis.set方法)。Redis是StrictRedis的子類,用於向後相容舊版本的redis庫的幾個方法。
官方推薦使用StrictRedis,所以本文主要使用StrictRedis類來進行相關的操作。
注:連線前請確保Redis資料庫已經安裝
直接連線
import redis REDIS_CONFIG = { 'host': 'localhost', # IP 'port': 6379, # 埠 'password': 'abcd1234', # 密碼 'db': 0, # 資料庫 'decode_responses': True # 將存入的資料進行解碼(主要用於將bytes型別轉成string型別) } r = redis.StrictRedis(**REDIS_CONFIG) r.set('name', 'Tom') print(r.get('name'))
執行結果如下:
Tom
上面例子中,REDIS_CONFIG是連線Redis所用到配置引數字典,我們在建立連線物件的時候,這個字典中的引數通過解包(**REDIS_CONFIG)的形式傳入。
r.set(key, value)傳入一個鍵值對,r.get(key)獲取指定鍵的值。
連線池連線
redis庫使用connection pool來管理對一個redis server的所有連線,避免每次建立、釋放連線的開銷。
連線池的作用相當於快取了多個客戶端與redis服務端的連線,當有新的客戶端進來連線時,只需要在連線池獲取一個連線即可。
import redis REDIS_CONFIG = { 'host': 'localhost', # IP 'port': 6379, # 埠 'password': 'abcd1234', # 密碼 'db': 0, # 資料庫 'decode_responses': True } pool = redis.ConnectionPool(**REDIS_CONFIG) # 建立連線池 r1 = redis.StrictRedis(connection_pool=pool) r2 = redis.StrictRedis(connection_pool=pool) r1.set('name1', 'Jack') r2.set('name2', 'Rose') print(r1.get('name1'), r2.get('name2'))
執行結果如下:
Jack Rose
上面例子中建立了一個連線池pool,redis例項r1和r2共享一個連線池。
redis庫的常用方法
set()和get()
-
set(name, value):在Redis中設定值,不存在則建立,存在則修改
-
get(name):獲取Redis中指定鍵的值,不存在返回None
print(r.get('name')) r.set('name', 'Jack') print(r.get('name')) r.set('name', 'Rose') print(r.get('name'))
結果如下
None Jack Rose
此外set()方法還有兩個引數來設定鍵的過期時間,分別是ex(秒)和px(毫秒)
r.set('name', 'Tony', ex=3) print(r.get('name')) time.sleep(3) print(r.get('name'))
結果如下
Tony None
可以看出,設定3秒有效時間,3秒過後,該鍵值對自動從庫中刪除。
mset()和mget()
-
mset(*args, **kwargs)的作用是批量設定值
-
mget(keys, *args)的作用是批量獲取值
items = { 'city1': 'Beijing', 'city2': 'Shanghai', 'city3': 'Hong Kong', } r.mset(items) key_list = ['city1', 'city2', 'city3'] print(r.mget(key_list))
結果如下
['Beijing', 'Shanghai', 'Hong Kong']
Hash操作
-
hset(name, key, value):在name對應hash中設定一個鍵值對(不存在則建立,否則為修改)
-
hget(name, key):在name對應的hash中根據key值來獲取value
r.hset('class1', 'name', 'Ben') r.hset('class2', 'name', 'Jane') print(r.hget('class1', 'name')) print(r.hget('class2', 'name'))
結果如下
Ben Jane
-
hmset(name, mapping):在name對應的hash中批量設定鍵值對,mapping:字典
-
hmget(name, keys, *args):在name對應的hash中獲取多個key的值
-
hgetall(name):獲取name對應hash的所有鍵值
mapping = { 'name': 'Kim', 'age': 21, 'sex': 'female' } r.hmset('class', mapping) key_list = ['name', 'age', 'sex'] print(r.hmget('class', key_list)) print(r.hgetall('class'))
結果如下
['Kim', '21', 'female'] {'name': 'Kim', 'age': '21', 'sex': 'female'}
-
hdel(name, *keys):刪除指定name對應的key所在的鍵值對
mapping = { 'name': 'Kim', 'age': 21, 'sex': 'female' } r.hmset('class', mapping) print(r.hgetall('class')) r.hdel('class', 'sex') print(r.hgetall('class'))
結果如下
{'name': 'Kim', 'age': '21', 'sex': 'female'} {'name': 'Kim', 'age': '21'}
List操作
-
lpush(name, values):在name對應的list中新增元素,每個新的元素都新增到列表的最左邊
-
rpush(name, values):在name對應的list中新增元素,每個新的元素都新增到列表的最右邊
-
llen(name):獲取name對應的list元素的個數
-
lrange(name, start, end):分片獲取元素(start為0, end為-1時獲取全部元素)
r.lpush('mylist1', 1) r.lpush('mylist1', 2, 3, 4) print(r.lrange('mylist1', 0, -1)) r.rpush('mylist2', 1) r.rpush('mylist2', 2, 3, 4, 5) print(r.lrange('mylist2', 0, -1)) print(r.llen('mylist1'), r.llen('mylist2'))
結果如下
['4', '3', '2', '1'] ['1', '2', '3', '4', '5'] 4 5
-
lrem(name, value, num):刪除name對應的list中的指定值(num為該值的個數)
data_list = [1, 3, 5, 3, 5, 3, 1] r.rpush('mylist', *data_list) # *的作用是將data_list解包傳入 print(r.lrange('mylist', 0, -1)) r.lrem('mylist', 2, 3) # 刪除列表中的兩個3(從左到右刪除) print(r.lrange('mylist', 0, -1))
結果如下
['1', '3', '5', '3', '5', '3', '1'] ['1', '5', '5', '3', '1']
以上就是在python中連線和操作redis的常用方法,如果想了解更多的話可以去相關的官方網站查詢。