Python 连接 Redis 进行增删改查(CRUD)操作

文章目录

  • Python 连接 Redis 进行增删改查(CRUD)操作
  • 介绍
  • 安装 `redis-py`
  • 连接 Redis
  • 增加(Create)
  • 查询(Read)
  • 更新(Update)
  • 删除(Delete)
  • 其他常用操作
    • 检查键是否存在
    • 设置键的过期时间
    • 获取键的过期时间
    • 使用哈希类型存储数据
  • 总结
  • 完整示例
    • 代码说明:
    • 运行结果示例:
    • 总结


Python 连接 Redis 进行增删改查(CRUD)操作

介绍

Redis 是一个开源的内存数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),广泛用于缓存、会话管理、消息队列等场景。本文将介绍如何在 Python 中使用 redis-py 库连接 Redis 数据库,并进行常见的增删改查操作。

安装 redis-py

首先,需要安装 redis-py 库,这是 Python 与 Redis 交互的官方客户端。

pip install redis

连接 Redis

在进行增删改查操作前,我们首先需要连接到 Redis 服务器。假设 Redis 服务运行在本地默认端口 6379。

import redis

# 连接到 Redis 服务
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

参数说明:

  • host:Redis 服务的主机,默认是 'localhost'
  • port:Redis 服务的端口,默认是 6379
  • db:选择使用的数据库,Redis 默认有 16 个数据库,编号从 0 到 15,默认连接的是 db=0
  • decode_responses=True:确保返回的结果是字符串,而不是字节。

增加(Create)

Redis 支持多种数据结构的操作,我们可以使用 set() 方法来设置一个键值对。

# 设置一个字符串类型的键值对
r.set('name', 'John Doe')

# 设置多个键值对
r.mset({'age': 30, 'city': 'New York'})
  • set():设置一个键的值,如果该键已经存在,则会覆盖原有的值。
  • mset():批量设置多个键值对。

查询(Read)

可以通过 get() 方法来获取 Redis 中存储的值。

# 获取单个键的值
name = r.get('name')
print(f'Name: {name}')  # 输出: Name: John Doe

# 获取多个键的值
values = r.mget('name', 'age', 'city')
print(values)  # 输出: ['John Doe', '30', 'New York']
  • get():获取指定键的值。
  • mget():批量获取多个键的值。

更新(Update)

Redis 的更新操作其实是通过 set() 来实现的,因为 set() 会覆盖已存在的键值对。

# 更新键 'age' 的值
r.set('age', 35)
print(r.get('age'))  # 输出: 35

删除(Delete)

如果需要删除一个键值对,可以使用 delete() 方法。

# 删除键 'city'
r.delete('city')
print(r.get('city'))  # 输出: None,因为键 'city' 已被删除
  • delete():删除指定的键,如果键不存在,什么都不做。

其他常用操作

除了基本的 CRUD 操作外,Redis 还支持一些其他有用的操作:

检查键是否存在

# 检查键 'name' 是否存在
exists = r.exists('name')
print(exists)  # 输出: True

设置键的过期时间

# 设置键 'name' 在 10 秒后过期
r.expire('name', 10)

获取键的过期时间

# 获取键 'name' 的剩余过期时间
ttl = r.ttl('name')
print(ttl)  # 输出: 剩余的秒数

使用哈希类型存储数据

Redis 还支持哈希类型,适用于存储结构化数据。可以使用 hset(), hget() 等方法操作哈希。

# 设置哈希键 'user',并存储字段 'name' 和 'age'
r.hset('user', 'name', 'John Doe')
r.hset('user', 'age', 30)

# 获取哈希中的字段
name = r.hget('user', 'name')
age = r.hget('user', 'age')
print(f'Name: {name}, Age: {age}')

总结

本文展示了如何在 Python 中使用 redis-py 库连接 Redis 并进行增删改查操作。Redis 的灵活性和高效性使其成为构建高性能应用的理想选择。除了本文介绍的基本操作,Redis 还提供了许多高级功能,如事务、管道、发布订阅等,可以根据具体应用场景进一步扩展。


完整示例

展示如何使用 Python 连接 Redis,并进行增、查、改、删等操作。将使用 redis-py 库,并使用 Redis 的多种数据结构进行操作。示例将包括基本的字符串操作、哈希操作、以及如何设置键的过期时间。

import redis

# 连接到 Redis 服务
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

# 1. 增加(Create)操作
# 设置字符串类型的键值对
r.set('name', 'John Doe')
r.set('age', 30)
r.set('city', 'New York')

# 设置一个哈希类型的键值对
r.hset('user:1000', 'name', 'Alice')
r.hset('user:1000', 'age', 25)

# 批量设置多个键值对
r.mset({'country': 'USA', 'language': 'English'})

# 打印结果
print(f"Set 'name': {r.get('name')}")
print(f"Set 'age': {r.get('age')}")
print(f"Set 'city': {r.get('city')}")
print(f"Set 'country' and 'language': {r.mget('country', 'language')}")

# 2. 查询(Read)操作
# 获取单个键值
print("\n--查询操作--")
name = r.get('name')
print(f"Name: {name}")

# 获取多个键值
user_data = r.mget('name', 'age', 'city', 'country', 'language')
print(f"User data: {user_data}")

# 获取哈希中的字段
user_name = r.hget('user:1000', 'name')
user_age = r.hget('user:1000', 'age')
print(f"User 1000 Name: {user_name}, Age: {user_age}")

# 3. 更新(Update)操作
# 更新字符串类型的值
r.set('age', 35)
print(f"Updated 'age': {r.get('age')}")

# 更新哈希中的字段
r.hset('user:1000', 'age', 26)
print(f"Updated 'user:1000' age: {r.hget('user:1000', 'age')}")

# 4. 删除(Delete)操作
# 删除单个键
r.delete('city')
print(f"Deleted 'city', current value: {r.get('city')}")

# 删除哈希中的字段
r.hdel('user:1000', 'name')
print(f"Deleted 'name' from 'user:1000', current fields: {r.hgetall('user:1000')}")

# 5. 设置键的过期时间
# 设置 'country' 键在 5 秒后过期
r.expire('country', 5)
print(f"Is 'country' key expired? {r.exists('country')}")  # 初始为 True

# 等待 6 秒钟,键应该过期
import time
time.sleep(6)
print(f"After waiting 6 seconds, is 'country' expired? {r.exists('country')}")  # 应该为 False

# 6. 其他操作:检查键是否存在
key_exists = r.exists('name')
print(f"Does 'name' exist? {key_exists}")

# 获取键的剩余生存时间
ttl = r.ttl('age')
print(f"The remaining time-to-live for 'age' is: {ttl} seconds")

# 获取哈希中所有字段和值
user_data_all = r.hgetall('user:1000')
print(f"All fields in 'user:1000': {user_data_all}")

# 完成
print("\n-- 完成所有操作 --")

代码说明:

  1. 连接 Redis
    使用 redis.StrictRedis() 来创建一个 Redis 连接对象,指定主机名、端口和数据库索引。这里使用了 decode_responses=True,让返回的结果是字符串而不是字节。

  2. 增(Create)操作

    • 使用 set() 设置字符串类型的键值对。
    • 使用 hset() 设置哈希类型的字段。
    • 使用 mset() 批量设置多个键值对。
  3. 查(Read)操作

    • 使用 get() 获取单个字符串类型的值。
    • 使用 mget() 批量获取多个键的值。
    • 使用 hget() 获取哈希类型的指定字段的值。
    • 使用 hgetall() 获取哈希中所有的字段及其对应的值。
  4. 改(Update)操作
    更新操作通过调用 set()hset() 来实现。Redis 会自动覆盖已有的值。

  5. 删(Delete)操作

    • 使用 delete() 删除单个键。
    • 使用 hdel() 删除哈希中的某个字段。
  6. 过期时间
    使用 expire() 设置键的过期时间,单位为秒。使用 ttl() 获取剩余的生存时间。

  7. 检查键是否存在
    使用 exists() 判断一个键是否存在。

运行结果示例:

Set 'name': John Doe
Set 'age': 30
Set 'city': New York
Set 'country' and 'language': ['USA', 'English']

--查询操作--
Name: John Doe
User data: ['John Doe', '30', 'New York', 'USA', 'English']
User 1000 Name: Alice, Age: 25

Updated 'age': 35
Updated 'user:1000' age: 26
Deleted 'city', current value: None
Deleted 'name' from 'user:1000', current fields: {'age': '26'}

Is 'country' key expired? True
After waiting 6 seconds, is 'country' expired? False
Does 'name' exist? True
The remaining time-to-live for 'age' is: -1 seconds
All fields in 'user:1000': {'age': '26'}

-- 完成所有操作 --

总结

通过这个完整的示例,我们展示了如何使用 Python 通过 redis-py 库与 Redis 进行基本的增删改查操作,并且涵盖了 Redis 中一些常用的功能,如设置过期时间和检查键是否存在。这些操作适用于缓存管理、会话存储、实时数据处理等应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915774.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

redis 原理篇 26 网络模型 Redis是单线程的吗?为什么使用单线程

都是学cs的,有人月薪几万,有人月薪几千,哎, 相信 边际效用, 也就是说, 随着技术提升的越来越多,薪资的提升比例会更大 一个月几万,那肯定是高级开发了, 一个月几千&…

UE4 Cook 从UAT传递参数给UE4Editor

需求 一句Cook的命令如下: ${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project${ClientPath}/${ProjectName}.uproject -noP4 -platformIOS -cooksinglepackage -client -clientconfig${CookConfig} -iterate -skipbuild -nocompile -NoMutex…

jmeter基础05_第1个http请求

本节课使用网站“httpbin.org”进行基础的http请求全流程。 请求获取httpbin.org的首页: 请求方法:GET URL:http://httpbin.org 参数:无 1、操作步骤 ① 打开jmeter:命令行窗口输入“jmeter”并回车。 ② 添加线程组…

【Ubuntu24.04】从双系统到虚拟机再到单系统的故事

故事 在大学前期,我使用Ubuntu系统都是为了学习一些命令或者其它Linux的东西,对性能的要求不高,所以选择了虚拟机,后来为了做毕设,选择安装了Ubuntu20.04双系统,因为虚拟机实在带不动,那时我的主…

力扣 LeetCode 18. 四数之和(Day3:哈希表)

解题思路: 需要先弄懂三数之和,思路类似 三数之和:指针 i ,left ,right 四数之和:指针 k ,i ,left ,right(相当于多了一个 k ,多了一个外层 fo…

30 秒!用通义灵码画 SpaceX 星链发射流程图

不想读前人“骨灰级”代码, 不想当“牛马”程序员, 想像看图片一样快速读复杂代码和架构? 来了,灵码又加新 buff!! 通义灵码支持代码逻辑可视化, 可以把你的每段代码画成流程图。 你可以把…

sql注入之二次注入(sqlilabs-less24)

二阶注入(Second-Order Injection)是一种特殊的 SQL 注入攻击,通常发生在用户输入的数据首先被存储在数据库中,然后在后续的操作中被使用时,触发了注入漏洞。与传统的 SQL 注入(直接注入)不同&a…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发,将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

显示微服务间feign调用的日志

第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目,如果在加上uniapp开发的H5端的项目,你还要在nginx中区分PC端和手机H5端,这就会让人很头大!网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如:set…

redis 原理篇 31 redis内存回收 内存淘汰策略

哦哦, 内存满了咋搞 就算过期key 删除,还是不够用, 这种问题没办法,只能了解一下啥解决方案了, 内存是有限的,一直存,肯定会满,这时,咋处理? 首先&#xff…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性,分别是封装、继承、多态,通过之前的学习我们已经了解了C的封装特性,那么接下来我们将继续学习另外的两大特性,在此将分为两个章节来分别讲解继承和多态。本篇就先来学…

[C++11] 包装器 : function 与 bind 的原理及使用

文章目录 functionstd::function 的基本语法使用 std::function 包装不同的可调用对象function包装普通成员函数为什么要传入 this 指针参数?传入对象指针与传入对象实例的区别 例题 :150. 逆波兰表达式求值 - ⼒扣(LeetCode) bin…

设计模式(主要的五种)

1.设计模式: 设计模式就是代码设计经验 2.设计模式的类型: 分为三大类:创建型模式,结构型模式,行为模式 创建型模式: 单例模式:某个类只能有一个实例,提供一个全局的访问点。 工…

Wireshark中的length栏位

注:Ethernet II的最小data length为46,如果小于,会补全到46. 1.指定网卡抓取的,链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

Java线程池浅谈(创建线程池及线程池任务处理)

1-认识线程池 什么是线程池? 线程池就是一个可以复用线程的技术。 不使用线程池的问题 比方说淘宝,不使用线程池,现在有一亿个线程同时进来,CPU就爆了。用户每发起一个请求,后台就需要创建一个新线程来处理&#xf…

缓冲区溢出,数据被踩的案例学习

继续在ubuntu上学习GDB,今天要学习的是缓冲区溢出。 程序的地址: GitHub - gedulab/gebypass: bypass password by heap buffer overflow 编译的方法: gcc -g -O2 -o gebypass gebypass.c 照例设置一下科学shangwang代理: e…

GoogleCloud服务器的SSH连接配置

首先,Google的服务器默认是通过自带的SSH网页端连接的,比较麻烦和容易断开,不是很好用,常见的解决办法有两种一种是通过修改ssh的配置,添加密码的方式进行连接,一种是通过配置公钥进行连接。 密码连接之前有…