python 与Redis操作整理

以下是使用 Python 操作 Redis 的完整整理,涵盖基础操作、高级功能及最佳实践:


1. 安装与连接
(1) 安装库

pip install redis

(2) 基础连接

import redis# 创建连接池(推荐复用连接)
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, password='your_password', decode_responses=True  # 自动解码为字符串
)
client = redis.Redis(connection_pool=pool)# 测试连接
print(client.ping())  # 输出 True 表示成功

(3) SSL 连接

client = redis.Redis(host='your-host',port=6380,ssl=True,ssl_certfile='/path/to/cert.crt',ssl_keyfile='/path/to/key.key',ssl_ca_certs='/path/to/ca.crt'
)

2. 基本数据类型操作
(1) 字符串(String)

# 设置值(带过期时间)
client.set('user:1001', 'Alice', ex=3600)  # ex:秒级过期,px:毫秒级# 获取值
name = client.get('user:1001')  # 返回字符串(若 decode_responses=True)# 自增/自减
client.incr('counter')        # +1
client.incrby('counter', 5)  # +5
client.decr('counter')        # -1

(2) 哈希(Hash)

# 设置字段
client.hset('user:profile:1001', 'name', 'Alice')
client.hmset('user:profile:1001', {'age': 30, 'email': 'alice@example.com'})# 获取字段
name = client.hget('user:profile:1001', 'name')        # 'Alice'
all_data = client.hgetall('user:profile:1001')        # {'name': 'Alice', 'age': '30'}# 删除字段
client.hdel('user:profile:1001', 'email')

(3) 列表(List)

# 插入元素
client.lpush('tasks', 'task1')      # 左侧插入
client.rpush('tasks', 'task2')      # 右侧插入# 获取元素
task = client.rpop('tasks')         # 右侧弹出 'task2'
all_tasks = client.lrange('tasks', 0, -1)  # 获取全部元素# 截断列表
client.ltrim('tasks', 0, 2)        # 保留前3个元素

(4) 集合(Set)

# 添加元素
client.sadd('tags', 'python', 'redis')# 集合运算
common_tags = client.sinter('tags1', 'tags2')  # 交集
all_tags = client.sunion('tags1', 'tags2')     # 并集# 随机弹出元素
random_tag = client.spop('tags')

(5) 有序集合(ZSet)

# 添加元素(带分数)
client.zadd('rank', {'Alice': 90, 'Bob': 85})# 获取排名
rank = client.zrevrank('rank', 'Alice')  # 降序排名(0为最高)# 范围查询
top3 = client.zrevrange('rank', 0, 2, withscores=True)  # 前3名及分数

3. 高级功能
(1) 管道(Pipeline)

# 批量操作(减少网络往返)
pipe = client.pipeline()
pipe.set('key1', 'value1')
pipe.incr('counter')
pipe.execute()  # 返回 [True, 6]

(2) 事务(Transaction)

try:pipe = client.pipeline(transaction=True)pipe.multi()  # 开启事务pipe.set('balance:1001', 100)pipe.decrby('balance:1001', 50)pipe.incrby('balance:1002', 50)pipe.execute()  # 原子性提交
except redis.exceptions.WatchError:print("事务冲突,需重试")

(3) 分布式锁

def acquire_lock(lock_name, timeout=10):identifier = str(uuid.uuid4())end = time.time() + timeoutwhile time.time() < end:if client.set(lock_name, identifier, nx=True, ex=timeout):return identifiertime.sleep(0.001)return Falsedef release_lock(lock_name, identifier):script = """if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])elsereturn 0end"""return client.eval(script, 1, lock_name, identifier) == 1

(4) 发布订阅

# 发布消息
client.publish('news', 'Breaking News!')# 订阅频道
pubsub = client.pubsub()
pubsub.subscribe('news')for message in pubsub.listen():if message['type'] == 'message':print(f"收到消息: {message['data']}")

4. 数据序列化与复杂对象存储
(1) JSON 序列化

import jsonuser = {'id': 1001, 'name': 'Alice'}
client.set('user:1001', json.dumps(user))# 反序列化
data = client.get('user:1001')
if data:user_data = json.loads(data)

(2) 使用 MessagePack(更高效)

pip install msgpack
import msgpackuser_bytes = msgpack.packb(user)
client.set('user:1001', user_bytes)# 反序列化
data = client.get('user:1001')
if data:user_data = msgpack.unpackb(data)

5. 键管理与维护
(1) 扫描键(避免阻塞)

# 查找所有以 'cache:' 开头的键
for key in client.scan_iter(match='cache:*', count=1000):print(key)

(2) 设置过期时间

client.expire('user:1001', 3600)       # 设置过期时间(秒)
client.pexpire('user:1001', 3600000)   # 毫秒级过期

(3) 批量删除键

# 删除所有以 'temp:' 开头的键
keys = list(client.scan_iter(match='temp:*'))
if keys:client.delete(*keys)

6. 最佳实践
(1) 连接池管理
• 使用 ConnectionPool 复用连接,避免频繁创建/销毁。

• 配置最大连接数:

pool = redis.ConnectionPool(max_connections=10)

(2) 性能优化
• 使用 pipeline 批量操作减少网络延迟。

• 避免大 Key(如超过 1MB 的 String 或 Hash),拆分存储。

(3) 安全建议
• 禁用高危命令(在 Redis 配置中):

rename-command FLUSHDB ""
rename-command KEYS ""

• 使用低权限账号运行 Redis。

(4) 监控与调试
• 查看慢查询:

slow_logs = client.slowlog_get()

• 监控内存使用:

info = client.info('memory')
print(info['used_memory_human'])

7. 常用场景代码示例
(1) 缓存穿透解决方案

def get_user(user_id):key = f'user:{user_id}'data = client.get(key)if data is None:# 查询数据库user = db.query_user(user_id)if user:client.set(key, json.dumps(user), ex=300)else:# 缓存空值防止穿透client.set(key, 'NULL', ex=60)elif data == 'NULL':return Noneelse:return json.loads(data)

(2) 排行榜实现

# 更新分数
client.zadd('leaderboard', {'Alice': 100, 'Bob': 90})# 获取前10名
top10 = client.zrevrange('leaderboard', 0, 9, withscores=True)

总结

操作类型核心方法适用场景
基础数据操作set/hset/lpush/sadd/zadd缓存、队列、标签、排行榜
事务与管道pipeline + multi批量操作、原子性执行
分布式锁SET + NX + Lua 脚本资源竞争控制
发布订阅publish + subscribe实时消息通知
性能优化连接池、Pipeline、异步删除高并发、大数据量场景

通过合理选择数据结构和操作方式,Redis 能高效支撑缓存、队列、计数器、实时分析等多样化需求。建议结合业务场景灵活应用,并通过监控工具持续优化性能。

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

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

相关文章

什么时候使用Python 虚拟环境(venv)而不用conda

是的&#xff01;python3.9 -m venv rtdetr_env 是 Python 原生的虚拟环境&#xff08;venv&#xff09;&#xff0c;而 conda 是另一个流行的虚拟环境管理工具&#xff08;来自 Anaconda/Miniconda&#xff09;。下面我会详细对比两者的区别&#xff0c;并讲解 venv 的基本用法…

ubuntu20.04安装x11vnc远程桌面

x11vnc是一个VNC服务器, 安装后我们可以不依赖外部的显示设备, 通过网络远程登录ubuntu桌面。 安装x11vnc sudo apt-get install x11vnc 设置VNC登录密码 sudo x11vnc -storepasswd /etc/x11vnc.pwd 设置x11vnc在开机时自动启动 新建如下文件: sudo vi /lib/systemd/sys…

Maven的概念与初识Maven

目录 一、Maven的概念 1. 什么是Maven 2. 项目构建&#xff1a;从代码到部署的标准化流程 2.1 Maven构建生命周期 2.2 传统构建 vs Maven构建 3. 依赖管理&#xff1a;解决“JAR地狱”的利器 3.1 依赖声明 3.2 依赖传递与冲突解决 4. Maven仓库&#xff1a;依赖的存储…

Unity-Shader详解-其二

前向渲染和延迟渲染 前向渲染和延迟渲染总的来说是我们的两种主要的渲染方式。 我们在Unity的Project Settings中的Graphic界面能够找到渲染队列的设定&#xff1a; 我们也可以在Main Camera这里进行设置&#xff1a; 那这里我们首先介绍一下两种渲染&#xff08;Forward R…

C++ 中 std::tuple 使用详解

C 中 std::tuple 使用详解 基本概念 std::tuple 是 C11 引入的模板类&#xff0c;用于打包任意数量、任意类型的值在一起。可看作是类型安全的变长结构体。 #include <tuple>std::tuple<int, std::string, double> t(42, "hello", 3.14);创建 tuple 的…

WebRTC基于网页的视频会议,手写WebRTC流程(html)

WebRTC是web real-time communication网页及时通信的缩写&#xff0c;通过javascript就可以实现网页会话&#xff0c;基于浏览器开发出来多媒体应用&#xff0c; 以下是手写的WEBRTC调用本地摄像头的html代码&#xff0c;直接用浏览器打开&#xff0c;就可以使用 <!DOCTYPE…

MyBatis 官方子项目详细说明及表格总结

MyBatis 官方子项目详细说明及表格总结 1. 核心子项目说明 1.1 mybatis-3 GitHub 链接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源码&#xff0c;提供 SQL 映射、动态 SQL、缓存、事务管理等核心功能。主要功能&#xff1a; 支持…

【虚幻C++笔记】碰撞检测

目录 碰撞检测参数详情示例用法 碰撞检测 显示名称中文名称CSphere Trace By Channel按通道进行球体追踪UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件进行球体追踪UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects针…

推论阶梯——AI与思维模型【81】

一、定义 推论阶梯思维模型是一种用于分析和理解人们如何从观察到的事实,经过一系列的假设、推理和判断,最终得出结论的思维过程的理论框架。它将这个过程比喻为一个阶梯,每一步都建立在前一步的基础上,逐渐形成一个完整的推论。这个模型帮助我们意识到在思考和决策过程中…

小刚说C语言刷题——1109加密四位数

1.题目描述 某军事单位用 4位整数来传递信息&#xff0c;传递之前要求先对这个 4 位数进行加密。加密的方式是每一位都先加上 5然后对 10取余数&#xff0c;再将得到的新数颠倒过来。 例如&#xff1a;原数是 1379 &#xff0c;那么每位加 55对 10 取余数的结果为 6824 &…

云服务器和独立服务器的区别在哪

在当今数字化的时代&#xff0c;服务器成为了支撑各种业务和应用的重要基石。而在服务器的领域中&#xff0c;云服务器和独立服务器是两个备受关注的选项。那么&#xff0c;它们到底有何区别呢&#xff1f; 首先&#xff0c;让我们来聊聊成本。云服务器通常采用按需付费的模式…

【前端】【业务场景】【面试】在前端开发中,如何优化 SVG(可缩放矢量图形)的性能,特别是在处理复杂图形和动画时

SVG 性能优化&#xff1a;循序渐进 4 步法 目标&#xff1a;先减负 → 再复用 → 后加速 → 最后按场景微调 ① 精简—把包袱先丢掉 删除无用元素 隐藏/被遮挡的 <path>、未引用的 <defs> 里渐变、滤镜。 合并路径 同填充色或描边的路径 ⇒ SVGO / SVGOMG「Mer…

MySQL长事务的隐患:深入剖析与解决方案

MySQL长事务的隐患&#xff1a;深入剖析与解决方案 一、什么是长事务&#xff1f; 在数据库系统中&#xff0c;长事务(Long Transaction)通常指执行时间超过预期或系统设定阈值的事务。对于MySQL而言&#xff0c;虽然没有严格的时间定义&#xff0c;但一般认为执行时间超过数…

华为AR1200 telnet设置

华为路由配置TELNET登 &#x1f4fa; 启动TELNET服务 在华为路由器上启动TELNET服务&#xff0c;执行以下命令&#xff1a; telnet server enable &#x1f511; 配置AAA认证 进入AAA认证配置&#xff0c;创建一个路由器登录帐号admin123&#xff0c;并设置密码为huawei123&…

【Token系列】01 | Token不是词:GPT如何切分语言的最小单元

文章目录 01 | Token不是词&#xff1a;GPT如何切分语言的最小单元&#xff1f;一、什么是 Token&#xff1f;二、Token 是怎么来的&#xff1f;——BPE算法原理BPE核心步骤&#xff1a; 三、为什么不直接用词或字符&#xff1f;四、Token切分的实际影响五、中文Token的特殊性六…

如何快速高效学习Python?

如何快速高效学习Python&#xff1f; How to Fastly and Effectively Learn Python Programming? By JacksonML 1. Python年轻吗&#xff1f; Python自1991年诞生到现在&#xff0c;已经经历了三十四年或者更长时间了。毕竟&#xff0c;Python之父 – 吉多范罗苏姆先生(Gu…

NAT穿透

NAT是 Net Address Traslation的缩写&#xff0c;即网络地址转换 NAT部署在网络出口的位置。位于内网和公网之间&#xff0c;是连接内挖个主机和公网的桥梁&#xff0c;双向流量都必须经过NAT&#xff0c;装有NAT软件的路由器叫NAT路由器&#xff0c;NAT路由器拥有公网Ip NAT解…

搜索引擎的高级语法

文章目录 精确搜索&#xff1a;双引号站内搜索&#xff1a;site通配符搜索&#xff1a;*减号缩小范围&#xff1a;-文档搜索&#xff1a;filetypeURL搜索&#xff1a; inurl标题搜索&#xff1a;intitle正文搜索&#xff1a;intext参考链接 精确搜索&#xff1a;双引号 “ ” …

RAG vs 微调:大模型知识更新的最优解之争

一、技术本质&#xff1a;知识注入的两条路径 在大模型应用落地的实践中&#xff0c;RAG&#xff08;检索增强生成&#xff09;与微调&#xff08;Fine-tuning&#xff09;已成为知识更新的两大核心技术路径。二者的本质差异在于是否对模型参数进行修改&#xff1a; 维度RAG微…

解释器体系结构风格-笔记

解释器&#xff08;Interpreter&#xff09;是一种软件设计模式或体系结构风格&#xff0c;主要用于为语言&#xff08;或表达式&#xff09;定义其语法、语义&#xff0c;并通过解释器来解析和执行语言中的表达式。解释器体系结构风格广泛应用于编程语言、脚本语言、规则引擎、…