使用Python操作Redis数据库
安装与连接
安装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的常用方法,如果想了解更多的话可以去相关的官方网站查询。