Python - Python操作Redis
安装Redis可参考
Redis-入门简介-CSDN博客
在Python中接入Redis数据库通常使用redis-py
这个库
一、安装Redis
首先,需要安装redis-py
库。通过pip来安装
pip install redis
二、连接Redis
'''
Redis连接操作
'''
import redisdef redis_connect():try:redisClient = redis.Redis(host='127.0.0.1', port=6379, password=None)# <redis.client.Redis(<redis.connection.ConnectionPool(<redis.connection.Connection(host=127.0.0.1,port=6379,db=0)>)>)>print(redisClient)# 设置key为‘name’的值以及过期时间redisClient.set('name', 'zhangsan', ex=300)# 获取key为‘name’的过期时间print(redisClient.ttl('name')) # 300# 获取key为‘name’的值print(redisClient.get('name')) # b'zhangsan';前面的'b'代表字节redisClient.set('nickname', '张三', ex=500)print(redisClient.get('nickname')) # b'\xe5\xbc\xa0\xe4\xb8\x89'print(redisClient.get('nickname').decode()) # 张三redisClient.set('num', '10')print(redisClient.incr('num')) # 11print(redisClient.incrby('num', 5)) # 16print(int(redisClient.get('num').decode())) # 16# 使用哈希表redisClient.hset('user', 'id', '1001')redisClient.hset('user', 'name', '张三')print(redisClient.hgetall('user')) # {b'id': b'1001', b'name': b'\xe5\xbc\xa0\xe4\xb8\x89'}print(redisClient.hget('user', 'name').decode()) # 张三# 使用列表redisClient.lpush('list', 'a', 'b', 'c')# 获取列表中的所有元素print(redisClient.lrange('list', 0, -1)) # [b'c', b'b', b'a']# 使用集合redisClient.sadd('myset', 'a')redisClient.sadd('myset', 'b')redisClient.smembers('myset') # 获取集合中的所有元素except Exception as ex:print(ex.args)finally:redisClient.close()if __name__ == '__main__':redis_connect()
使用连接池(可选)
为了提高性能和效率,特别是在多线程环境下,建议使用连接池
'''
Redis连接池
'''
import redisdef redis_connect():"""redis连接:return:"""try:pool = redis.ConnectionPool(host='127.0.0.1', port=6379, decode_responses=True)redisClient = redis.Redis(connection_pool=pool)redisClient.set('nickname', '张三', ex=500)print(redisClient.get('nickname')) # b'\xe5\xbc\xa0\xe4\xb8\x89'print(redisClient.get('nickname').decode()) # 张三except Exception as ex:print(ex)finally:redisClient.close()pool.close()if __name__ == '__main__':redis_connect()
在使用连接池的情况下,通常不需要手动关闭每个连接,连接池会自动管理连接。如果你使用的是连接池,只需在不再需要时关闭整个连接池
finally:redisClient.close()pool.close()
三、封装连接Redis数据库工具
'''
1、初始化连接:在 __init__ 中,我们通过 redis.StrictRedis 初始化 Redis 连接,可以根据需要传递不同的 Redis 服务器信息。
2、基本操作封装:
(1)set 和 get 分别用于设置和获取键值。
(2)delete 用于删除指定的键。
(3)exists 用于检查键是否存在。
3、批量操作:提供了 set_multiple 和 get_multiple 方法来处理批量的 Redis 操作。
4、自增和自减:封装了 increment 和 decrement 方法来处理数字类型的键值的增减。
5、哈希表操作:通过 hset, hget, 和 hgetall 封装了对 Redis 哈希表的操作
'''import redis
from typing import Optional, Union, Anyclass RedisHelper:def __init__(self, host: str = 'localhost', port: int = 6379, db: int = 0):"""初始化 RedisHelper 类,设置 Redis 连接信息:param host: Redis 服务器主机,默认是 localhost:param port: Redis 服务器端口,默认是 6379:param db: Redis 数据库,默认是 0"""self.redis_client = redis.StrictRedis(host=host, port=port, db=db, decode_responses=True)def set(self, key: str, value: Union[str, int, float], ex: Optional[int] = None) -> bool:"""设置键值对,如果设置了 ex 参数,则键值会在过期时间后自动删除:param key: 键:param value: 值,可以是字符串、整数或浮点数:param ex: 过期时间(秒),默认不设置过期时间:return: 是否成功"""try:if ex:self.redis_client.setex(key, ex, value)else:self.redis_client.set(key, value)return Trueexcept Exception as e:print(f"Error setting key {key}: {e}")return Falsedef get(self, key: str) -> Optional[str]:"""获取指定键的值:param key: 键:return: 键对应的值,如果键不存在,则返回 None"""try:return self.redis_client.get(key)except Exception as e:print(f"Error getting key {key}: {e}")return Nonedef delete(self, key: str) -> bool:"""删除指定键:param key: 键:return: 是否成功"""try:self.redis_client.delete(key)return Trueexcept Exception as e:print(f"Error deleting key {key}: {e}")return Falsedef exists(self, key: str) -> bool:"""检查指定的键是否存在:param key: 键:return: 键是否存在"""try:return self.redis_client.exists(key)except Exception as e:print(f"Error checking existence of key {key}: {e}")return Falsedef set_multiple(self, mapping: dict, ex: Optional[int] = None) -> bool:"""批量设置多个键值对:param mapping: 键值对字典:param ex: 过期时间(秒),可选:return: 是否成功"""try:if ex:for key, value in mapping.items():self.redis_client.setex(key, ex, value)else:self.redis_client.mset(mapping)return Trueexcept Exception as e:print(f"Error setting multiple keys: {e}")return Falsedef get_multiple(self, keys: list) -> dict:"""批量获取多个键的值:param keys: 键列表:return: 键值对字典"""try:values = self.redis_client.mget(keys)return dict(zip(keys, values))except Exception as e:print(f"Error getting multiple keys: {e}")return {}def increment(self, key: str, amount: int = 1) -> Union[int, None]:"""对指定键的值进行自增:param key: 键:param amount: 增量,默认为 1:return: 增加后的值,如果操作失败,则返回 None"""try:return self.redis_client.incrby(key, amount)except Exception as e:print(f"Error incrementing key {key}: {e}")return Nonedef decrement(self, key: str, amount: int = 1) -> Union[int, None]:"""对指定键的值进行自减:param key: 键:param amount: 减量,默认为 1:return: 减少后的值,如果操作失败,则返回 None"""try:return self.redis_client.decrby(key, amount)except Exception as e:print(f"Error decrementing key {key}: {e}")return Nonedef hset(self, hash_name: str, key: str, value: Any) -> bool:"""向哈希表中设置字段值:param hash_name: 哈希表名称:param key: 字段名:param value: 字段值:return: 是否成功"""try:self.redis_client.hset(hash_name, key, value)return Trueexcept Exception as e:print(f"Error setting hash {hash_name}:{key}: {e}")return Falsedef hget(self, hash_name: str, key: str) -> Optional[Any]:"""获取哈希表中的字段值:param hash_name: 哈希表名称:param key: 字段名:return: 字段值,如果字段不存在,则返回 None"""try:return self.redis_client.hget(hash_name, key)except Exception as e:print(f"Error getting hash {hash_name}:{key}: {e}")return Nonedef hgetall(self, hash_name: str) -> dict:"""获取哈希表中的所有字段和值:param hash_name: 哈希表名称:return: 键值对字典"""try:return self.redis_client.hgetall(hash_name)except Exception as e:print(f"Error getting all hash fields for {hash_name}: {e}")return {}# 示例使用
if __name__ == '__main__':redis_helper = RedisHelper()# 设置单个键值对redis_helper.set('name', 'Allen')# 获取单个键值print(redis_helper.get('name')) # Allen# 设置多个键值对redis_helper.set_multiple({'age': 18, 'location': 'shanghai'})# 获取多个键值print(redis_helper.get_multiple(['name', 'age', 'location'])) # {'name': 'Allen', 'age': '18', 'location': 'shanghai'}# 增加某个键的值redis_helper.increment('age')print(redis_helper.get('age')) # 19# 设置哈希表redis_helper.hset('user:1000', 'name', 'Allen')print(redis_helper.hget('user:1000', 'name')) # Allen
1、初始化连接:在 __init__ 中,我们通过 redis.StrictRedis 初始化 Redis 连接,可以根据需要传递不同的 Redis 服务器信息。
2、基本操作封装:
(1)set 和 get 分别用于设置和获取键值。
(2)delete 用于删除指定的键。
(3)exists 用于检查键是否存在。
3、批量操作:提供了 set_multiple 和 get_multiple 方法来处理批量的 Redis 操作。
4、自增和自减:封装了 increment 和 decrement 方法来处理数字类型的键值的增减。
5、哈希表操作:通过 hset, hget, 和 hgetall 封装了对 Redis 哈希表的操作
相关文章:
Python - Python操作Redis
安装Redis可参考 Redis-入门简介-CSDN博客 在Python中接入Redis数据库通常使用redis-py这个库 一、安装Redis 首先,需要安装redis-py库。通过pip来安装 pip install redis 二、连接Redis Redis连接操作import redisdef redis_connect():try:redisClient redi…...
Solidity 开发环境
Solidity 开发环境 Solidity编辑器:Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境:以太坊开发环境(Ethereum Development Environment&a…...

js基础案例
1.弹出警告框,显示Hello JS 2.在页面输出内容(内容在body标签里面) 3.在控制台输出内容 4.js代码是自上而下执行 5.将js代码编写到标签的onclick属性中,当点击时,js代码才会执行 6.将js写到超链接的href属性中…...

Unity TMPro显示中文字体
TMP默认的字体只能显示英语,那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本,也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…...

2025 GDC开发者先锋大会“人形机器人的开源之路”分论坛 | 圆桌会议:《开放协作:开源生态如何解锁人形机器人与具身智能的未来》(上篇)
在GDC全球开发者先锋大会期间,2月23日,由GDC组委会指导、国家地方共建人形机器人创新中心(以下简称“国地中心”)承办的“人形机器人的开源之路”主题论坛在上海西岸艺术中心成功举办。 在人工智能与机器人技术飞速发展的今天&…...
MySQL 数据库安全配置最佳实践
文章目录 MySQL 数据库安全配置最佳实践账户与权限管理账户最小化原则权限最小化配置密码策略强化 认证与访问控制禁用匿名账户启用安全认证 网络安全防护访问源限制禁用远程root访问启用SSL加密 日志审计与监控全量审计配置二进制日志管理 服务端安全加固关键参数配置文件权限…...

网络安全红队工具
目录 红队及发展趋势 基本概念 发展趋势 防守阶段 备战阶段 临战阶段 实战阶段 战后整顿 如果错过互联网,与你擦肩而过的不仅仅是机会,而是整整一个时代。 红队及发展趋势 基本概念 红队一般指实战攻防的防守方。 红队主要复盘总结现有防护系统的不足之处,为…...

【Qt】编程基础
目录 一、Qt体系框架: 编辑二、布局方式: 1.绝对布局 setGeometry()函数 2.盒子布局: QHBoxLayout:水平布局管理器 QVBoxLayout:垂直布局管理器 QGridLayout:网格布局管理器 三、基本控件及其函数 标签类 :QLabel 按…...

《SegFace: Face Segmentation of Long-Tail Classes》论文分享(侵删)
author{Kartik Narayan and Vibashan VS and Vishal M. Patel} 原文链接:[2412.08647] SegFace: Face Segmentation of Long-Tail Classes 摘要 人脸解析是指将人脸语义分割为眼睛、鼻子、头发等关键面部区域。它是各种高级应用程序的先决条件,包括人脸…...
Android AOSP系统裁记录
Android 系统裁剪是指根据需求移除不必要的组件和功能,以优化系统性能、减少存储占用或满足特定设备需求。以下是 Android 系统裁剪的基本步骤: 1. 准备环境 操作系统:推荐使用 Ubuntu 或 macOS。 工具: Android SDK Android N…...

音乐游戏Dance Dance Revolution(DDR)模拟器
文章目录 (一)Dance Dance Revolution(1.1)基本情况(1.2)机体 (二)模拟器(2.1)主程序(2.2)模拟器主题 (三)曲谱…...

Lua的table(表)
Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…...
ZT36 小红和小紫的取素因子游戏
描述 小红和小紫拿到了一个正整数x,她们每次可以选择x的一个因子k(k>1),把x除以k,但要求k必须是素数。小红先手,谁先不能操作谁输。假设两人都足够聪明,最终谁取得胜利? 共进行t次游戏。 输入描述&…...
C# 使用 Newtonsoft.Json 序列化和反序列化对象实例
Newtonsoft.Json(也被称为 Json.NET)是一个广泛使用的用于在 C# 中进行 JSON 序列化和反序列化的开源库。下面将详细介绍如何使用它来序列化和反序列化对象。 1. 安装 Newtonsoft.Json 如果你使用的是 Visual Studio,可以通过 NuGet 包管理…...
用 AI 工具提升 UX/UI 设计效率:从研究到原型
—————————————————— 用 AI 工具提升 UX/UI 设计效率:从研究到原型 开篇引言: 在 UX/UI 设计领域,效率与创意之间的平衡一直是设计师们追求的目标。随着 AI 工具的崛起,设计师们不仅能更快地完成任务,…...
操作系统知识点12
1.在操作系统的结构设计中,采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时,表示进程已获得…...

FASIONAD:自适应反馈的类人自动驾驶中快速和慢速思维融合系统
24年11月来自清华、早稻田大学、明尼苏达大学、多伦多大学、厦门大学马来西亚分校、电子科大(成都)、智平方科技和河南润泰数字科技的论文“FASIONAD : FAst and Slow FusION Thinking Systems for Human-Like Autonomous Driving with Adaptive Feedbac…...

Redis7——基础篇(八)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...

nvm安装
1.下载安装包 从官网下载https://github.com/nvm-sh/nvm/releases 这里下的是nvm-0.40.1.tar.gz 2.解压 tar -zxvf nvm-0.40.1.tar.gz 3. 修改配置文件 vi ~/.bashrc 在最后一行添加如下内容 export NVM_DIR"/usr/local/nvm-0.40.1"[ -s "$NVM…...

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大,游戏玩家对游戏资讯、攻略、评测等内容的需求日…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
C/Python/Go示例 | Socket Programing与RPC
Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流,会涉及到许多有意思的话题,诸如怎么确保对方能收到信息,怎么应对数据丢失、被污染或者顺序混乱,怎么提高…...