news 2026/9/4 5:09:06

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/9/4 0:12:37

如何在浏览器中轻松创建专业Word文档:DOCX.js实用指南

如何在浏览器中轻松创建专业Word文档:DOCX.js实用指南 【免费下载链接】DOCX.js Generate Microsoft Word DOCX files in pure client-side JavaScript. Try in Chrome 项目地址: https://gitcode.com/gh_mirrors/do/DOCX.js 还在为生成Word文档而烦恼吗&…

作者头像 李华
网站建设 2026/9/3 9:58:40

2025终极指南:LinkSwift网盘直链解析工具,一键获取高速下载链接

2025终极指南:LinkSwift网盘直链解析工具,一键获取高速下载链接 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用&am…

作者头像 李华
网站建设 2026/9/3 16:50:31

24、深入探索XPath与XPointer:精准定位XML资源

深入探索XPath与XPointer:精准定位XML资源 1. XPath表达式基础 XPath表达式可包含路径或函数。在完整路径中,函数包含在谓词里;在缩写路径中,函数跟在连接符号 # 之后。例如 position() 函数,之前在 <smokeyPrice> 链接元素示例中已介绍过,在位置路径的第二…

作者头像 李华
网站建设 2026/9/4 11:47:49

33、资源描述框架(RDF):语义网的关键技术

资源描述框架(RDF):语义网的关键技术 1. 网络信息搜索难题 在网络信息的海洋中,搜索合适的内容并非易事。一方面,存在简单的语义问题,比如搜索结果可能涉及牙科、五金店、军事演习等,而我们原本想要的可能是矿业勘探和生产技术相关内容。如果再遇到语言或文化变量,那…

作者头像 李华
网站建设 2026/9/4 0:21:52

43、MathML:发展、应用与关键技术解析

MathML:发展、应用与关键技术解析 1. MathML概述 MathML(Mathematical Markup Language)是用于描述数学表达式的一种规范,由W3C定义,旨在为机器间的数学交流提供基础,为网页中包含数学表达式提供必要的支持。它能帮助技术出版商和开发者解决诸多历史遗留问题,如符号歧…

作者头像 李华
网站建设 2026/9/4 11:32:40

百度ERNIE 4.5大模型震撼发布:多模态技术突破与开源生态构建

在人工智能技术飞速迭代的今天&#xff0c;百度最新推出的ERNIE 4.5大语言模型凭借三大核心技术创新&#xff0c;重新定义了多模态智能系统的性能边界。该模型通过异构混合专家&#xff08;MoE&#xff09;架构设计、动态资源调度机制以及极致量化压缩方案的深度融合&#xff0…

作者头像 李华