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 数据库,主要用于缓存数据,提高数据读取效率,那在 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应用场景 然而,人工智能模型有点像美食厨师。他们可以创造奇迹,但他们需要优质的成分。人工智能模型在大多数输入上都做得很好,但如果它们以最优化的格式接收输入,它们就会真正…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
