Python 操作 Redis 数据库介绍
Redis 作为常用的 NoSql 数据库,主要用于缓存数据,提高数据读取效率,那在 Python 中应该如果连接和操作 Redis 呢?今天就为大概简单介绍下,在 Python 中操作 Redis 常用命令。
安装 redis
首先还是需要先安装 redis 模块,使用如下命令:
$ pip3 install redis
创建 redis 连接池
安装成功后就可以在代码中导入模块,然后通过创建连接池的方式,连接到 Redis 服务器,创建代码如下:
import redis #导入redis模块
# 建议使用以下连接池的方式
# 设置decode_responses=True,写入的KV对中的V为string类型,不加则写入的为字节类型。
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, decode_responses=True)
rs = redis.Redis(connection_pool=pool)
需要注意的是,设置
decode_responses=True
,写入的 Key/Value 对中的 Value 为 string 类型,不加则写入的为字节类型。
Redis 操作方法
Redis 支持五种类型的数据操作,分别为字符串、 List、 Hash、 Set、 zSet类型,还有一些方法是不区分类型操作的。上面我们已经连接到 Redis 服务器,接下来为大家介绍各类型基本的操作方法。
字符串类型方法
-
单键值操作
set(name, value, ex=None, px=None, nx=False, xx=False)
参数说明:
ex:过期时间(秒)
px:过期时间(毫秒)
nx:如果设置为True,则只有name不存在时,当前set操作才执行
xx:如果设置为True,则只有name存在时,当前set操作才执行
使用方法如下:
# key="color",value="red",设置过期时间5秒
rs.set('color', 'red', ex=5
# 与rs.set('color', 'red', ex=5)相同
rs.setex('color', 5, 'red')
# 打印获取color键对应的值,超时后获取值为None
print(rs.get('color'))
# 如果color存在输出None,如果不存在,则输出True
print(rs.set('color', 'green', nx=True))
# 如果color存在输出True,如果不存在,则输出None
print(rs.set('color', 'yellow', xx=True))
-
批量键值操作
可以批量对多个 key 赋值,也可以同时获取多个 key 的值,使用方法如下:
# 批量赋值
rs.mset({'key1':'value1', 'key2':'value2', 'key3':'value3'})
# 批量获取值
rs.mget('key1', 'key2', 'key3')
-
其他操作
除了基础的赋值和取值,可以在赋新值时返回旧值,还可将返回值通过索引来截取,也可以在 key 对应值后追回值等,具体使用可见以下代码:
# 设置新值为blue,同时返回设置前的值
print(rs.getset('color', 'blue'))
rs.set('lang', 'Chinese')
# 取索引为1-3字符
print(rs.getrange('lang', 1, 3)) #返回结果:hin
# 从索引号为4字符开始向后替换
rs.setrange('lang', 4, 'a is great') #返回结果:14
# 在lang对应值后面追加字符 "!"
rs.append('lang', '!') #返回结果:15
print(rs.get('lang')) #返回结果:China is great!
# 返回lang对应值的长度
print(rs.strlen('lang')) #返回结果:15
# 如果total对应值不存在,则total当前值设置为10
rs.incr('total', amount=10)
# 当前total对应值增加1
rs.incr('total') #结果为11
# 当前total对应值减少1
rs.decr('total') #结果为10
list 类型方法
list 的特点:一个有序的列表,列表中的元素可以重复,并且可以在列表前后或中间任意位置插入新元素,具体使用方式见如下代码:
# 每个新增元素都插入到list最左边,如果list不存在则会新建
rs.lpush('leftList', 1,2,3,4,5)
print(rs.lrange('leftList', 0, -1)) #返回结果:['5', '4', '3', '2', '1']
# 新插入元素在右侧,如果list不存在则新建
rs.rpush('rightList', 6,7,8,9,10)
print(rs.lrange('rightList', 0, -1)) #返回结果:['6', '7', '8', '9', '10']
# 在list左边新增元素,如果list不存在则不创建
rs.lpushx('noList', 'apple')
print(rs.llen('noList')) #返回结果:0
# 在list中从左遍历出第一个为'7'的元素,在它后面(如果是在前面插入则用'before')插入元素'08'
rs.linsert('rightList', 'after', '7', '08')
print(rs.lrange('rightList', 0, -1)) #返回结果:['6', '7', '08', '8', '9', '10']
# 将list中索引号为1的元素修改为'-7'
rs.lset('rightList', 1, '-7')
print(rs.lrange('rightList', 0, -1)) #返回结果:['6', '-7', '08', '8', '9', '10']
# 删除list中从左遍历第一个为'8'的元素
rs.lrem('rightList', '8', 1)
print(rs.lrange('rightList', 0, -1)) #返回结果:['6', '-7', '08', '9', '10']
# 弹出左侧第一个元素
rs.lpop('rightList') #返回值为:'6'
print(rs.lrange('rightList', 0, -1)) #返回结果:['-7', '08', '9', '10']
#取出list中索引编号为1的值
print(rs.lindex('rightList', 1)) #返回结果:08
hash 类型方法
hash 的特点:一个 key 对应一个 value,并且 key 不允许重复,可以单个操作,也可以批量键值操作,下面列举了常用方法的使用方法:
# 单键值操作
# 设置hash名为hName的键和值
rs.hset('hName', 'key1', 'value1')
rs.hset('hName', 'key2', 'value2')
# 取hName的key1对应的值
print(rs.hget('hName', 'key1')) #返回结果:value1
#批量键值操作
rs.hmset('hName', {'key3': 'value3', 'key5': 'value5'})
print(rs.hmget('hName', 'key1', 'key2', 'key3')) #返回结果:['value1', 'value2', 'value3']
# 取出hName所有键值
print(rs.hgetall('hName')) #返回结果:{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key5': 'value5'}
# 取hName中所有的keys
print(rs.hkeys('hName')) #返回结果:['key1', 'key2', 'key3', 'key5']
# 取hName中所有的values
print(rs.hvals('hName')) #返回结果:['value1', 'value2', 'value3', 'value5']
# 获取hName对应hash键值对个数
print(rs.hlen('hName')) #返回结果:4
# 判断key2是否存在
print(rs.hexists('hName', 'key2')) #返回结果:True
# 删除key2对应键值对
rs.hdel('hName', 'key2')
# 再次判断key2是否存在
print(rs.hexists('hName', 'key2')) #返回结果:False
set 类型方法
set 的特点:一个无序的元素集合,集合中元素不能重复,可以随机 pop 元素,两个集合可以取交集,并集,差集运算。
# 增加集合元素,如集合不存在则新建
rs.sadd('mySet', 'one', 'two', 3)
# 返回集合元素个数
print(rs.scard('mySet'))
# 返回所有元素
print(rs.smembers('mySet')) #结果:{'two', 'one', '3'}
# 返回所有成员
print(rs.sscan('mySet')) #结果:(0, ['3', 'one', 'two'])
# 再次创建一个集合mySet2
rs.sadd('mySet2', 3, 5, 7)
# 获取两个集合交集
print(rs.sinter('mySet', 'mySet2')) #返回结果:{'3'}
# 获取两个集合并集
print(rs.sunion('mySet', 'mySet2')) #返回结果:{'5', 'two', 'one', '7', '3'}
# 获取两个集合差集
print(rs.sdiff('mySet', 'mySet2')) #返回结果:{'two', 'one'
# 取mySet和mySet2的并集,将结果存到storeSet集合中
print(rs.sunionstore('sotreSet', 'mySet', 'mySet2'))
print(rs.smembers('sotreSet')) #返回结果:{'5', 'two', 'one', '7', '3'}
# 判断one元素是否存在集合中
print(rs.sismember('sotreSet', 'one'))
# 随机删除并返回集合中的一个元素
print(rs.spop('sotreSet'))
# 删除集合中元素值为5的元素
print(rs.srem('sotreSet', 5))
zset 类型方法
zset 的特点:一个不允许重复的集合,集合中元素是有序的,每个元素有两个值:值和分数,分数专门用来做排序。
# 增加集合元素,如集合不存在则新建
rs.zadd('fruits', {'apple':1, 'banana':3, 'orange':5})
# 遍历所有元素
print(rs.zrange("fruits", 0, -1)) #结果:['apple', 'banana', 'orange']
# withscores=True指带上分数
print(rs.zrange("fruits", 0, -1, withscores=True)) #结果:[('apple', 1.0), ('banana', 3.0), ('orange', 5.0)]
# 根据分数由大到小遍历所有元素
print(rs.zrevrange("fruits", 0, -1)) #结果:['orange', 'banana', 'apple']
# 获取orange元素对应的分数
rs.zscore('fruits', 'orange') #结果:5.0
# 取出分数>=3 and 分数<=5的元素
print(rs.zrangebyscore('fruits', 3, 5))
# 取出分数<=5 and 分数>=3的元素,根据分数从大到小排序
print(rs.zrevrangebyscore('fruits', 5, 3))
# 遍历所有元素,返回一个元组
print(rs.zscan('fruits')) #结果:(0, [('apple', 1.0), ('banana', 3.0), ('orange', 5.0)])
# 打印集合元素个数
print(rs.zcard('fruits')) #结果:3
# 返回集合中分数>=1 and 分数<=3元素个数
print(rs.zcount('fruits', 1, 3))
# 将集合中apple元素的分数+5
rs.zincrby('fruits', 5, 'apple')
print(rs.zrange("fruits", 0, -1, withscores=True)) #返回结果:[('banana', 3.0), ('orange', 5.0), ('apple', 6.0)]
# 返回orange元素在集合中的索引号
rs.zrank('fruits', 'orange') #结果:1
# 按分数从大到小排序,取出banana元素索引号
rs.zrevrank('fruits', 'banana') #结果:2
# #删除集合中apple元素
rs.zrem('fruits', 'apple')
print(rs.zrange("fruits", 0, -1)) #返回结果:['banana', 'orange']
# #删除集合索引号>=0 and 索引号<=2的元素
rs.zremrangebyrank('fruits', 0, 2)
# 删除集合分数>=1 and 分数<=5的元素
rs.zremrangebyscore('fruits', 1, 5)
其他操作方法
以下操作方法针对 redis 任意数据类型(字符串,list,hash,set,zset),可以删除 key ,查询 key 是否存在,还可设置超时,重命名 key 的名称等:
# 删除key为color的对象
rs.delete('color')
# 查询key为color的对象是否存在
print(rs.exists('color')) #结果:False
rs.sadd('mySet5', 'one', 'two')
# 设置key的超时时间
rs.expire('mySet5', time=5) #单位:秒
# 重命名key的值
rs.rename('mySet5', 'set5')
# 随机返回当前库中一个key,但不会删除
print(rs.randomkey())
# 查看某个key对应值的类型
print(rs.type('mySet')) #返回结果:set
# 通过模糊匹配出满足条件的key
print(rs.keys('my*')) #返回结果:['mySet', 'mySet2']
#各类型元素迭代方式
#hash类型迭代
for i in rs.hscan_iter("hName"):
print(i)
#set类型迭代
for j in rs.sscan_iter("mySet"):
print(j)
#zset类型迭代
for k in rs.zscan_iter("fruits"):
print(k)
总结
本文为大家介绍了 Python 中如何创建连接 Redis 数据库,并通过代码的方式展示了 Redis 支持的各数据类型的操作方法,通过学习发现操作起来还是很方便的,接下来还会为大家介绍其他数据库的操作。
相关文章:
Python 操作 Redis 数据库介绍
Redis 作为常用的 NoSql 数据库,主要用于缓存数据,提高数据读取效率,那在 Python 中应该如果连接和操作 Redis 呢?今天就为大概简单介绍下,在 Python 中操作 Redis 常用命令。 安装 redis 首先还是需要先安装 redis …...
十年JAVA搬砖路——软件工程概述
软件工程是一门关注软件开发过程的学科,它涉及到软件的设计、开发、测试、部署和维护等方面。软件工程的目标是通过系统化的方法和工具,以确保软件项目能够按时、按预算和按要求完成。 • 软件工程的7个基本概念: 软件生命周期:软…...

前后端项目部署上线详细笔记
部署 参考文章:如何部署网站?来比比谁的方法多 - 哔哩哔哩大家好,我是鱼皮,不知道朋友们有没有试着部署过自己开发的网站呢?其实部署网站非常简单,而且有非常多的花样。这篇文章就给大家分享几种主流的前端…...

Android 蓝牙开发( 二 )
前言 上一篇文章给大家分享了Android蓝牙的基础知识和基础用法,不过上一篇都是一些零散碎片化的程序,这一篇给大家分享Android蓝牙开发实战项目的初步使用 效果演示 : Android蓝牙搜索,配对,连接,通信 Android蓝牙实…...

C#调用barTender打印标签示例
使用的电脑需要先安装BarTender 我封装成一个类 using System; using System.Windows.Forms;namespace FT_Tools {public class SysContext{public static BarTender.Application btapp new BarTender.Application();public static BarTender.Format btFormat;public void Q…...

Spring——Spring读取文件
文章目录 1.通过 value 读取比较简单的配置信息2.通过ConfigurationProperties读取并与 bean 绑定3.通过ConfigurationProperties读取并校验4. PropertySource 读取指定 properties 文件5.题外话:Spring加载配置文件的优先级 很多时候我们需要将一些常用的配置信息比如阿里云os…...

这是一条求助贴(postman测试的时候一直是404)
看到这个问题是404的时候总感觉不该求助大家,404多常见一看就是简单的路径问题,我的好像不是,我把我的问题奉上。 首先我先给出我的url http://10.3.22.195:8080/escloud/rest/escloud_contentws/permissionStatistics/jc-haojl/sz 这是我…...

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(四):有损传输线建模
传输线中信号衰减的两个损耗过程是通过信号和返回路径导体的串联电阻以及通过有损耗介电材料的分流电阻。这两个电阻器的电阻都与频率相关。 值得注意的是,理想电阻器的电阻随频率恒定。我们已经证明,在理想的有损传输线中,用于描述损耗的两个…...

elk日志收集系统
目录 前言 一、概述 二、案例 (一)、环境配置 安装node1与node2节点的elasticsearch node1的elasticsearch-head插件 (二)、node1服务器安装logstash 测试1: 标准输入与输出 测试2:使用rubydebug解…...
perl 语言中 AUTOLOAD 的用法
这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个…...

服务器放在香港好用吗?
相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…...

C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)
文章目录 本栏简介1. 什么是设计模式2. GOF 设计模式3. 从面向对象谈起4. 深入理解面向对象5. 软件设计固有的复杂性5.1 软件设计复杂性的根本原因5.2 如何解决复杂性 ? 6. 结构化 VS. 面向对象6.1 同一需求的分解写法6.1.1 Shape1.h6.1.2 MainForm1.cpp 6.2 同一需求的抽象的…...
Docker技术--WordPress博客系统部署初体验
如果使用的是传统的项目部署方式,你要部署WordPress博客系统,那么你需要装备一下的环境,才可以部署使用。 -1:操作系统linux -2:PHP5.6或者是更高版本环境 -3:MySQL数据环境 -4:Apache环境 但是如果使用Docker技术,那么就只需要进行如下的几行简单的指令: docker run …...
提高代码可读性和可维护性的命名建议
当进行接口自动化测试时,良好的命名可以提高代码的可读性和可维护性。以下是一些常用的命名建议: 变量和函数命名: 使用具有描述性的名称,清晰地表达变量或函数的用途和含义。使用小写字母和下划线来分隔单词,例如 log…...

Docker基础入门:Docker网络与微服务项目发布
Docker基础入门:Docker网络与微服务项目发布 一、前言二、Docker0理解2.1 ip a查看当前网络环境2.2 实战--启动一个tomact01容器(查看网络环境)2.3 实战--启动一个tomact02容器(查看网络环境)2.4 容器与容器之间的通信…...

Docker安装详细步骤
Docker安装详细步骤 1、安装环境准备 主机:192.168.40.5 zch01 设置主机名 # hostnamectl set-hostname zch01 && bash 配置hosts文件 [root ~]# vi /etc/hosts 添加如下内容: 192.168.40.5 zch01 关闭防火墙 [rootzch01 ~]# systemct…...

十六、pikachu之SSRF
文章目录 1、SSRF概述2、SSRF(URL)3、SSRF(file_get_content) 1、SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…...

最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码
全新PHP短网址系统URL缩短器平台,它使您可以轻松地缩短链接,根据受众群体的位置或平台来定位受众,并为缩短的链接提供分析见解。 系统使用了Laravel框架编写,前后台双语言使用,可以设置多域名,还可以开设套…...

漱玉平民大药房:多元化药店变革的前夜
作者 | 王聪彬 编辑 | 舞春秋 来源 | 至顶网 本文介绍了漱玉平民大药房在药品零售领域的数字化转型和发展历程。通过技术创新, 漱玉平民 建设了覆盖医药全生命周期的大健康生态圈,采用混合云架构和国产分布式数据库 TiDB,应对庞大的会员数据处…...

如何实现AI的矢量数据库
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而,人工智能模型有点像美食厨师。他们可以创造奇迹,但他们需要优质的成分。人工智能模型在大多数输入上都做得很好,但如果它们以最优化的格式接收输入,它们就会真正…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...