news 2026/4/16 15:20:17

py连接Redis

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
py连接Redis

与mongo和mysql不同,redis多用于存储中间层,目前我多用于查重去重,我们需要安装一个库:

pip install redis

之前的aioredis合并到redis中了

同步操作

建立连接

importredis# 同步操作都这样导包client_syn=redis.Redis(host="127.0.0.1",port=6379,decode_responses=True)

同步操作

# 给Redis中键为"count"的字符串类型键值对设置值为10(覆盖原有值,无过期时间)client_syn.set("count",10)# 获取Redis中键为"count"的字符串类型值(返回bytes类型,若设置decode_responses=True则返回字符串)client_syn.get("count")# 向Redis中名为"duplicate"的集合(Set)添加元素"md5_1",集合自动去重client_syn.sadd("duplicate","md5_1")# 判断"md5_1"是否是Redis中"duplicate"集合的成员,返回True/Falseclient_syn.sismember("duplicate","md5_1")

去重操作一般用后两个,实现代码如下:

# 模拟待处理的一批数据(含重复值)data_list=["md5_1","md5_2","md5_1","md5_3"]# 这里其实会将某些一定不能相同的数据加密成md5用于去重操作fordataindata_list:# 1. 先判断当前数据是否已存在于去重集合中# (存在则跳过,实现去重)ifclient_syn.sismember("duplicate",data):print(f"数据{data}已存在,跳过处理")continue# 2. 数据不存在,执行业务处理(比如存储、爬虫等)print(f"处理新数据:{data}")# 3. 将处理后的新数据加入去重集合# (Sadd会自动忽略重复元素,即使重复执行也不会存入重复值)client_syn.sadd("duplicate",data)

异步操作

建立连接

第一种是普通连接,适合低并发的操作:
fromredisimportasyncioasaioredis client_aio=awaitaioredis.from_url("redis://localhost:6379/0",# Redis 地址:主机+端口+数据库编号(0-15)decode_responses=True,# 自动把 Redis 返回的 bytes 转字符串(无需手动 decode)password=None,# 无密码设为 None,有密码则填字符串(如 "123456")encoding="utf-8"# 字符编码,固定 utf-8 即可)

第二种是建立连接池,适合高并发:

# 先创建连接池(控制最大连接数,避免连接耗尽)pool=aioredis.ConnectionPool.from_url("redis://localhost:6379/0",max_connections=100,# 连接池最大连接数(根据服务器性能调整)decode_responses=True# 统一开启字符串自动解码)# 基于连接池创建 Redis 实例redis_pool=aioredis.Redis(connection_pool=pool)

基本操作

基础K-V操作(key value)
awaitclient_aio.set("name","张三",ex=60)# 新增:仅当 key=age 不存在时设置值=20(setnx = set if not exists,避免覆盖)awaitclient_aio.setnx("age",20)# 查询:获取单个 key 的值name=awaitclient_aio.get("name")age=awaitclient_aio.get("age")print(f"【单个查询】name={name}, age={age}")# 输出:name=张三, age=20# 删除:删除指定 keyawaitclient_aio.delete("age")print(f"【删除后查询】age={awaitclient_aio.get('age')}")# 输出:age=None# 批量设置:一次设置多个 key-valueawaitclient_aio.mset({"k1":"v1","k2":"v2","k3":"v3"})# 批量获取:一次获取多个 key 的值(返回列表,顺序与入参一致)batch_data=awaitclient_aio.mget(["k1","k2","k3"])print(f"【批量查询】{batch_data}")# 输出:['v1', 'v2', 'v3']

集合基础操作

# ========== 新增元素(自动去重) ==========# 向集合 unique_users 添加 3 个元素(其中 user1 重复,自动过滤)awaitclient_aio.sadd("unique_users","user1","user2","user1")# ========== 查询操作 ==========# 1. 获取集合所有元素(返回集合类型,天然去重)all_users=awaitclient_aio.smembers("unique_users")# 2. 判断元素是否在集合中(返回 True/False,去重核心判断)is_user1_exist=awaitclient_aio.sismember("unique_users","user1")is_user3_exist=awaitclient_aio.sismember("unique_users","user3")# 3. 获取集合元素数量user_count=awaitclient_aio.scard("unique_users")print(f"【集合所有元素】{all_users}")# 输出:{'user1', 'user2'}print(f"【user1 是否存在】{is_user1_exist}")# 输出:Trueprint(f"【user3 是否存在】{is_user3_exist}")# 输出:Falseprint(f"【集合元素数量】{user_count}")# 输出:2# ========== 删除元素 ==========# 从集合中删除指定元素 user2awaitclient_aio.srem("unique_users","user2")print(f"【删除后元素】{awaitclient_aio.smembers('unique_users')}")# 输出:{'user1'}

去重可配合sadd和sismember:

关闭连接

和pymongo一样,redis不论同步异步都不需要手动关闭连接

常用组合(异步)

importasynciofromredisimportasyncioasaioredisasyncdefget_redis_client():"""创建Redis异步连接(生产级连接池配置)"""# 自定义连接池(高并发/生产场景首选)pool=aioredis.ConnectionPool.from_url("redis://localhost:6379/0",max_connections=50,# 按需调整,默认足够日常使用decode_responses=True# 自动转字符串,省手动解码)returnaioredis.Redis(connection_pool=pool)asyncdefredis_common_operations():# 1. 获取连接redis=awaitget_redis_client()# ========== 【最常用】String(KV键值) ==========awaitredis.set("name","张三",ex=30)# 设置值+30秒过期print("String查询:",awaitredis.get("name"))# 获取值# ========== 【最常用】Set(去重核心) ==========awaitredis.sadd("unique_ids","id1","id2","id1")# 自动去重print("Set所有元素:",awaitredis.smembers("unique_ids"))# 查所有print("元素是否存在:",awaitredis.sismember("unique_ids","id1"))# 去重判断# ========== 【常用】Hash(存储对象) ==========awaitredis.hset("user:1001",mapping={"name":"李四","age":25})# 存对象print("Hash查询:",awaitredis.hgetall("user:1001"))# 查整个对象# ========== 【常用】Pipeline(批量原子操作) ==========pipe=redis.pipeline()pipe.set("a",1).incr("a").set("b",2)print("管道执行结果:",awaitpipe.execute())# 关闭连接(可选,程序退出自动释放)awaitredis.close()# 运行测试if__name__=="__main__":asyncio.run(redis_common_operations())

小结

redis主要作用是去重,所以会建立连接,然后hash加密作为值,通过sadd和sismember配合去重即可,后面随用随查,如有什么问题及时提出,加油加油
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:31:26

22、XLink 技术全面解析与应用示例

XLink 技术全面解析与应用示例 1. 资源类型与链接遍历 1.1 资源类型定义 在 XML 链接的世界里,资源类型主要分为本地资源和远程资源。下面的表格详细解释了这两种资源类型: | 资源类型 | 解释/定义 | | — | — | | 本地资源 | 一个 XML 元素,通过作为链接元素或链接元…

作者头像 李华
网站建设 2026/4/16 14:21:28

29、VML 技术全面解析:从基础到应用

VML 技术全面解析:从基础到应用 1. VML 概述 VML(Vector Markup Language)具有多方面优势,部分源于其矢量图形特性,部分得益于与 Microsoft Internet Explorer 的关联: - 文件传输快 :矢量图形文件通常较小,传输速度比位图图像更快。 - 易于创建和更新 :VML 文…

作者头像 李华
网站建设 2026/4/16 5:11:24

30、可缩放矢量图形(SVG)与VML、SMIL技术解析

可缩放矢量图形(SVG)与VML、SMIL技术解析 1. 可缩放矢量图形(SVG)概述 1998年,除了VML,W3C还收到了另外三项与矢量图形相关的提案: - 精密图形标记语言(1998年3月)。 - 万维网网络示意图,由研究理事会中央实验室理事会代表于1998年3月提交的提案(W3C也给予了注释…

作者头像 李华
网站建设 2026/4/16 11:50:35

如何免费整理Windows桌面:终极桌面管理工具NoFences指南

如何免费整理Windows桌面:终极桌面管理工具NoFences指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 在数字化时代,我们的Windows桌面往往被各种图…

作者头像 李华
网站建设 2026/4/16 12:36:45

Vue 3 + Element Plus MessageBox 从基础应用到高级架构实践

文章目录概述一、 核心概念:为什么选择 MessageBox?1. 命令式 vs. 声明式2. 基础调用与响应式集成1.安装与引入(保持不变)2.在 Composition API 中的响应式实践二、 进阶实践:驾驭复杂场景与自定义1. 动态内容与 VNode…

作者头像 李华
网站建设 2026/4/16 12:31:27

iStore插件中心完整使用手册:让OpenWRT插件管理变得简单高效

iStore插件中心完整使用手册:让OpenWRT插件管理变得简单高效 【免费下载链接】istore 一个 Openwrt 标准的软件中心,纯脚本实现,只依赖Openwrt标准组件。支持其它固件开发者集成到自己的固件里面。更方便入门用户搜索安装插件。The iStore is…

作者头像 李华