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,一经查实,立即删除!

相关文章

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

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

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…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式,如下: 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 如何画好 参考 前言 在软件开发、系统设计和架构文档编写过程中,图形化建模工具扮演着重要的角色。而 PlantUML 作为一种强大且简洁的开…

【stm32 外部中断】

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

LoadBalancer (本地负载均衡)

1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。 loadbalancer本地负载均衡,在调用微服务接口时候&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 语言里面, 类的加载, 连接和初始化过程都是在程序…

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

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

大模型学习过程记录

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

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

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

【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能

前引 随着Unity的不断发展,开发者对于项目的输入系统要求也日益提高。在进行多平台适配和跨平台移植时,常常需要改变输入系统,这给开发者带来了不少困扰。而Unity官方推出的InputSystem插件,则是为了解决这一问题而推出的全新输入…

Linux内存管理--系列文章壹

一、引子 作者、我在上班闲着没事的时候,看了一些关于Linux内存管理和程序装载、链接的文章,然后自己就总结出了一些东西。 本系列文章一方面将资料中的长篇大论总结到最少、以方便可以直接找到答案,一方面也是方便面试的时候可以吹牛逼。 L…

【Docker】golang使用DockerFile正确食用指南

【Docker】golang使用DockerFile正确食用指南 大家好 我是寸铁👊 总结了一篇golang使用DockerFile正确食用指南✨ 喜欢的小伙伴可以点点关注 💝 问题背景 今天寸铁想让编写好的go程序在docker上面跑,要想实现这样的效果,就需要用…

小程序 van-field label和输入框改成上下布局

在组件上面加个样式就行&#xff1a;custom-style"display:block;" <van-field label"备注说明" type"textarea" clearable title-width"100px" custom-style"display:block;" placeholder"请输入" /> …

大载重无人机基础技术,研发一款50KG负重六旋翼无人机技术及成本分析

六旋翼无人机是一种多旋翼无人机&#xff0c;具有六个旋翼&#xff0c;通常呈“X”形布局。它采用电动串列式结构&#xff0c;具有垂直起降、悬停、前飞、后飞、侧飞、俯仰、翻滚等多种飞行动作的能力。六旋翼无人机通常被用于航拍、农业植保、环境监测、地形测绘等领域。 六旋…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网&#xff1f;3.2 什么是子网划分&#xff1f;3.3 子网划分的作用&#xff1f;3.4 子网划…

云计算项目十一:构建完整的日志分析平台

检查k8s集群环境&#xff0c;master主机操作&#xff0c;确定是ready 启动harbor [rootharbor ~]# cd /usr/local/harbor [rootharbor harbor]# /usr/local/bin/docker-compose up -d 检查head插件是否启动&#xff0c;如果没有&#xff0c;需要启动 [rootes-0001 ~]# system…

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…