如何使用Python库连接Redis

1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。

  • 安装redis
pip install redis
import redis
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)class RedisUtils:def __init__(self, host='localhost', port=6379, db=0, decode_responses=True,password=None):"""初始化 Redis 连接:param host: Redis 主机,默认为 localhost:param port: Redis 端口,默认为 6379:param db: Redis 数据库,默认为 0:param decode_responses: 如果为 True,则自动解码 Redis 返回的字节串为字符串:param password: Redis密码(如果设置了密码)"""self.host = hostself.port = portself.db = dbself.decode_responses = decode_responses# 创建 Redis 连接实例self.redis = redis.StrictRedis(host=self.host,port=self.port, db=self.db, decode_responses=self.decode_responses,password=password)def set(self, key, value, ex=None, px=None, nx=False, xx=False):"""设置 Redis 键值对:param key: 键:param value: 值:param ex: 键值对过期时间(秒):param px: 键值对过期时间(毫秒):param nx: 只在键不存在时设置:param xx: 只在键存在时设置:return: 执行结果(True 或 False)"""try:result = self.redis.set(key, value, ex=ex, px=px, nx=nx, xx=xx)logger.info(f"Set key '{key}' with value '{value}'")return resultexcept Exception as e:logger.error(f"Error setting key '{key}': {e}")return Nonedef get(self, key):"""获取 Redis 键的值:param key: 键:return: 值(如果不存在则返回 None)"""try:value = self.redis.get(key)logger.info(f"Get key '{key}' with value '{value}'")return valueexcept Exception as e:logger.error(f"Error getting key '{key}': {e}")return Nonedef delete(self, key):"""删除 Redis 键:param key: 键:return: 删除结果(删除的键的数量)"""try:result = self.redis.delete(key)logger.info(f"Deleted key '{key}'")return resultexcept Exception as e:logger.error(f"Error deleting key '{key}': {e}")return Nonedef exists(self, key):"""判断 Redis 键是否存在:param key: 键:return: 是否存在(True 或 False)"""try:exists = self.redis.exists(key)logger.info(f"Key '{key}' exists: {exists}")return existsexcept Exception as e:logger.error(f"Error checking existence of key '{key}': {e}")return Falsedef hset(self, name, key, value):"""设置哈希表中的字段:param name: 哈希表名:param key: 字段名:param value: 字段值:return: 执行结果"""try:result = self.redis.hset(name, key, value)logger.info(f"Set hash '{name}' field '{key}' with value '{value}'")return resultexcept Exception as e:logger.error(f"Error setting hash '{name}' field '{key}': {e}")return Nonedef hget(self, name, key):"""获取哈希表中的字段:param name: 哈希表名:param key: 字段名:return: 字段值"""try:value = self.redis.hget(name, key)logger.info(f"Get hash '{name}' field '{key}' with value '{value}'")return valueexcept Exception as e:logger.error(f"Error getting hash '{name}' field '{key}': {e}")return Nonedef lpush(self, name, *values):"""向 Redis 列表左侧插入元素:param name: 列表名:param values: 要插入的值:return: 执行结果(列表长度)"""try:result = self.redis.lpush(name, *values)logger.info(f"LPush to list '{name}' values {values}")return resultexcept Exception as e:logger.error(f"Error pushing to list '{name}': {e}")return Nonedef lrange(self, name, start, end):"""获取 Redis 列表中的元素:param name: 列表名:param start: 起始索引:param end: 结束索引:return: 列表元素"""try:values = self.redis.lrange(name, start, end)logger.info(f"LRANGE from list '{name}' from index {start} to {end} with values {values}")return valuesexcept Exception as e:logger.error(f"Error getting range from list '{name}': {e}")return Nonedef sadd(self, name, *values):"""向 Redis 集合添加元素:param name: 集合名:param values: 要添加的值:return: 添加的元素数量"""try:result = self.redis.sadd(name, *values)logger.info(f"SAdd to set '{name}' values {values}")return resultexcept Exception as e:logger.error(f"Error adding to set '{name}': {e}")return Nonedef smembers(self, name):"""获取 Redis 集合中的所有元素:param name: 集合名:return: 集合中的元素"""try:values = self.redis.smembers(name)logger.info(f"SMEMBERS from set '{name}' with values {values}")return valuesexcept Exception as e:logger.error(f"Error getting members from set '{name}': {e}")return Nonedef close(self):"""关闭 Redis 连接"""try:self.redis.close()logger.info("Redis connection closed.")except Exception as e:logger.error(f"Error closing Redis connection: {e}")

2、redis-py-cluster 是一个 Python 库,它允许你使用 Redis 集群

  • 安装redis-py-cluster
pip install redis-py-cluster
from rediscluster import RedisCluster
import logging# 设置日志记录
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)class RedisClusterUtils:def __init__(self, startup_nodes, decode_responses=True,password=None):"""初始化 Redis 集群连接:param startup_nodes: Redis 集群的初始节点列表:param decode_responses: 如果为 True,自动解码 Redis 返回的字节串为字符串"""self.startup_nodes = startup_nodesself.decode_responses = decode_responsesself.password = passwordtry:# 初始化 Redis 集群客户端self.redis = RedisCluster(startup_nodes=startup_nodes, decode_responses=decode_responses,password=password)logger.info("Connected to Redis cluster successfully.")except Exception as e:logger.error(f"Error connecting to Redis cluster: {e}")raisedef set(self, key, value, ex=None, px=None, nx=False, xx=False):"""设置 Redis 键值:param key: 键:param value: 值:param ex: 设置过期时间(秒):param px: 设置过期时间(毫秒):param nx: 只在键不存在时设置:param xx: 只在键存在时设置:return: 执行结果"""try:result = self.redis.set(key, value, ex=ex, px=px, nx=nx, xx=xx)logger.info(f"Set key '{key}' with value '{value}'")return resultexcept Exception as e:logger.error(f"Error setting key '{key}': {e}")return Nonedef get(self, key):"""获取 Redis 键的值:param key: 键:return: 值"""try:value = self.redis.get(key)logger.info(f"Get key '{key}' with value '{value}'")return valueexcept Exception as e:logger.error(f"Error getting key '{key}': {e}")return Nonedef delete(self, key):"""删除 Redis 键:param key: 键:return: 删除操作的结果"""try:result = self.redis.delete(key)logger.info(f"Deleted key '{key}'")return resultexcept Exception as e:logger.error(f"Error deleting key '{key}': {e}")return Nonedef hset(self, name, key, value):"""设置哈希表字段:param name: 哈希表名:param key: 字段:param value: 值:return: 执行结果"""try:result = self.redis.hset(name, key, value)logger.info(f"Set hash '{name}' field '{key}' with value '{value}'")return resultexcept Exception as e:logger.error(f"Error setting hash '{name}' field '{key}': {e}")return Nonedef hget(self, name, key):"""获取哈希表字段的值:param name: 哈希表名:param key: 字段:return: 字段值"""try:value = self.redis.hget(name, key)logger.info(f"Get hash '{name}' field '{key}' with value '{value}'")return valueexcept Exception as e:logger.error(f"Error getting hash '{name}' field '{key}': {e}")return Nonedef lpush(self, name, *values):"""向列表左侧插入数据:param name: 列表名:param values: 要插入的值:return: 执行结果"""try:result = self.redis.lpush(name, *values)logger.info(f"LPush to list '{name}' values {values}")return resultexcept Exception as e:logger.error(f"Error pushing to list '{name}': {e}")return Nonedef lrange(self, name, start, end):"""获取列表中的元素:param name: 列表名:param start: 起始索引:param end: 结束索引:return: 列表元素"""try:values = self.redis.lrange(name, start, end)logger.info(f"LRANGE from list '{name}' from index {start} to {end} with values {values}")return valuesexcept Exception as e:logger.error(f"Error getting range from list '{name}': {e}")return Nonedef pipeline(self):"""创建 Redis 管道操作:return: 管道对象"""return self.redis.pipeline()def scan(self, cursor=0, match=None, count=None):"""使用 SCAN 命令遍历 Redis 键:param cursor: 游标:param match: 匹配模式:param count: 每次扫描的数量:return: (游标, 键列表)"""try:cursor, keys = self.redis.scan(cursor, match=match, count=count)logger.info(f"SCAN with cursor {cursor}, found keys {keys}")return cursor, keysexcept Exception as e:logger.error(f"Error scanning keys: {e}")return cursor, []def close(self):"""关闭 Redis 连接"""try:self.redis.close()logger.info("Redis connection closed.")except Exception as e:logger.error(f"Error closing Redis connection: {e}")

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

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

相关文章

【代码随想录day57】【C++复健】 53. 寻宝(prim算法);53. 寻宝(kruskal算法)

53. 寻宝(prim算法) 好像在研究生的算法课上学过prim算法和kruskal算法,不过当时只是了解了一下大致的概念和流程,并没有涉及到如何去写代码的部分,今天也算是学习了一下这两个算法的代码应该如何去实现,还…

使用OpenTK展示3D点云图像(C#)

最近在研究3D显示,找到一款在winform上展示3D点云的控件,并且实现了点线面的展示,及光照渲染纹理贴图等功能,如下面几张图所展示。 一些基础知识可以在LearnOpenTK - OpenTK 这个网站上学习到。 我这边使用的是openTK3.3.3版本&a…

MetaGPT源码 (Memory 类)

目录 MetaGPT源码:Memory 类例子 MetaGPT源码:Memory 类 这段代码定义了一个名为 Memory 的类,用于存储和管理消息(Message)对象。Memory 提供了多种操作消息的功能,包括添加单条或批量消息、按角色或内容筛选消息、删除最新消息…

pythonOpenCV篇:0基础带你python入门之常用函数

① 二值化函数 功能:将图像转换为二值图像(黑白图像),将像素值分为两种类别:前景(白)和背景(黑)。函数:cv2.threshold()参数: src:输…

小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)

当我还是初学者的时候,我经常思考有没有比慢慢求每一位数字然后考虑正序,逆序输出要快的办法...长期琢磨,必有所获! 我刚学数据结构的时候还没意识到栈,队列还能这样用,虽然说有点杀鸡用牛刀的感觉&#x…

详细解析RNNoise:基于深度学习的语音噪声抑制技术

引言 在语音通信、语音识别以及音频处理领域,噪声抑制是一个至关重要的任务。环境噪声,如风声、交通声和人群声,通常会影响语音的清晰度和质量,特别是在远程通信和在线会议中。为了提高语音质量,许多噪声抑制技术应运…

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四:为什么要顺应技术的生命周期? 简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势? 2024-08-29 17:30:07 你好&am…

跟李笑来学美式俚语(Most Common American Idioms): Part 66

Most Common American Idioms: Part 66 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…

【Sentinel Go】新手指南、流量控制、熔断降级和并发隔离控制

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开…

代码随想录第43天

300.最长递增子序列 # Dynamic programming. class Solution:def lengthOfLIS(self, nums: List[int]) -> int:if not nums: return 0dp [1] * len(nums)for i in range(len(nums)):for j in range(i):if nums[j] < nums[i]: # 如果要求非严格递增&#xff0c;将此行 …

Anaconda Conda Pip 的区别与联系

在Python生态中,Anaconda、Conda和Pip是三个非常重要的工具,它们在包管理和环境管理方面发挥着关键作用。 Anaconda Anaconda是一个为科学计算而设计的Python发行版,它集成了Conda、Python以及大量的数据科学相关库,如NumPy、Pandas等。Anaconda的主要优势在于它提供了一个…

Y3编辑器官方文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)

文章目录 一、新建项目二、 编辑器主界面2.1 游戏场景2.2 导航栏/菜单栏2.3 功能栏三、菜单栏详细介绍3.1 文件3.1.1 版本管理3.1.2 项目管理(多关卡)3.1.2.1 多关卡功能说明3.1.2.2 关卡切换与关卡存档3.2 编辑3.2.1 通用设置3.2.2 键位设置3.3 窗口(日志)3.4 细节3.4.1 语言…

OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数&#xff0c;用于将点从齐次坐标&#xff08;homogeneous coordinates&#xff09;…

前端视角下的Go语法学习:创建 Go 项目

今日话题 使用 GoLand 创建 Go 项目 作者&#xff1a; 时间&#xff1a;2024年6月20日 17时16分14秒 主线任务 一、GoLand 创建项目 1、点击 “new Project” 按钮 2、已经有下载过两个 Golang SDK 版本&#xff0c;选择版本创建即可~ 3、如果没有下载过Golang SDK&#…

vue3使用keep-alive做缓存

暂未整理&#xff0c;等待更新 文章目录 一、注意项1.不生效原因 二、使用步骤1.引入库2.读入数据 总结 一、注意项 1.不生效原因 vue3无beforeRouteEnter&#xff0c;但可以写。<script lang"jsx">需要一致:include"[‘experienceMaintenance’, ‘rea…

Android13应用在后台录音无声音

最近在做项目&#xff0c;对讲应用放在后台&#xff0c;录音无声音&#xff0c;最后解决。 一 现象 对讲应用运行在后台&#xff0c;录音无效查看日志&#xff0c;AudioRecorder录音回调全是0&#xff1b;状态栏无通知&#xff0c;无申请通知权限。 二解决 看了现象应该能够…

数据结构6.3--交换排序

目录 交换排序基本思想 1.冒泡排序 2.快速排序 2.1hoare版本 2.2挖坑法 2.3前后指针版本 交换排序基本思想 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾…

Unity 制作一个视频播放器(打包后,可在外部编辑并放置新的视频)

效果展示&#xff1a; 在这里&#xff0c;我把视频名称&#xff08;Json&#xff09;和对应的视频资源都放在了StreamingAssets文件夹下&#xff0c;以便于打包后&#xff0c;客户还可以自己在外部增加、删除、修改对应的视频资料。 如有需要&#xff0c;请联细抠抠。

软件工程知识点

软件开发模型1 软件开发模型2 软件过程模型习惯上也称为软件开发模型&#xff0c;它是软件开发全部过程、活动和任务的结构框典型的软件过程模型有瀑布模型、增量模型、演化模型(原型模型、螺旋模型)、喷泉模型基于构件的开发模型和形式化方法模型等。 极限编程 开发方法 RUP…

Apache Echarts和POI

目录 Apache ECharts 介绍 入门 绘制一个简单的图表 Apache POI 介绍 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 导出Excel表格 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xf…