如何使用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}")相关文章:
如何使用Python库连接Redis
1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。 安装redis pip install redisimport redis import logginglogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class RedisUtils:def __init__(s…...
Vant UI +Golang(gin) 上传文件
前端基本用法:点击查看 实现代码: const afterRead (file) > {console.log(file);//set content-type to multipart/form-dataconst formData new FormData();formData.append("file", file.file);request.POST("/api/v1/users/up…...
【Unity高级】如何实现粒子系统的间歇式喷射
先看下要最终实现的效果: 代码如下: using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…...
通过linux命令获取自选股票价格及大盘涨跌幅
技术发展与数据获取需求 互联网与金融数据融合:随着互联网的普及和金融市场的数字化发展,金融数据的获取和分析变得更加便捷和重要。投资者希望能够及时、准确地获取股票价格和市场指数等信息,以便做出合理的投资决策。Linux 作为一种强大的操作系统,为数据获取和处理提供…...
透彻理解并解决Mockito模拟框架的单元测试无法运行的问题
本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候, 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮,单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...
vue3字典数据的显示问题(使用hooks解决)
我们在使用 element-plus的时候,经常会使用一些字典数据, 在搜索框的时候,字典数数要使用 el-select el-option 来显示,当在table表格的时候,我们通常记录的是 字典数据的id , 又要把它改变成 字典数据的 name 属性 因…...
Elasticsearch 单节点安全配置与用户认证
Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞:Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时,需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤,为单节…...
二分查找(带图详解)
优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中,我会给大家分享二分查找及其扩展。 这是链接-&…...
【Git】:标签管理
目录 理解标签 创建标签 操作标签 理解标签 标签的作用 标记版本:标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项目发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样…...
物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉
0. 要实现的效果 让树莓派可以识别身边的一些物品,比如电脑,鼠标,键盘,杯子,行李箱,双肩包,床,椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…...
单片机软件工程师前景分析
单片机软件工程师的前景在2024年看起来是积极的。随着物联网(IoT)、自动化、智能设备等领域的快速发展,对于能够开发基于单片机(MCU)如STM32、ARM、51等嵌入式系统的软件工程师需求持续增长。这些工程师负责设计和实现…...
在Java中几种常用数据压缩算法的实现及其优劣势
在Java中几种常用数据压缩算法的实现及其优劣势 背景:项目需要引入Redis作为缓存组件,需要考虑到Redis的内存占用(机器内存越大,成本越高),因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...
Word——如何打出 符号中的 1、2、3等带圆圈的序号
一、方式1 1.1:点击 插入-符号 1.2:字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈:输入 2460,然后按 AItX 带2的圈:输入 2461,然后按 AItX 带3的圈:输入 2462,然后按 …...
操作系统之进程与线程
进程 定义: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 组成: 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源(如打开的文件)等。 …...
代码随想录算法训练营打卡第35天:背包问题
前言 zaccheo打卡代码随想录第35天 由于这段时间工作太忙了(加上我的懒病犯了)导致迟打卡了好几天555555.。。。 今天的主要是动态规划中的背包问题,这个真的是蛮难理解的,我把我自己强行按在椅子上半个小时一点一点的看卡哥文章…...
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…...
vscode(一)安装(ubuntu20.04)
1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...
利用永恒之蓝对win7进行键盘记录
打开kali中的msfconsole 找到永恒之蓝,设置靶机ip,后可以exploit,也可以run 连接成功 查看进程,选择监听靶机win7上的cmd.exe进程 当前进程不是1484,需要迁移到1484 cmd.exe,进程迁移 键盘监听,…...
万字长文解读深度学习——dVAE(DALL·E的核心部件)
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...
RL仿真库pybullet
1. 介绍 PyBullet是一个基于Bullet Physics引擎的物理仿真Python接口,主要用于机器人仿真模拟。 1.1 主要特点 提供大量预设的机器人模型,例如URDF(统一机器人描述格式)、SDF、MJCF 格式。适用于训练和评估强化学习算法,提供了大量的强化学…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
