【python】python进阶——Redis模块 - 教程

news/2025/10/12 11:50:32/文章来源:https://www.cnblogs.com/lxjshuju/p/19136440

目录

引言      

一、Redis与Python的初次邂逅

1.1 为什么选择Redis?

1.2 安装redis-py

二、连接Redis:基础与高级配置

2.1 基础连接

2.2 带参数连接

2.3 使用连接池提升性能

三、Redis数据类型操作详解

3.1 字符串(Strings)

3.2 哈希(Hashes)

3.3 列表(Lists)

3.4 集合(Sets)

3.5 有序集合(Sorted Sets)

四、高级功能与实战技巧

4.1 数据过期与自动清理

4.2 管道(Pipeline)批量操作

4.3 事务(Transactions)保证原子性

4.4 发布/订阅模式

五、实战应用场景

5.1 缓存实现

5.2 会话存储

5.3 限流器

六、性能优化


引言

        Redis作为一种高性能的键值存储系统,在缓存、会话存储、消息队列等场景中发挥着重要作用。结合Python使Redis的强大功能更易利用,本文将详细介绍如何使用Python操作Redis。

一、Redis与Python的初次邂逅

1.1 为什么选择Redis?

Redis是一款开源的内存数据结构存储,可用作数据库、缓存和消息代理。它支持多种数据结构(字符串、哈希、列表、集合等),并提供持久化功能。

1.2 安装redis-py

redis-py是Python与Redis交互的官方推荐库,安装简单:

pip install redis

二、连接Redis:基础与高级配置

2.1 基础连接

建立与Redis的基本连接:

import redis
​
# 最简单连接(默认localhost:6379,数据库0)
r = redis.Redis()
print("成功连接到Redis!" if r.ping() else "连接失败")

2.2 带参数连接

实际生产环境中通常需要更多参数:

import redis
​
try:   r = redis.Redis(       host='your_redis_host',  # Redis服务器地址       port=6379,               # 端口,默认6379       password='your_password', # 认证密码       db=0,                    # 数据库索引(0-15)       decode_responses=True,   # 自动将字节数据解码为字符串       socket_connect_timeout=5, # 连接超时时间(秒)       socket_timeout=5         # 操作超时时间(秒)   )   # 测试连接   r.ping()   print("成功连接到Redis!")
except redis.exceptions.ConnectionError as e:   print(f"连接失败: {e}")

关键参数解析

  • decode_responses=True:让redis-py自动将返回的字节数据解码为字符串,省去手动解码步骤

  • socket_connect_timeout:控制连接建立的超时时间,避免程序长时间阻塞

  • socket_timeout:控制命令执行超时时间,提升应用稳定性

2.3 使用连接池提升性能

在高并发场景下,使用连接池可以显著提升性能:

import redis
​
# 创建连接池
pool = redis.ConnectionPool(   host='localhost',   port=6379,   password='your_password',   db=0,   decode_responses=True,   max_connections=10  # 连接池最大连接数
)
​
# 从连接池获取连接
r = redis.Redis(connection_pool=pool)
​
# 使用连接
r.set('pool_test', '连接池工作正常')
value = r.get('pool_test')
print(value)  # 输出:连接池工作正常

连接池的优势在于复用连接,避免频繁创建和销毁连接的开销,特别适合Web应用等高并发场景。

三、Redis数据类型操作详解

3.1 字符串(Strings)

字符串是Redis最基本的数据类型:

# 基本设置和获取
r.set('username', 'john_doe')
r.setex('temp_session', 3600, 'session_data')  # 带过期时间(秒)
​
# 批量操作
r.mset({'key1': 'value1', 'key2': 'value2', 'key3': 'value3'})
values = r.mget('key1', 'key2', 'key3')
​
# 数字操作
r.set('counter', 10)
r.incr('counter')  # 增加1
r.incrby('counter', 5)  # 增加5
r.decr('counter')  # 减少1
​
print(r.get('counter'))  # 输出:15

3.2 哈希(Hashes)

哈希适合存储对象:

# 设置哈希值
r.hset('user:100', 'name', 'Alice')
r.hset('user:100', 'age', 30)
# 或使用mapping参数批量设置
r.hset('user:101', mapping={'name': 'Bob', 'age': 25, 'city': 'New York'})
​
# 获取数据
name = r.hget('user:100', 'name')
all_data = r.hgetall('user:101')  # 获取所有字段
​
print(f"用户100姓名: {name}")
print(f"用户101全部数据: {all_data}")

3.3 列表(Lists)

Redis列表是基于链表实现的,适合做队列、栈等结构:

# 列表操作
r.lpush('tasks', 'task1', 'task2', 'task3')  # 左侧插入
r.rpush('tasks', 'task4')  # 右侧插入
​
# 获取元素
first_task = r.lpop('tasks')  # 左侧弹出
last_task = r.rpop('tasks')  # 右侧弹出
​
# 获取范围元素
all_tasks = r.lrange('tasks', 0, -1)  # 获取所有元素
​
print(f"第一个任务: {first_task}")
print(f"所有任务: {all_tasks}")

3.4 集合(Sets)

# 集合 - 无序且唯一
r.sadd('tags', 'python', 'redis', 'database', 'python')  # 重复元素自动去重
​
tags = r.smembers('tags')
print(f"标签集合: {tags}")  # 输出: {'python', 'redis', 'database'}
​

3.5 有序集合(Sorted Sets)

# 有序集合 - 带分数排序
r.zadd('leaderboard', {'Alice': 100, 'Bob': 90, 'Charlie': 120})
top_players = r.zrevrange('leaderboard', 0, 1, withscores=True)  # 降序排列
​
print(f"排行榜前两名: {top_players}")

四、高级功能与实战技巧

4.1 数据过期与自动清理

Redis可以设置键的生存时间,实现数据自动过期:

# 设置键的过期时间
r.setex('session_token', 3600, 'encrypted_token_data')  # 1小时后过期
r.expire('existing_key', 600)  # 设置已有键的过期时间(10分钟)
# 检查剩余时间
ttl = r.ttl('session_token')  # 获取剩余生存时间(秒)
print(f"会话令牌剩余生存时间: {ttl}秒")
# 监控数据生命周期
import time
r.set('temp_data', '重要但会消失的数据', ex=60)  # 60秒后自动删除
while True:remaining = r.ttl('temp_data')if remaining > 0:print(f"数据剩余寿命:{remaining}秒")time.sleep(10)else:print("数据已自然消亡")break

4.2 管道(Pipeline)批量操作

使用管道可以显著提升批量操作的性能:

import redis
r = redis.Redis(decode_responses=True)
# 创建管道
pipe = r.pipeline()
# 添加多个命令到管道
for i in range(1000):pipe.set(f'key:{i}', f'value:{i}')
# 一次性执行所有命令
results = pipe.execute()
print(f"批量插入了{len(results)}条数据")

管道通过减少网络往返次数来提升性能,特别适合批量数据插入场景。

4.3 事务(Transactions)保证原子性

Redis事务可以确保一系列命令的原子性执行:

# 基本事务
pipe = r.pipeline(transaction=True)  # 开启事务模式
try:pipe.multi()  # 开始事务pipe.set('account:A', 100)pipe.set('account:B', 100)pipe.execute()  # 执行事务print("事务执行成功")
except redis.exceptions.RedisError as e:print(f"事务执行失败: {e}")
# 使用WATCH实现乐观锁
def transfer_funds(source, destination, amount):with r.pipeline() as pipe:try:# 监视源账户键pipe.watch(source)# 检查余额是否足够current_balance = int(r.get(source) or 0)if current_balance < amount:pipe.unwatch()print("余额不足")return False# 开始事务pipe.multi()pipe.decrby(source, amount)pipe.incrby(destination, amount)pipe.execute()print("转账成功")return Trueexcept redis.WatchError:print("账户余额已被其他操作修改,转账失败")return False
# 测试转账
r.set('account:A', 500)
r.set('account:B', 500)
transfer_funds('account:A', 'account:B', 100)

4.4 发布/订阅模式

Redis支持发布/订阅消息模式:

# 订阅者
import threading
def subscriber(channel_name):pubsub = r.pubsub()pubsub.subscribe(channel_name)for message in pubsub.listen():if message['type'] == 'message':print(f"收到消息: {message['data']}")
# 启动订阅线程
thread = threading.Thread(target=subscriber, args=('news',))
thread.daemon = True
thread.start()
# 发布者
r.publish('news', 'Hello, subscribers!')
r.publish('news', '这是第二条消息')

五、实战应用场景

5.1 缓存实现

def get_user_profile(user_id, cache_timeout=3600):   # 尝试从缓存获取   cache_key = f"user_profile:{user_id}"   cached_data = r.get(cache_key)   if cached_data:       print("从缓存获取数据")       return cached_data   # 缓存不存在,从数据库获取   print("从数据库获取数据")   user_data = f"用户{user_id的详细信息}"  # 模拟数据库查询   # 存入缓存   r.setex(cache_key, cache_timeout, user_data)   return user_data

5.2 会话存储

def create_user_session(user_id):   session_id = f"session:{user_id}"   session_data = {       'user_id': user_id,       'username': 'john_doe',       'last_login': '2023-10-01 12:00:00'   }   # 会话保存2小时   r.hset(session_id, mapping=session_data)   r.expire(session_id, 7200)   return session_id
​
def get_session(session_id):   return r.hgetall(session_id)

5.3 限流器

def rate_limiter(user_id, action, limit=10, window=60):   key = f"rate_limit:{user_id}:{action}"   current = r.get(key)   if current and int(current) >= limit:       return False  # 超过限制   pipe = r.pipeline()   pipe.incr(key)   pipe.expire(key, window)  # 设置过期时间   pipe.execute()   return True  # 在限制内

六、性能优化

  • 连接管理:始终使用连接池,避免频繁创建和销毁连接

  • 管道批量操作:批量数据操作使用管道提升性能

  • 合理设置超时:避免因Redis服务不可用导致应用阻塞

  • 键命名规范:使用冒号分隔的命名空间(如user:100:profile

  • 避免大键:单个键的值不宜过大,会影响性能

  • 监控与日志:记录Redis操作日志,监控性能指标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年 10 月桥架厂家最新推荐:专业制造与品牌保障口碑之选!

在工业基建与电力传输需求持续增长的 2025 年,桥架作为核心支撑构件,其产品品质、技术实力与品牌可靠性直接影响工程安全与效率。本次推荐聚焦 “专业制造能力”“品牌保障体系”“市场口碑积累” 三大核心维度,筛选…

语文_作文_开头结尾

成长领悟 (开头)回忆往昔,就像翻看一本微微褪色的相册。有些画面已模糊难辨,有些瞬间却依然鲜明如昨。那些悲喜交织的片段,仿佛是岁月留给我们的密码,唯有细细解读,方能领悟其深藏的价值——那就是关于成长的一…

后端缓存好?缓存实用的方案实例直接用就是前端缓存好还

后端缓存好?缓存实用的方案实例直接用就是前端缓存好还pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

Nature | 本周最新文献速递

1. Tracking clonal evolution during treatment in ovarian cancer using cell-free DNA 中文标题: cfDNA揭秘卵巢癌耐药演化:从诊断到复发,精准追踪克隆动态 关键词: 卵巢癌、克隆演化、cfDNA、耐药性、精准治疗 摘…

2025年通风天窗厂家最新权威推荐榜:专业性能与高效通风口碑

2025年通风天窗厂家最新权威推荐榜:专业性能与高效通风口碑随着工业建筑对室内环境要求的不断提高,通风天窗作为工业厂房自然通风采光的关键设备,其技术性能与产品质量日益受到重视。2025年,通风天窗行业在节能环保…

解决scoop安装的anaconda无法在商店版powershell使用的问题

1) 不依赖 profile,先在当前会话“临时启用” conda $CondaRoot = D:\Scoop\apps\anaconda3\current\App $env:PATH = "$CondaRoot\condabin;$CondaRoot\Scripts;$CondaRoot;$CondaRoot\Library\bin;$env:PATH&q…

2025智能吉他厂家最新权威推荐榜:创新科技与卓越音质完美融

2025智能吉他厂家最新权威推荐榜:创新科技与卓越音质完美融合在音乐科技日新月异的今天,智能吉他产业迎来了前所未有的发展机遇。传统乐器制造工艺与现代智能技术的深度融合,正在重塑音乐创作与演奏的边界。据国际音…

2025景区售票系统厂家最新权威推荐榜:智慧票务与高效管理口

2025景区售票系统厂家最新权威推荐榜:智慧票务与高效管理口在数字化浪潮席卷各行各业的今天,景区管理领域正经历着前所未有的变革。智慧旅游作为旅游业转型升级的重要方向,其核心支撑系统——景区售票系统的智能化程…

数学邪修手册

数学邪修手册 简介 在中学数学,普遍存在这样一个问题:你更擅长代数还是几何?根据我们长时间的交流,男生大概率更喜欢代数,女生则偏向几何。不过,这种特征不是绝对的,也可能有同学两个差不多。 还有一个惊人的结…

实用指南:光谱相机在护眼灯领域的应用

实用指南:光谱相机在护眼灯领域的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

2025校平机厂家最新权威推荐榜:精准矫平与高效生产首选

2025校平机厂家最新权威推荐榜:精准矫平与高效生产首选在金属加工行业持续升级的背景下,校平机作为提升板材平整度、确保产品质量的核心装备,其技术性能与稳定性直接影响着企业的生产效率和产品合格率。随着智能制造…

idea 激活

https://fofa.info/header="https://account.jetbrains.com/fls-auth" && country="CN"

海曼HTPA80X64红外热成像 测温采集记录仪 多点实时温度分析

1、描述 这是一款小巧迷你科研实验测温热成像多功能热像记录仪,模块带一路ALARM报警信号3.3v电平,一系统复位和参数复位接口,一路TTL串口TXD RXD接口,自带USB串口芯片,TYPEC直插电脑显示串口,搭配多功能电脑软件,…

位与字节

“位(Bit)” 和 “字节(Byte)” 是计算机中最基础的数据存储与处理单位,两者是 “最小单位” 与 “基本单位” 的关系。 一、核心定义 位(Bit,二进制位)定义:计算机中最小的数据单位,只能表示两种状态之一:…

2025年氢氧化镁厂家最新权威推荐榜:环保阻燃与工业应用深度

2025年氢氧化镁厂家最新权威推荐榜:环保阻燃与工业应用深度随着全球环保法规日益严格和工业技术持续升级,氢氧化镁作为环境友好型阻燃剂和工业原料,在塑料、橡胶、电缆、建材等领域的应用正迎来爆发式增长。据行业数…

2025年苹果仓民宿最新权威推荐榜:工业遗存与人文情怀完美融

2025年苹果仓民宿最新权威推荐榜:工业遗存与人文情怀完美融合在存量建筑改造与文旅产业升级的双重驱动下,苹果仓民宿已成为工业遗存活化利用的典范形态。这种将废弃工业仓库改造为特色住宿空间的模式,既保留了城市记…

2025二手掘进机厂家最新权威推荐榜:高性价比与可靠性能深度

2025二手掘进机厂家最新权威推荐榜:高性价比与可靠性能深度在矿山开采与隧道施工领域,掘进机作为核心装备,其性能与可靠性直接影响工程进度与经济效益。随着设备更新换代加速,二手掘进机市场因其高性价比优势,正成…

对我学过的算法的一些总结

随缘更新,希望能帮到你,不过肯定能帮到我就是了。 \(\LaTeX\) 写的不是很严谨,其中的 “\(=\)” 具体是等于还是赋值就自己悟吧。不知道该怎么归类的算法 二分 对具有单调性的东西快速查找合法边界,\(O(log_n)\),…

鲜花 10.12

夜深了,窗外下起了淅淅沥沥的小雨,梧桐叶在风中轻颤,仿佛我此刻的心情,细碎而不安宁。屏幕上的代码泛着冷白的光,我的影子孤独地映在墙上,像一道未解的难题。那些曾经让我着迷的算法,如今却像一座座山,压得我喘…

DBA | MySQL 数据库基础查询语句学习实践笔记 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …