1. 程式人生 > 實用技巧 >使用Python操作Redis資料庫

使用Python操作Redis資料庫

安裝與連線

安裝redis

使用python操作redis,需要先安裝redis模組,請使用以下命令安裝

pip3 install redispython3 -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的常用方法,如果想了解更多的話可以去相關的官方網站查詢。