首页 > 技术文章 > 使用Python操作Redis数据库

blueberry-mint 2020-11-19 12:13 原文

安装与连接

安装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的常用方法,如果想了解更多的话可以去相关的官方网站查询。

推荐阅读