Python操作Redis 各种数据类型

        本文将深入探讨如何使用Python操作Redis,覆盖从基础数据类型到高级功能的广泛主题。无论是字符串、列表、散列、集合还是有序集合,我们将一一解析,同时提供丰富的代码示例帮助读者更好地理解和应用。除此之外,本文还将介绍Redis的一些高级功能,如事务处理、管道、发布/订阅模式、Lua脚本编程以及数据持久化

目录

环境搭建

基本操作

数据类型与操作

字符串(String)

散列(Hash)

列表(List)

集合(Set)

有序集合(ZSet)

高级功能

事务

管道(Pipeline)

发布/订阅

发布:

订阅:

Lua脚本

键过期和淘汰

持久化


环境搭建

要使用Python操作Redis,首先需要确保Python环境已安装,然后通过pip安装redis库:

pip install redis

基本操作

首先,我们需要建立与Redis服务器的连接。可以使用redis库中的Redis类来实现这一点:

import redis
r = redis.Redis(host='localhost', port=6379, db=0)r = redis.Redis(host='localhost', port=6379, db=0, password='yourpassword')

数据类型与操作

字符串(String)

字符串是Redis中最基本的数据类型,常用于存储文本或二进制数据。基本操作包括:

  • 设置值:使用set方法设置键的值。如果键已存在,set会覆盖原有值。

    r.set('name', 'Alice')
  • 获取值:使用get方法通过键获取值。

    print(r.get('name')) # 输出: b'Alice'
  • 追加值append命令用于在指定键的值后面追加值。

    r.append('name', ' Smith') print(r.get('name')) # 输出: b'Alice Smith'
  • 增减值:对于存储的数字值,可以使用incrdecr命令进行增加或减少操作。

    r.set('counter', 100) r.incr('counter') r.incr('counter', 10) print(r.get('counter')) # 输出: 111

散列(Hash)

散列是键值对的集合,非常适合用于存储对象。

  • 设置散列值:使用hset设置散列的字段值。

    r.hset('user:1', 'name', 'John') r.hset('user:1', 'age', 30)
  • 获取散列值:使用hget获取指定字段的值。

    
    print(r.hget('user:1', 'name')) # 输出: b'John'
  • 获取全部散列值:使用hgetall获取散列中所有字段的值。

    print(r.hgetall('user:1')) # 输出: {b'name': b'John', b'age': b'30'}
  • 删除字段:使用hdel删除散列中的一个或多个字段。

    r.hdel('user:1', 'age')

列表(List)

列表是简单的字符串列表,按照插入顺序排序。

  • 从左侧插入:使用lpush在列表的左侧插入一个或多个值。

    r.lpush('mylist', 'world') r.lpush('mylist', 'hello')
  • 从右侧插入:使用rpush在列表的右侧插入一个或多个值。

    r.rpush('mylist', '!')
  • 获取列表片段:使用lrange获取列表中指定范围内的元素。

    print(r.lrange('mylist', 0, -1)) # 输出: [b'hello', b'world', b'!']
  • 移除元素:使用lrem移除列表中与参数相等的元素。

    r.lrem('mylist', 1, 'world')

集合(Set)

集合是字符串的无序集合,每个元素都是唯一的。

  • 添加元素:使用sadd向集合添加一个或多个元素。

    r.sadd('myset', 'a', 'b', 'c')
  • 移除元素:使用srem从集合中移除一个或多个元素。

    r.srem('myset', 'a')
  • 获取集合成员:使用smembers获取集合中的所有成员。

    print(r.smembers('myset')) # 输出: {b'b', b'c'}
  • 集合运算:Redis提供了多种集合运算命令,如并集(sunion)、交集(sinter)和差集(sdiff)。

    r.sadd('set1', 'a', 'b') r.sadd('set2', 'b', 'c') 
    print(r.sinter('set1', 'set2')) # 输出: {b'b'}

有序集合(ZSet)

有序集合与集合类似,但每个元素都会关联一个分数,Redis根据分数对元素进行排序。

  • 添加元素:使用zadd向有序集合添加一个或多个元素,每个元素都有其分数。

    r.zadd('myzset', {'one': 1, 'two': 2})
  • 获取元素:使用zrangezrevrange获取有序集合中指定范围内的元素,可以按分数升序或降序排列。

    print(r.zrange('myzset', 0, -1)) # 输出: [b'one', b'two']
  • 删除元素:使用zrem从有序集合中移除一个或多个元素。

    r.zrem('myzset', 'one')

高级功能

事务

        Redis的事务允许将多个命令打包,然后一次性、按顺序地执行。这通过pipeline实现,可以显著减少网络往返时间(RTT)。

pipe = r.pipeline()
pipe.set('foo', 'bar')
pipe.get('bing')
response = pipe.execute()  # 执行所有命令

管道(Pipeline)

        管道不仅可以用于事务,还能用于批量执行命令,即使这些命令不是事务的一部分。通过减少TCP数据包的数量,管道可以提高命令执行的效率。

pipe = r.pipeline(transaction=False)
pipe.set('foo', 'bar')
pipe.set('hello', 'world')
pipe.execute()

发布/订阅

        Redis的发布/订阅功能提供了一种消息传递模式,允许程序订阅一个或多个频道,并从这些频道接收满足模式的消息。

发布
r.publish('channel', 'message')
订阅
pubsub = r.pubsub()
pubsub.subscribe('channel')
for message in pubsub.listen():  # 监听消息print(message)

Lua脚本

        Redis允许执行Lua脚本,这意味着可以把一系列操作编写到脚本中,在服务器端原子性地执行,减少网络延迟。

script = """
return 'Hello, ' .. KEYS[1]
"""
result = r.eval(script, 1, 'world')  # 传递一个键,值为'world'
print(result)  # 输出: "Hello, world"

键过期和淘汰

        在Redis中,你可以为键设置生存时间(TTL),在指定时间后自动删除它们。这对于管理缓存数据非常有用。

r.set('foo', 'bar')
r.expire('foo', 10)  # 10秒后过期ttl = r.ttl('foo')
print(ttl)  # 输出剩余生存时间

持久化

Redis提供了两种持久化机制:RDB快照和AOF日志。

  • RDB快照:在指定的时间间隔内,将内存中的数据集快照写入磁盘。它恢复大数据集的速度比AOF日志快。
  • AOF日志:记录每次写操作命令,重启时通过重新执行这些命令来恢复数据。它提供了更好的数据安全性,但对于大量数据的恢复速度较慢。

在Python中使用Redis时,持久化配置通常在Redis服务器上设置,而不是通过客户端控制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM和JVM内存管理

Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。Java源代码经过编译器编译后生成与平台无关的字节码文件(.class文件)。当…

【20240309】WORD宏设置批量修改全部表格格式

WORD宏设置批量修改全部表格格式 引言1. 设置表格文字样式2. 设置表格边框样式3. 设置所有表格边框样式为075pt4. 删除行参考 引言 这两周已经彻底变为office工程师了,更准确一点应该是Word工程师,一篇文档动不动就成百上千页,表格图片也是上…

计算机视觉(CV)自然语言处理(NLP)大模型应用,如何实现小模型

在人工智能领域,大模型已经成为引领创新和进步的重要推动力。它们不仅在自然语言处理、计算机视觉等任务中展现了强大的性能,还为各行各业带来了前所未有的机遇和挑战。本文将从一个高级写作专家的角度,深入探讨大模型的现状、技术突破以及未…

STM32之串口中断接收UART_Start_Receive_IT

网上搜索了好多,都是说主函数增加UART_Receive_IT()函数来着,实际正确的是UART_Start_Receive_IT()函数。 —————————————————— 参考时间:2024年3月9日 Cube版本:STM32CubeMX 6.8.1版本 参考芯片&#xff1a…

Svg Flow Editor 原生svg流程图编辑器(二)

系列文章 Svg Flow Editor 原生svg流程图编辑器(一) 说明 这项目也是我第一次写TS代码哈,现在还被绕在类型中头昏脑胀,更新可能会慢点,大家见谅~ 目前实现的功能:1. 元件的创建、移动、形变;2…

完全背包问题(一般写法与空间优化写法)

题目 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。 第 i 种物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整…

最多几个直角三角形python

最多几个直角三角形 问题描述思路代码实现 问题描述 最多可以组成几个直角三角形&#xff0c;一个边只能用一次。 输入描述&#xff1a; 第一行输入一个正整数T&#xff08;1<&#xff1d;T<&#xff1d;100&#xff09;&#xff0c;表示有T组测试数据. 对于每组测试数据…

贪心算法: 奶牛做题

5289. 奶牛做题 - AcWing题库 贝茜正在参加一场奶牛智力竞赛。 赛事方给每位选手发放 n 张试卷。 每张试卷包含 k 道题目&#xff0c;编号 1∼k。 已知&#xff0c;不同卷子上的相同编号题目的难度相同&#xff0c;解题时间也相同。 其中&#xff0c;解决第 i 道题&#xff08;…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用&#xff1a; int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式&#xff0c;如下&#xff1a; int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

plantUML使用指南之序列图

文章目录 前言一、序列图1.1 语法规则1.1.1 参与者1.1.2 生命线1.1.3 消息1.1.4 自动编号1.1.5 注释1.1.6 其它1.1.7 例子 1.2 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中&#xff0c;图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

【stm32 外部中断】

中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#xff1a;当有多个中…

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡&#xff0c;客户端所有请求都会交给nginx&#xff0c;然后由nginx实现转发请求&#xff0c;即负载均衡是由服务端实现的。 loadbalancer本地负载均衡&#xff0c;在调用微服务接口时候&a…

考研复习C语言初阶(4)+标记和BFS展开的扫雷游戏

目录 1. 一维数组的创建和初始化。 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3. 数组越界 4. 冒泡…

【Java JVM】Class 文件的加载

Java 虚拟机把描述类的数据从 Class 文件加载到内存, 并对数据进行校验, 转换解析和初始化, 最终形成可以被虚拟机直接使用的 Java 类型, 这个过程被称作虚拟机的类加载机制。 与那些在编译时需要进行连接的语言不同, 在 Java 语言里面, 类的加载, 连接和初始化过程都是在程序…

Apache HBase

一、HBase简介 1、HBase定义 Apache HBase™是以hdfs为数据存储的&#xff0c;一种分布式、可扩展的NoSQL数据库。 HBase官网 Welcome to Apache HBase™ Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.Use Apache HBase™ when you nee…

解决阿里云服务器开启frp服务端,内网服务器开启frp客户端却连接不上的问题

解决方法&#xff1a; 把阿里云自带的Alibabxxxxxxxlinux系统 换成centos 7系统&#xff01;&#xff01;&#xff01;&#xff01; 说一下我的过程和问题&#xff1a;由于我们内网的服务器在校外是不能连接的&#xff0c;因此我弄了个阿里云服务器做内网穿透&#xff0c;所谓…

【git】总结

一般提交流程&#xff1a; git add 或者直接加号暂存 git status 检查状态 git commit -m “提交信息” git pull git push origin HEAD:refs/for/分支 git pull 拉代码时有冲突&#xff1a; git add . 暂存所有 git stash 暂存 git pull 解决冲突 git stash apply 放出暂存…

大模型学习过程记录

一、基础知识 自然语言处理&#xff1a;能够让计算理解人类的语言。 检测计算机是否智能化的方法&#xff1a;图灵测试 自然语言处理相关基础点&#xff1a; 基础点1——词表示问题&#xff1a; 1、词表示&#xff1a;把自然语言中最基本的语言单位——词&#xff0c;将它转…

【C语言】C语言编程实战:Base64编解码算法从理论到实现(附完整代码)

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

你应该打好你的日志,起码避免被甩锅

大家好&#xff0c;我是蓝胖子,相信大家或多或少都有这样的经历&#xff0c;当你负责的功能出现线上问题时&#xff0c;领导第一时间便是找到你询问原因&#xff0c;然而有时问题的根因或许不在你这儿&#xff0c;只是这个功能或许依赖了第三方或者内部其他部门&#xff0c;这个…