跳转至

redis

Python Redis 详解

Redis 是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、会话管理等场景。Python 中可以通过 redis-py 这个库来与 Redis 进行交互。redis-py 是 Python 最常用的 Redis 客户端,提供了对 Redis 数据库的全面支持。

以下是 redis-py 的详细讲解:

1. 安装 redis-py

在使用 redis-py 之前,需要通过 pip 安装它:

pip install redis

2. 连接 Redis

要连接到 Redis 服务器,可以使用 redis.Redisredis.StrictRedis 类。以下是基本的连接方式:

import redis

# 连接到 Redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)

默认情况下,redis-py 连接到 localhost 上的 Redis 服务器,使用端口 6379,并连接到数据库 0

3. 基本操作

redis-py 支持 Redis 的所有基本数据类型,如字符串、哈希、列表、集合、有序集合等。

3.1 字符串(String)

字符串是 Redis 中最基本的数据类型,用于存储单个键值对。

# 设置键值
r.set('name', 'Alice')

# 获取键值
name = r.get('name')
print(name.decode())  # 输出: Alice
3.2 哈希(Hash)

哈希是一个键值对集合,适合用于存储对象。

# 设置哈希
r.hset('user:1', 'name', 'Alice')
r.hset('user:1', 'age', 25)

# 获取哈希字段
name = r.hget('user:1', 'name')
age = r.hget('user:1', 'age')

print(f"Name: {name.decode()}, Age: {int(age)}")
3.3 列表(List)

列表是一个按插入顺序排序的字符串序列,可以用作队列或堆栈。

# 推入元素
r.rpush('numbers', 1, 2, 3, 4)

# 弹出元素
number = r.lpop('numbers')
print(number)  # 输出: 1
3.4 集合(Set)

集合是一个无序且不重复的字符串集合,适用于去重等场景。

# 添加元素到集合
r.sadd('tags', 'python', 'redis', 'database')

# 检查元素是否在集合中
is_member = r.sismember('tags', 'python')
print(is_member)  # 输出: True

# 获取集合的所有元素
tags = r.smembers('tags')
print(tags)
3.5 有序集合(Sorted Set)

有序集合类似于集合,但每个元素都会关联一个分数,元素按分数排序。

# 添加元素到有序集合
r.zadd('leaderboard', {'Alice': 100, 'Bob': 150})

# 获取有序集合中的元素
leaderboard = r.zrange('leaderboard', 0, -1, withscores=True)
print(leaderboard)

4. 发布/订阅(Pub/Sub)

Redis 支持发布/订阅模式,用于实现消息队列功能。

# 订阅频道
def message_handler(message):
    print(f"Received message: {message['data'].decode()}")

pubsub = r.pubsub()
pubsub.subscribe(**{'my-channel': message_handler})

# 发布消息
r.publish('my-channel', 'Hello, Redis!')

5. 事务(Transactions)

Redis 提供了事务支持,可以通过 pipeline 实现多个命令的原子执行。

# 创建事务
pipe = r.pipeline()

# 将多个命令添加到事务
pipe.set('foo', 'bar')
pipe.incr('counter')

# 执行事务
pipe.execute()

6. 管道(Pipelines)

管道允许你将多个命令打包发送给 Redis,从而减少网络开销。

# 使用管道发送批量命令
with r.pipeline() as pipe:
    pipe.set('key1', 'value1')
    pipe.set('key2', 'value2')
    pipe.execute()

7. 连接池

redis-py 支持连接池,可以在高并发场景下重复使用连接,减少连接的创建开销。

# 创建连接池
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

# 使用连接池创建 Redis 客户端
r = redis.StrictRedis(connection_pool=pool)

8. 键过期和持久化

可以设置键的过期时间,让它们在一段时间后自动删除。

# 设置键的过期时间为 10 秒
r.setex('temp_key', 10, 'temporary value')

Redis 还支持数据的持久化,通过 SAVEBGSAVE 命令将数据保存到磁盘。

9. 处理异常

在操作 Redis 时,可能会遇到各种异常情况,比如连接失败或命令错误。redis-py 提供了一系列异常类来处理这些情况。

try:
    r.set('key', 'value')
except redis.RedisError as e:
    print(f"Redis error: {e}")

10. 总结

redis-py 是一个功能强大的 Redis 客户端库,支持 Redis 的全部功能。通过使用 redis-py,开发者可以轻松地在 Python 应用中实现高性能的缓存、消息队列、会话管理等功能。掌握 redis-py 的基本用法和高级特性,可以帮助你在实际项目中更高效地利用 Redis。