Python 实战:Redis 的基础操作与连接池(Pool)深度解析

文章目录

    • [一、 启动 Redis 服务](#一、 启动 Redis 服务)
    • [二、 安装 Python 依赖包](#二、 安装 Python 依赖包)
    • [三、 基础连接方式(非线程池)](#三、 基础连接方式(非线程池))
      • [1. 踩坑记录:返回值为 `bytes` 类型](#1. 踩坑记录:返回值为 bytes 类型)
      • [2. 解决方案](#2. 解决方案)
    • [四、 进阶:Redis 连接池(Connection Pool)](#四、 进阶:Redis 连接池(Connection Pool))
      • [1. 为什么要用连接池?](#1. 为什么要用连接池?)
      • [2. 连接池的核心参数与核心原理](#2. 连接池的核心参数与核心原理)
      • [3. 连接池的 Python 代码实现](#3. 连接池的 Python 代码实现)
    • [五、 总结](#五、 总结)

在高性能的后端开发中,Redis 作为内存数据库被广泛应用。本文将带你从零开始,掌握如何在 Python 中使用 redis-py 库操作 Redis,并深入探讨如何通过连接池(Connection Pool)优化高并发场景下的性能。

一、 启动 Redis 服务

在操作之前,首先确保你的本地或服务器已经安装并启动了 Redis 服务。

bash 复制代码
# 进入 Redis 安装目录(根据你的实际安装路径调整)
cd /usr/local/bin/

# 指定配置文件并以后台模式/常规模式启动服务
./redis-server ./redis.conf

二、 安装 Python 依赖包

Python 操作 Redis 需要安装官方推荐的 redis 库:

bash 复制代码
pip install redis

三、 基础连接方式(非线程池)

最基础的连接方式是每次操作都直接创建一个 Redis 实例。

1. 踩坑记录:返回值为 bytes 类型

当我们使用默认配置连接并读取数据时,会发现返回的数据带有一个 b 前缀(即 bytes 字节流类型),这在业务处理中很不方便。

python 复制代码
import redis

# 获取redis连接
conn = redis.Redis(host='localhost', port=6379, db=0)

conn.set('name', 'redis缓存技术')
result = conn.get('name')

print(result)  # 输出: b'redis\xe7\xbc\x93\xe5\xad\x98\xe6\x8a\x80\xe6\x9c\xaf'

2. 解决方案

方案一:自动解码(推荐 )

在实例化 Redis 对象时,传入 decode_responses=True 参数,库会自动帮我们将 bytes 转换为 str

python 复制代码
import redis

conn = redis.Redis(
    host='localhost', 
    port=6379, 
    db=0, 
    decode_responses=True  # 核心参数:自动把 bytes 转成字符串
)

conn.set('name', 'redis缓存技术')
result = conn.get('name')
print(result)  # 输出:redis缓存技术
方案二:手动解码

如果不修改连接参数,可以在获取到数据后,手动调用 .decode('utf-8')

python 复制代码
import redis

conn = redis.Redis(host='localhost', port=6379, db=0)
conn.set('name', 'redis缓存技术')
result = conn.get('name')

# 手动解码
print(result.decode('utf-8'))  # 输出:redis缓存技术

四、 进阶:Redis 连接池(Connection Pool)

图解

1. 为什么要用连接池?

在非线程池模式下,每次执行命令都会经历"创建连接 -> 发送命令 -> 释放连接"的过程。在高并发场景下,频繁地创建和销毁 TCP 连接会带来巨大的性能开销(如 CPU 占用高、延迟增加)。

连接池的核心作用是"复用"

  • 预先创建好一批连接放入"池子"(底层通常由队列实现)。
  • 线程需要时,从队列头部获取一个可用连接。
  • 命令执行完毕后,连接并不会被真正销毁,而是被放回队列的末尾,供下一个线程复用。

2. 连接池的核心参数与核心原理

在高级连接池的设计中,通常包含两个关键参数:

  1. init_connection(初始化连接数):连接池启动时默认创建的连接数量。
  2. max_connections(最大连接数):连接池允许存在的最大连接上限。
滑动窗口与动态增长机制

连接池中的连接数并不是一启动就直接膨胀到最大值的,而是采用动态按比例增长的算法:

  • 当并发量低时,保持基础的初始化连接数。
  • 当并发量突增,现有连接不够用时,连接池会根据算法动态创建新连接,直到达到 max_connections
  • 阻塞队列机制 :当连接池中的连接已被全部占满(达到最大连接数),后续的线程请求将会进入阻塞队列进行等待,直到有其他线程释放连接放回池中。

3. 连接池的 Python 代码实现

redis-py 中,我们需要先创建一个 ConnectionPool,然后将其作为参数传递给 Redis 实例。通常,连接池在全局应该是一个单例

python 复制代码
import redis

# 1. 创建全局连接池(内部已实现了线程安全和连接复用)
# max_connections: 限制最大连接数
pool = redis.ConnectionPool(
    host='localhost', 
    port=6379, 
    db=0, 
    decode_responses=True, 
    max_connections=20  # 设置最大连接数
)

# 2. 从连接池中获取连接实例
# 注意:此时的 r 并不是一个单一连接,而是从 pool 中获取连接的代理对象
r = redis.Redis(connection_pool=pool)

# 3. 业务操作
r.set('pool_test', '连接池测试成功')
print(r.get('pool_test'))  # 输出:连接池测试成功

# 提示:在 redis-py 中,当命令执行完毕后,内部会自动将连接放回 pool,无需手动 close。

五、 总结

连接方式 优点 缺点 适用场景
单连接模式 简单直观,适合编写简单的测试脚本。 高并发下频繁建连销毁,性能损耗大。 本地开发、小工具、单线程脚本。
连接池模式 资源复用,避免频繁建连,高并发下性能优异,支持阻塞等待。 需要额外维护连接池对象(建议单例模式)。 生产环境、Web 后端服务、高并发并发场景。

在生产环境中,强烈建议使用连接池模式 ,并开启 decode_responses=True,这样既能保证程序的高性能,又能提升代码的可读性。

相关推荐
白日与明月2 小时前
pip下载库指定操作系统及python版本
开发语言·python·pip
折哥的程序人生 · 物流技术专研2 小时前
Qoder 1.0 完全指南:从安装到Agents驱动开发实战
开发语言·人工智能·python·ai编程
福大大架构师每日一题2 小时前
redis 8.8.0 发布:新数据结构、字段级通知、INCREX、XNACK 全面升级,8.6 到 8.8 变化一文看懂
数据结构·数据库·redis
绝知此事2 小时前
Redis 从入门到精通:Spring Boot 实战三部曲(二)—— 进阶原理与高可用架构
spring boot·redis·架构
买大橘子也用券2 小时前
26软件系统安全赛-Fake Emotion(复盘)
python·深度学习·安全·网络安全
輕華2 小时前
Flask_GET请求与JSON响应实战详解
python·flask·json
weelinking2 小时前
【产品】10_搭建前端框架——把你的原型变成真实页面
java·大数据·前端·数据库·人工智能·python·前端框架
yaoxin5211232 小时前
421. Java 日期时间 API - 包结构 & 方法命名规范
java·前端·python
开开心心就好2 小时前
解决图片无页码添加功能的实用工具
javascript·python·安全·智能手机·pdf·音视频·1024程序员节