Python 操作Redis
简介
Redis 是一个高性能的键值存储数据库,支持多种数据结构,并提供了丰富的 API 接口。它被广泛应用于缓存、队列、消息中间件等场景,以及在分布式系统中的数据共享和同步。
本文将介绍如何使用 Python 语言操作 Redis 数据库,包括连接 Redis、基本数据类型的操作、事务处理、Pub/Sub 发布与订阅等。
连接 Redis
在开始之前,我们需要安装 redis-py
这个 Python 模块,它是 Redis 官方推荐的 Python 客户端。
通过以下命令安装 redis-py
:
pip install redis
在 Python 代码中,使用以下代码进行连接:
import redis
# 连接 Redis,默认连接本地主机
r = redis.Redis()
# 需要连接远程主机时,指定主机和端口
# r = redis.Redis(host='localhost', port=6379)
字符串类型操作
Redis 的字符串类型是最基本的数据结构,可以存储任何类型的值,比如字符串、数字、JSON 对象等。
设置和获取值
使用 set(key, value)
方法设置字符串类型的值,get(key)
方法获取值。
r.set('name', 'Tom')
print(r.get('name'))
输出:
b'Tom'
删除键值
使用 delete(key)
方法可以删除指定的键值:
r.delete('name')
批量操作
mset(**kwargs)
方法可以同时设置多个键值对,mget(keys, *args)
方法可以同时获取多个键的值:
r.mset({'name': 'Tom', 'age': 25, 'gender': 'male'})
print(r.mget('name', 'age', 'gender'))
输出:
[b'Tom', b'25', b'male']
列表类型操作
Redis 的列表类型是一个双向链表,可以在两端插入和删除元素。
添加和获取元素
使用 lpush(key, *values)
方法在列表的左端插入元素,使用 rpush(key, *values)
方法在列表的右端插入元素。
r.lpush('fruits', 'apple')
r.rpush('fruits', 'banana')
print(r.lrange('fruits', 0, -1))
输出:
[b'apple', b'banana']
删除元素
使用 lpop(key)
方法可以从列表的左端删除元素,使用 rpop(key)
方法可以从列表的右端删除元素。
r.lpop('fruits')
r.rpop('fruits')
print(r.lrange('fruits', 0, -1))
输出:
[]
获取长度
使用 llen(key)
方法可以获取列表的长度:
print(r.llen('fruits'))
输出:
0
散列类型操作
Redis 的散列类型是一个键值对的集合,其中的值可以是字符串、数字等。
设置和获取值
使用 hset(name, key, value)
方法设置散列类型的值,hget(name, key)
方法获取值。
r.hset('student', 'name', 'Tom')
print(r.hget('student', 'name'))
输出:
b'Tom'
删除键值
使用 hdel(name, *keys)
方法可以删除散列类型中的键值:
r.hdel('student', 'name')
批量操作
hmset(name, mapping)
方法可以同时设置散列类型中的多个键值对,hmget(name, keys, *args)
方法可以同时获取散列类型中的多个键的值:
r.hmset('student', {'name': 'Tom', 'age': 18, 'gender': 'male'})
print(r.hmget('student', 'name', 'age', 'gender'))
输出:
[b'Tom', b'18', b'male']
集合类型操作
Redis 的集合类型是无序的字符串集合,可以对集合执行添加、删除、查找、随机获取等操作。
添加元素
使用 sadd(key, *values)
方法向集合中添加元素:
r.sadd('cities', 'Beijing')
r.sadd('cities', 'Shanghai', 'Guangzhou')
获取集合的元素个数
使用 scard(key)
方法可以获取集合中的元素个数:
print(r.scard('cities'))
输出:
3
查找元素是否存在
使用 sismember(key, value)
方法可以判断元素是否存在于集合中:
print(r.sismember('cities', 'Beijing'))
print(r.sismember('cities', 'Chengdu'))
输出:
True
False
随机获取元素
使用 srandmember(key, count=None)
方法可以从集合中随机获取一个元素或多个元素:
print(r.srandmember('cities'))
print(r.srandmember('cities', 2))
删除元素
使用 srem(key, *values)
方法可以从集合中删除指定的元素:
r.srem('cities', 'Beijing')
print(r.smembers('cities'))
输出:
{b'Shanghai', b'Guangzhou'}
有序集合类型操作
Redis 的有序集合类型是一个根据得分进行排序的字符串集合。在有序集合中,每个成员都有一个得分,通过得分可以按照它们的顺序进行排序。
添加元素
使用 zadd(name, *args, **kwargs)
方法向有序集合中添加元素,其中 *args
是成员和对应的得分,**kwargs
是成员和对应的字典形式的得分。得分可以是浮点数或整数。
r.zadd('scores', {'Alice': 60, 'Bob': 70, 'Tom': 80})
r.zadd('scores', Bob=75, Tom=85)
获取集合的元素个数
使用 zcard(name)
方法可以获取有序集合中的元素个数:
print(r.zcard('scores'))
输出:
3
获取指定范围内的元素
使用 zrange(name, start, end, desc=False, withscores=False, score_cast_func=float)
方法可以获取有序集合中排名在指定范围内的元素。
参数说明:
start
:起始排名(0 表示第一个元素);end
:结束排名(-1 表示最后一个元素);desc
:是否按照得分从大到小排序;withscores
:是否返回元素和得分。
print(r.zrange('scores', 0, -1, withscores=True))
输出:
[(b'Alice', 60.0), (b'Bob', 75.0), (b'Tom', 85.0)]
获取指定得分范围内的元素
使用 `zrangebyscore(name, min, max,包括 min 和 max 的元素。
print(r.zrangebyscore('scores', 70, 90, withscores=True))
输出:
[(b'Bob', 75.0), (b'Tom', 85.0)]
删除元素
使用 zrem(name, *values)
方法可以从有序集合中删除指定的元素:
r.zrem('scores', 'Alice')
print(r.zrange('scores', 0, -1, withscores=True))
输出:
[(b'Bob', 75.0), (b'Tom', 85.0)]
事务处理
Redis 支持事务处理,可以将多个命令包裹在一个事务中,保证它们的原子性执行。
# 开始事务
pipe = r.pipeline()
# 执行多个命令
pipe.set('name', 'Tom')
pipe.set('age', 25)
# 提交事务
pipe.execute()
发布与订阅
Redis 提供了 Pub/Sub(发布与订阅)功能,可以进行消息的发布和订阅。
发布消息
使用 publish(channel, message)
方法发布消息:
r.publish('channel', 'Hello, Redis!')
订阅消息
使用 subscribe(channel, *channels)
方法订阅消息。可以创建一个订阅对象,并使用 listen()
方法监听消息。
sub = r.pubsub()
sub.subscribe('channel')
for message in sub.listen():
print(message)
运行结果
{'type': 'subscribe', 'pattern': None, 'channel': b'channel', 'data': 1}
{'type': 'message', 'pattern': None, 'channel': b'channel', 'data': b'Hello, Redis!'}
总结
本文介绍了如何使用 Python 操作 Redis 数据库。涵盖了字符串类型、列表类型、散列类型、集合类型、有序集合类型的基本操作,以及事务处理和发布与订阅功能。通过掌握这些基本操作,可以在 Python 中灵活地使用 Redis 进行数据存储和缓存,以及实现更复杂的功能和应用场景。