当前位置: 首页 > news >正文

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键对应的值,超时后获取值为Noneprint(rs.get('color'))# 如果color存在输出None,如果不存在,则输出Trueprint(rs.set('color', 'green', nx=True))# 如果color存在输出True,如果不存在,则输出Noneprint(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', '!')         #返回结果:15print(rs.get('lang'))    #返回结果:China is great!# 返回lang对应值的长度print(rs.strlen('lang'))   #返回结果:15# 如果total对应值不存在,则total当前值设置为10rs.incr('total', amount=10)# 当前total对应值增加1rs.incr('total')    #结果为11# 当前total对应值减少1rs.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中所有的keysprint(rs.hkeys('hName'))  #返回结果:['key1', 'key2', 'key3', 'key5']# 取hName中所有的valuesprint(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'])# 再次创建一个集合mySet2rs.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元素的分数+5rs.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'))    #结果:Falsers.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# 通过模糊匹配出满足条件的keyprint(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 数据库&#xff0c;主要用于缓存数据&#xff0c;提高数据读取效率&#xff0c;那在 Python 中应该如果连接和操作 Redis 呢&#xff1f;今天就为大概简单介绍下&#xff0c;在 Python 中操作 Redis 常用命令。 安装 redis 首先还是需要先安装 redis …...

十年JAVA搬砖路——软件工程概述

软件工程是一门关注软件开发过程的学科&#xff0c;它涉及到软件的设计、开发、测试、部署和维护等方面。软件工程的目标是通过系统化的方法和工具&#xff0c;以确保软件项目能够按时、按预算和按要求完成。 • 软件工程的7个基本概念&#xff1a; 软件生命周期&#xff1a;软…...

前后端项目部署上线详细笔记

部署 参考文章&#xff1a;如何部署网站&#xff1f;来比比谁的方法多 - 哔哩哔哩大家好&#xff0c;我是鱼皮&#xff0c;不知道朋友们有没有试着部署过自己开发的网站呢&#xff1f;其实部署网站非常简单&#xff0c;而且有非常多的花样。这篇文章就给大家分享几种主流的前端…...

Android 蓝牙开发( 二 )

前言 上一篇文章给大家分享了Android蓝牙的基础知识和基础用法&#xff0c;不过上一篇都是一些零散碎片化的程序&#xff0c;这一篇给大家分享Android蓝牙开发实战项目的初步使用 效果演示 : Android蓝牙搜索&#xff0c;配对&#xff0c;连接&#xff0c;通信 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的时候总感觉不该求助大家&#xff0c;404多常见一看就是简单的路径问题&#xff0c;我的好像不是&#xff0c;我把我的问题奉上。 首先我先给出我的url http://10.3.22.195:8080/escloud/rest/escloud_contentws/permissionStatistics/jc-haojl/sz 这是我…...

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(四):有损传输线建模

传输线中信号衰减的两个损耗过程是通过信号和返回路径导体的串联电阻以及通过有损耗介电材料的分流电阻。这两个电阻器的电阻都与频率相关。 值得注意的是&#xff0c;理想电阻器的电阻随频率恒定。我们已经证明&#xff0c;在理想的有损传输线中&#xff0c;用于描述损耗的两个…...

elk日志收集系统

目录 前言 一、概述 二、案例 &#xff08;一&#xff09;、环境配置 安装node1与node2节点的elasticsearch node1的elasticsearch-head插件 &#xff08;二&#xff09;、node1服务器安装logstash 测试1&#xff1a; 标准输入与输出 测试2&#xff1a;使用rubydebug解…...

perl 语言中 AUTOLOAD 的用法

这里的 AUTOLOAD可以理解为自动加载。具体来说就是&#xff0c;在正常情况下&#xff0c;我们不能调用一个尚未定义的函数&#xff08;子例程&#xff09;。不过&#xff0c;如果在未定义函数的包中有一个名为 AUTOLOAD的函数&#xff0c;那么对未定义函数的调用都会路由至这个…...

服务器放在香港好用吗?

​  相较于国内服务器&#xff0c;将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案&#xff0c;因此更无备案时限&#xff0c;购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 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 …...

提高代码可读性和可维护性的命名建议

当进行接口自动化测试时&#xff0c;良好的命名可以提高代码的可读性和可维护性。以下是一些常用的命名建议&#xff1a; 变量和函数命名&#xff1a; 使用具有描述性的名称&#xff0c;清晰地表达变量或函数的用途和含义。使用小写字母和下划线来分隔单词&#xff0c;例如 log…...

Docker基础入门:Docker网络与微服务项目发布

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

Docker安装详细步骤

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

十六、pikachu之SSRF

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

最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码

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

漱玉平民大药房:多元化药店变革的前夜

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

如何实现AI的矢量数据库

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

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...