Python 操作 Redis 的客户端库 redis-py

Python 操作 Redis 的客户端库 redis-py

  • 1. Installation
  • 2. Connect and test
  • 3. Connection Pools
  • 4. Redis Commands
    • 4.1. `set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False, get=False, exat=None, pxat=None)`
      • 4.1.1. `setnx(name, value)`
      • 4.1.2. `setex(name, time, value)`
      • 4.1.3. `psetex(name, time_ms, value)`
    • 4.2. `flushdb(asynchronous=False, **kwargs)`
    • 4.3. `mset(mapping)`
    • 4.4. `mget(keys, *args)`
  • References

Connect your Python application to a Redis database

redis-py guide (Python)
https://redis.io/docs/latest/develop/clients/redis-py/

redis-py (Redis Python client)
https://github.com/redis/redis-py

The Python interface to the Redis key-value store.

redis-py is the Python client for Redis. redis-py requires a running Redis server.

The sections below explain how to install redis-py and connect your Python application to a Redis database.

1. Installation

To install redis-py, enter:

pip install redis
(base) yongqiang@yongqiang:~$ pip install redis
Collecting redisDownloading redis-6.4.0-py3-none-any.whl (279 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 279.8/279.8 kB 316.2 kB/s eta 0:00:00
Installing collected packages: redis
Successfully installed redis-6.4.0
(base) yongqiang@yongqiang:~$

For faster performance, install Redis with hiredis support. This provides a compiled response parser, and for most cases requires zero code changes. By default, if hiredis >= 1.0 is available, redis-py attempts to use it for response parsing.

The Python distutils packaging scheme is no longer part of Python 3.12 and greater. If you’re having difficulties getting redis-py installed in a Python 3.12 environment, consider updating to a recent release of redis-py.

pip install redis[hiredis]

2. Connect and test

Connect to localhost on port 6379, set a value in Redis, and retrieve it.

All responses are returned as bytes in Python. To receive decoded strings, set decode_responses=True.
redis 取出的结果默认是字节,可以设定 decode_responses=True 改成字符串。

#!/usr/bin/env python
# coding=utf-8import redisr = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'yongqiang')print(f"name: {r['name']}")print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")

redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。

#!/usr/bin/env python
# coding=utf-8import redisr = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'yongqiang')print(f"name: {r['name']}")print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
name: yongqiang
type: <class 'str'>
name: yongqiangProcess finished with exit code 0

3. Connection Pools

By default, redis-py uses a connection pool to manage connections. Each instance of a Redis class receives its own connection pool.

redis-py 使用 connection pool 来管理对一个 redis-server 的所有连接,避免每次建立、释放连接的开销。默认情况下,每个 Redis 实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为 Redis 参数,这样就可以实现多个 Redis 实例共享一个连接池。

#!/usr/bin/env python
# coding=utf-8import redispool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.set('name', 'yongqiang')print(f"name: {r['name']}")print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
name: yongqiang
type: <class 'str'>
name: yongqiangProcess finished with exit code 0

4. Redis Commands

https://redis.readthedocs.io/en/stable/commands.html

4.1. set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False, get=False, exat=None, pxat=None)

Set the value at key name to value.
在 Redis 中设置值,默认:不存在则创建,存在则修改。

https://redis.io/docs/latest/commands/set/

Parameters
name (Union[bytes, str, memoryview])
value (Union[bytes, bytearray, memoryview, str, int, float])
ex (Optional[Union[int, timedelta]]) - sets an expire flag on key name for ex seconds.
px (Optional[Union[int, timedelta]]) - sets an expire flag on key name for px milliseconds.
nx (bool) - if set to True, set the value at key name to value only if it does not exist. 如果设置为 True,则只有 name 不存在时,当前 set 操作才执行 (新建 / 添加)。
xx (bool) - if set to True, set the value at key name to value only if it already exists. 如果设置为 True,则只有 name 存在时,当前 set 操作才执行 (修改)。
keepttl (bool) - if True, retain the time to live associated with the key. (Available since Redis 6.0)
get (bool) - if True, set the value at key name to value and return the old value stored at key, or None if the key did not exist. (Available since Redis 6.2)
exat (Optional[Union[int, datetime]]) - sets an expire flag on key name for ex seconds, specified in unix time.
pxat (Optional[Union[int, datetime]]) - sets an expire flag on key name for ex milliseconds, specified in unix time.

Return type
Union[Awaitable[Any], Any]

  • ex (Optional[Union[int, timedelta]]) - sets an expire flag on key name for ex seconds.

设置过期时间是 2 秒。2 秒后,键 name 的值就变成 None

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.set('name', 'yongqiang', ex=2)print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")print("Start: %s" % time.ctime())
time.sleep(5)  # secs
print("End: %s" % time.ctime())print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
type: <class 'str'>
name: yongqiang
Start: Fri Aug 15 00:20:10 2025
End: Fri Aug 15 00:20:15 2025
name: NoneProcess finished with exit code 0
  • px (Optional[Union[int, timedelta]]) - sets an expire flag on key name for px milliseconds.

设置过期时间是 200 milliseconds。200 milliseconds 后,键 name 的值就变成 None

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.set('name', 'yongqiang', px=200)print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")print("Start: %s" % time.ctime())
time.sleep(2)  # secs
print("End: %s" % time.ctime())print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
type: <class 'str'>
name: yongqiang
Start: Fri Aug 15 00:24:02 2025
End: Fri Aug 15 00:24:04 2025
name: NoneProcess finished with exit code 0
  • nx (bool) - if set to True, set the value at key name to value only if it does not exist.

如果设置为 True,则只有 name 不存在时,当前 set 操作才执行 (新建 / 添加)。

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)ret1 = r.set('name', 'yongqiang', nx=True)
print(f"ret1: {ret1}")ret2 = r.set('name', 'cheng', nx=True)
print(f"ret2: {ret2}")time.sleep(2)  # secs
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
ret1: True
ret2: NoneProcess finished with exit code 0
  • xx (bool) - if set to True, set the value at key name to value only if it already exists.

如果设置为 True,则只有 name 存在时,当前 set 操作才执行 (修改)。

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)ret1 = r.set('name', 'yongqiang', xx=True)
print(f"ret1: {ret1}")ret2 = r.set('name', 'yongqiang')
print(f"ret2: {ret2}")ret3 = r.set('name', 'cheng', xx=True)
print(f"ret3: {ret3}")time.sleep(2)  # secs
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
ret1: None
ret2: True
ret3: TrueProcess finished with exit code 0

4.1.1. setnx(name, value)

Set the value of key name to value if key doesn’t exist.

https://redis.io/docs/latest/commands/setnx/

Parameters
name (Union[bytes, str, memoryview])
value (Union[bytes, bytearray, memoryview, str, int, float])

Return type
Union[Awaitable[Any], Any]

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)ret1 = r.setnx('name', 'yongqiang')
print(f"ret1: {ret1}")ret2 = r.setnx('name', 'cheng')
print(f"ret2: {ret2}")time.sleep(2)  # secs
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
ret1: True
ret2: FalseProcess finished with exit code 0

4.1.2. setex(name, time, value)

Set the value of key name to value that expires in time seconds. time can be represented by an integer or a Python timedelta object.

https://redis.io/docs/latest/commands/setex/

Parameters
name (Union[bytes, str, memoryview])
time (Union[int, timedelta])
value (Union[bytes, bytearray, memoryview, str, int, float])

Return type
Union[Awaitable[Any], Any]

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)r.setex('name', 2, 'yongqiang')print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")print("Start: %s" % time.ctime())
time.sleep(5)  # secs
print("End: %s" % time.ctime())print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
type: <class 'str'>
name: yongqiang
Start: Fri Aug 15 20:27:53 2025
End: Fri Aug 15 20:27:58 2025
name: NoneProcess finished with exit code 0

4.1.3. psetex(name, time_ms, value)

Set the value of key name to value that expires in time_ms milliseconds. time_ms can be represented by an integer or a Python timedelta object.

https://redis.io/commands/psetex

Parameters
name (Union[bytes, str, memoryview])
time_ms (Union[int, timedelta])
value (Union[bytes, bytearray, memoryview, str, int, float])

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)r.psetex('name', 2000, 'yongqiang')print(f"type: {type(r.get('name'))}")
print(f"name: {r.get('name')}")print("Start: %s" % time.ctime())
time.sleep(5)  # secs
print("End: %s" % time.ctime())print(f"name: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
type: <class 'str'>
name: yongqiang
Start: Fri Aug 15 20:32:44 2025
End: Fri Aug 15 20:32:49 2025
name: NoneProcess finished with exit code 0

4.2. flushdb(asynchronous=False, **kwargs)

Delete all keys in the current database.

https://redis.io/docs/latest/commands/flushdb/

asynchronous indicates whether the operation is executed asynchronously by the server.
清空当前 db 中的数据,默认是同步,异步 asynchronous=True,会新起一个线程进行清空操作,不阻塞主线程。

Parameters
asynchronous (bool)

Return type
Union[Awaitable[Any], Any]

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)

4.3. mset(mapping)

Sets key/values based on a mapping. Mapping is a dictionary of key/value pairs. Both keys and values should be strings or types that can be cast to a string via str().

https://redis.io/commands/mset

Parameters
mapping (Mapping[AnyKeyT, Union[bytes, bytearray, memoryview, str, int, float]])

Return type
Union[Awaitable[Any], Any]

4.4. mget(keys, *args)

Returns a list of values ordered identically to keys.

https://redis.io/commands/mget

Parameters
keys (Union[bytes, str, memoryview, Iterable[Union[bytes, str, memoryview]]])
args (Union[bytes, bytearray, memoryview, str, int, float])

Return type
Union[Awaitable[Any], Any]

#!/usr/bin/env python
# coding=utf-8import redis
import timepool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.flushdb(asynchronous=False)r.mset({'k1': 'value1', 'k2': 'value2', 'k3': 'value3'})
print(r.mget("k1"))
print(r.mget("k1", "k2"))
print(r.mget("k1", "k2", "k3"))print(f"\nname: {r.get('name')}")
/home/yongqiang/miniconda3/bin/python /home/yongqiang/stable_diffusion_work/stable_diffusion_diffusers/forever.py 
['value1']
['value1', 'value2']
['value1', 'value2', 'value3']name: NoneProcess finished with exit code 0

References

[1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/
[2] What is Redis? https://www.ibm.com/think/topics/redis

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

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

相关文章

社区物业HCommunity本地部署手册

HC小区管理系统安装手动版 更多文章参考&#xff1a; http://www.homecommunity.cn/pages/hc/hcH5_cn.html 1.0 说明 很多开发不太喜欢用梓豪安装&#xff0c;希望通过手工自己安装&#xff0c;这个就需要开发人员 有一定的安装软件能力&#xff0c;比如能够自行安装mysql能…

单例模式-使用局部变量懒汉不用加锁

在 C11 及之后&#xff0c;“局部静态变量懒汉”&#xff08;Meyers’ Singleton&#xff09;不需要自己加锁&#xff0c;标准已经帮你做好了线程安全。 Singleton& getInstance() {static Singleton inst; // ← 这一句并发时只会初始化一次return inst; }首次调用时&am…

51单片机-GPIO介绍

本章概述思维导图&#xff1a;51单片机引脚介绍STC89系列51单片机引脚介绍STC89系列51单片机的引脚是单片机与外部电路连接的接口&#xff0c;用于实现电源供电、时钟信号输入、控制信号输出以及数据输入输出等功能。PDIP封装引脚图&#xff1a;1. 电源引脚&#xff1a;VCC&…

CERT/CC警告:新型HTTP/2漏洞“MadeYouReset“恐致全球服务器遭DDoS攻击瘫痪

2025年8月15日CERT/CC&#xff08;计算机应急响应协调中心&#xff09;近日发布漏洞公告&#xff0c;警告多个HTTP/2实现中新发现的缺陷可能被威胁行为者用于发起高效拒绝服务&#xff08;DoS&#xff09;或分布式拒绝服务&#xff08;DDoS&#xff09;攻击。该漏洞被非正式命名…

[Chat-LangChain] 会话图(LangGraph) | 大语言模型(LLM)

第二章&#xff1a;会话图&#xff08;LangGraph&#xff09; 在第一章中&#xff0c;我们学习了前端用户界面——这是聊天机器人的"面孔"&#xff0c;我们在这里输入问题并查看答案。 我们看到了消息如何从聊天窗口传递到聊天机器人的"大脑"。现在&…

Flask错误处理与会话技术详解

flask入门day03 错误处理 1.abort函数&#xff1a;放弃请求并返回错误代码 详细状态码 from flask import Flask,abort,render_template ​ app Flask(__name__) ​ app.route(/) def index():return 我是首页 ​ app.route(/error) def error():abort(404)return 没有找到…

java程序打包成exe,再打成安装包,没有jdk环境下可运行

一、前提条件准备&#xff1a;1、要被打包的程序文件&#xff1a;rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、图标文件tubiao123.ico3、jre4、打包成exe的软件 config.exe4j5、打成安装包的软件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步骤 按照以下图进行…

区块链技术原理(11)-以太坊交易

文章目录什么是交易&#xff1f;交易类型交易生命周期关键概念&#xff1a;Gas 与交易费用交易状态与失败原因总结什么是交易&#xff1f; “交易&#xff08;Transaction&#xff09;” 是从一个账户向另一个账户发送的经过数字签名的指令 。例如&#xff0c;如果 Bob 发送 A…

小兔鲜儿-小程序uni-app(二)

小兔鲜儿-小程序uni-app7.小兔鲜儿 - 用户模块会员中心页(我的)静态结构参考代码会员设置页分包预下载静态结构退出登录会员信息页静态结构获取会员信息渲染会员信息更新会员头像更新表单信息8.小兔鲜儿 - 地址模块准备工作静态结构地址管理页地址表单页动态设置标题新建地址页…

BLE 广播信道与数据信道:冲突避免、信道映射与自适应跳频实现

低功耗蓝牙(BLE)技术凭借低功耗、短距离、低成本的特性,已广泛应用于智能家居、可穿戴设备、工业物联网等领域。在 BLE 协议中,信道管理是保障通信可靠性的核心机制,其中广播信道与数据信道的设计、冲突避免策略、跳频技术更是面试中的高频考点。本文将从基础原理到实战真…

nodejs03-常用模块

nodejs 常用的核心模块 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c; 它允许 JavaScript 运行在服务器端。Node.js 拥有丰富的标准库&#xff0c;也就是核心模块&#xff0c; 这些模块提供了各种功能&#xff0c; 使得开发服务器端应用程序变得简单高…

多路混音声音播放芯片型号推荐

以下是唯创知音旗下主流的多路声音播放芯片深度解析&#xff0c;结合精准参数、丰富场景及技术特性&#xff0c;满足智能设备多样化音频需求&#xff1a;一、WTV380/890 系列&#xff1a;高集成多模态交互芯片核心参数通道能力&#xff1a;支持8 路独立语音输出&#xff0c;可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey&#xff1a;倒位序 逐级蝶形&#xff0c;入口 fft(int N, complex f[])”拆成三件事它在讲什么 “基 2 Cooley–Tukey” 指的是最常见的 FFT 算法&#xff1a;长度 N 必须是 2 的整数次幂&#xff0c;把离散傅里叶变换分解成一层一层的“2 点蝶形”运…

小白挑战一周上架元服务——ArkUI04

文章目录前言一、ArkUI是何方神圣&#xff1f;二、声明式UI三、组件1.基础组件2.布局容器组件3.导航组件4.自定义组件5.组件生命周期四、状态管理1.State装饰器: 状态变量2.Prop装饰器&#xff1a;父子单向同步3.Link装饰器&#xff1a;父子双向同步4.Provide/Consume装饰器&am…

剧本杀小程序系统开发:构建剧本杀社交新生态

在社交需求日益多样化的今天&#xff0c;剧本杀凭借其独特的社交属性&#xff0c;成为了人们热衷的社交娱乐方式之一。而剧本杀小程序系统开发&#xff0c;则进一步拓展了剧本杀的社交边界&#xff0c;构建起一个全新的剧本杀社交新生态&#xff0c;让玩家在推理与角色扮演中&a…

AI提高投放效率的核心策略

内容概要人工智能技术正深刻改变着广告投放领域&#xff0c;其核心价值在于显著提升投放效率。通过融合智能算法优化、实时数据分析与自动化投放流程&#xff0c;AI系统能够以前所未有的速度和精度处理海量信息&#xff0c;驱动更精准的营销决策。这不仅大幅缩短了传统人工操作…

OpenBMC 中命令模式的深度解析:从原理到实现

引言 在 OpenBMC 的设计中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;被广泛应用于各种场景&#xff0c;特别是 IPMI 命令处理、异步操作封装和用户请求管理等。本文将深入分析 OpenBMC 中命令模式的实现原理、架构设计以及完整的执行流程&#xff0c;并通过…

从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.15

第十七天 第五十七&#xff0c;五十八&#xff0c;五十九和六十集 第五十六集 删除链表结点 没什么好说的关键部分代码如图 链表的插入操作 依旧没有啥可以说的代码部分大家看视频就能看懂&#xff0c;大家应该是没有什么问题的吧&#xff1f; 第五十七集 共用体形式结构与结构…

云服务器网站无法访问的系统化故障排查指南及多维度解决方案

当云服务器上的网站突然无法访问时&#xff0c;这种突发状况往往让人措手不及。别担心&#xff0c;我们可以通过系统化的排查流程快速定位问题根源。以下是经过实战验证的故障排除指南&#xff0c;帮您分步解决网站访问异常问题。一、基础状态确认 服务器的生命体征就像人体的脉…

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有权利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …