十分钟教会你在python中使用Redis

文章目录

  • 一、Redis 简介
  • 二、Redis 特性
  • 三、Redis 使用场景
  • 四、Redis 客户端与常用命令
  • 五、Redis在Python上的操作
    • 1. 安装 redis-py 库
    • 2. 连接Redis服务器
    • 3. 数据操作
      • 字符串操作
        • 设置键值对 set(key, string)
        • 获取字符串 get(key)
        • 检查键是否exists(key)
        • 删除键delete(key)
        • 批量设置键值对mset({key: value, key1: value1})
      • 哈希操作
        • 存储哈希值hset(keytable, key, value)
        • 获取哈希值hget(keytable, key)
        • 批量存储哈希值hget(keytable, key_dict)
        • 获取所有哈希值hgetall(keytable)
      • 列表操作
        • 添加元素
        • 获取列表元素lrang(mylist, start, end)
        • 移除元素
        • 列表长度llen(mylist)
      • 集合操作
        • 添加元素sadd(myset, value)
        • 获取集合中的元素smember(myset)
        • 集合的长度scart(myset)
        • 集合的差集sdiff(myset, myset1)
        • 集合的交集sinter(myset, myset1)
        • 从集合中移除元素
        • 集合的随机元素
        • 集合的弹出元素
      • 有序集合(Sorted Set)
        • 添加元素到有序集合
        • 获取有序集合中的元素
        • 获取有序集合的排名
        • 删除有序集合中的元素
  • 六、Redis 持久化与备份
  • 七、Redis 集群与分布式


一、Redis 简介

Redis 是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis 使用 C 语言编写,支持多种类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,同时还支持范围查询、位图(Bitmaps)、HyperLogLog 和地理空间(geospatial)索引半径查询等功能。

二、Redis 特性

  • 速度快:Redis 的单节点读写速度非常快,读速度可以达到 11 万次/秒,写速度可以达到 8.1 万次/秒。
  • 数据存放内存:Redis 将所有数据存储在内存中,因此读写速度非常快。
  • 支持多种数据结构:Redis 支持多种类型的数据结构,满足不同的数据存储需求。
  • 持久化:Redis 支持数据的持久化,可以将内存中的数据异步保存到硬盘上,以防止数据丢失。
  • 高可用性:Redis 通过哨兵(Sentinel)和自动分区(Cluster)提供高可用性。

三、Redis 使用场景

  • 缓存:Redis 最常见的使用场景是作为缓存系统,用于缓存热点数据,减少对数据库的访问压力。
  • 计数器:Redis 的自增自减操作非常适合实现计数器功能,如用户访问量统计、点赞数统计等。
  • 消息队列:Redis 可以实现简单的消息队列功能,用于生产者和消费者之间的消息传递。
  • 排行榜:Redis 的有序集合可以用于实现排行榜功能,如热门文章排行榜、游戏排行榜等。
  • 社交网络:Redis 可以用于存储社交网络中的用户关系、好友列表等信息。

四、Redis 客户端与常用命令

Redis 提供了命令行客户端 redis-cli,用于与 Redis 服务进行交互。以下是一些常用的 Redis 命令:

  • SET:添加或修改一个字符串类型的键值对。
  • GET:根据键名获取对应的值。
  • INCR:将一个整数值自增 1。
  • DECR:将一个整数值自减 1。
  • LPUSH:向列表的左边插入一个元素。
  • RPUSH:向列表的右边插入一个元素。
  • HSET:添加或修改一个哈希类型键的字段值。
  • HGET:根据键名和字段名获取哈希类型的值。

五、Redis在Python上的操作

1. 安装 redis-py 库

pip install redis

2. 连接Redis服务器

使用 redis-py 库连接到 Redis 服务器。这可以通过创建 redis.Redis 或 redis.StrictRedis 的实例来完成。两者在大多数情况下可以互换使用。

import redis  # 连接到本地 Redis 服务器  
r = redis.Redis(host='localhost', port=6379, db=0, password='123456', decode_responses=True)  # 如果需要连接到远程 Redis 服务器或需要设置密码,可以修改 host, port, password 参数  
# host ip地址 默认本地
# port 端口号 默认6379
# password 密码
# db 数据库

注意:decode_responses=True 参数用于确保从 Redis 获取的字符串数据以 Python 字符串形式存在,而不是字节类型。

3. 数据操作

字符串操作

  • key 代指键名
  • string 代指值(字符串类型)
设置键值对 set(key, string)
r.set('mykey', 'myvalue')
获取字符串 get(key)
value = r.get('mykey')  
print(value)  # 输出: myvalue
检查键是否exists(key)
exists = r.exists('mykey')  
print(exists)  # 输出: True 或 False
删除键delete(key)
deleted = r.delete('mykey')  
print(deleted)  # 输出: 1 表示删除成功
批量设置键值对mset({key: value, key1: value1})
r.mset({'key1': 'value1', 'key2': 'value2'})  
values = r.mget('key1', 'key2')  
print(values)  # 输出: ['value1', 'value2']

哈希操作

  • keytable 代指哈希表
  • key 字段
  • value 数据
存储哈希值hset(keytable, key, value)
r.hset('myhash', 'field1', 'value1')
获取哈希值hget(keytable, key)
value = r.hget('myhash', 'field1')  
print(value)  # 输出: value1
批量存储哈希值hget(keytable, key_dict)
# 假设 hmset 可用  
r.hmset('myhash', {'field2': 'value2', 'field3': 'value3'})  
values = r.hmget('myhash', 'field2', 'field3')  
print(values)  # 输出: [b'value2', b'value3'] (注意:这里可能需要 decode_responses=True)
获取所有哈希值hgetall(keytable)
all_fields_values = r.hgetall('myhash')  
print(all_fields_values)  # 输出类似: {'field1': 'value1', 'field2': 'value2', ...}

列表操作

  • mylist 代指列表名
  • value代指数据
添加元素
  • lpush(mylist, value) 在列表左侧添加
  • rpush(mylist, value) 在列表右侧添加
r.lpush('mylist', 'value1')  # 在列表左侧添加  
r.rpush('mylist', 'value2')  # 在列表右侧添加
获取列表元素lrang(mylist, start, end)
  • start 索引开始位置
  • end 索引结束位置
# 获取列表中的所有元素  
print(r.lrange('mylist', 0, -1))  # 输出: [b'0', b'a', b'b', b'c']  # 获取列表中的前两个元素  
print(r.lrange('mylist', 0, 1))  # 输出: [b'0', b'a']
移除元素
  • lpop:移除并获取列表的第一个元素
  • rpop:移除并获取列表的最后一个元素
# 移除并获取列表的第一个元素  
print(r.lpop('mylist'))  # 输出: b'0'  # 移除并获取列表的最后一个元素  
print(r.rpop('mylist'))  # 输出: b'c'
列表长度llen(mylist)
print(r.llen('mylist'))  # 输出列表的长度

集合操作

  • myset 集合名
  • value 数据
添加元素sadd(myset, value)
r.sadd('myset', 'element1')  
r.sadd('myset', 'element2', 'element3')  # 可以一次添加多个元素
获取集合中的元素smember(myset)
elements = r.smembers('myset')  
print(elements)  # 输出集合中的所有元素,可能是一个无序的列表
集合的长度scart(myset)
length = r.scard('myset')  
print(length)  # 输出集合中的元素数量
集合的差集sdiff(myset, myset1)
set1 = {'element1', 'element2', 'element3'}  
r.sadd('set1', *set1)  # 假设set1已存在于Redis中  
r.sadd('set2', 'element2', 'element4')  # 假设set2也已存在  diff = r.sdiff('set1', 'set2')  
print(diff)  # 输出: {'element1', 'element3'},即set1有而set2没有的元素
集合的交集sinter(myset, myset1)
inter = r.sinter('set1', 'set2')  
print(inter)  # 输出: {'element2'},即set1和set2共有的元素
从集合中移除元素

使用srem命令从集合中移除一个或多个元素。

r.srem('myset', 'element1', 'element2')  
# 现在'myset'中不再包含'element1'和'element2'
集合的随机元素

使用srandmember命令从集合中随机获取一个或多个元素。

random_element = r.srandmember('myset')  
print(random_element)  # 随机输出'myset'中的一个元素  # 获取多个随机元素  
random_elements = r.srandmember('myset', 2)  # 获取两个随机元素  
print(random_elements)
集合的弹出元素

使用spop命令从集合中随机移除一个元素并返回该元素。

popped_element = r.spop('myset')  
print(popped_element)  # 随机输出'myset'中的一个元素,并从集合中移除它

有序集合(Sorted Set)

有序集合是Redis中一种特殊的集合类型,它不仅包含元素,还为每个元素关联了一个浮点数分数(score),这使得元素可以按照分数进行排序。

添加元素到有序集合

使用zadd命令向有序集合中添加一个或多个元素及其分数。

r.zadd('mysortedset', {'member1': 1, 'member2': 2})  
# 或者对于单个元素  
r.zadd('mysortedset', 1, 'member3')
获取有序集合中的元素

使用zrange(升序)或zrevrange(降序)命令获取有序集合中的元素及其分数。

# 升序获取  
ascending = r.zrange('mysortedset', 0, -1, withscores=True)  
print(ascending)  # 输出类似: [('member1', 1.0), ('member2', 2.0), ('member3', 1.0)]  # 降序获取  
descending = r.zrevrange('mysortedset', 0, -1, withscores=True)  
print(descending)  # 输出可能反转的顺序
获取有序集合的排名

使用zrank(升序排名)或zrevrank(降序排名)命令获取元素的排名。

rank = r.zrank('mysortedset', 'member1')  
print(rank)  # 输出: 0,如果member1是分数最低的元素  revrank = r.zrevrank('mysortedset', 'member2')  
print(revrank)  # 输出: 0,如果member2是分数最高的元素
删除有序集合中的元素

使用zrem命令从有序集合中移除一个或多个元素。

r.zrem('mysortedset', 'member1', 'member3')

六、Redis 持久化与备份

Redis 支持两种持久化方式:RDB 和 AOF。

  • RDB:Redis 在指定的时间间隔内将内存中的数据集快照写入磁盘。
  • AOF:Redis 将所有对数据库进行写入的命令以追加的方式写入到文件中,当 Redis 重启时会重新执行文件中的命令来恢复数据。

七、Redis 集群与分布式

Redis 提供了集群和分布式功能,可以通过哨兵和 Cluster 实现高可用性和数据分片。

  • 哨兵(Sentinel):哨兵可以监控主节点和从节点的状态,当主节点出现故障时,哨兵会自动将从节点提升为主节点,实现故障转移。
  • Cluster:Cluster 可以将数据集自动分片到多个节点上,实现数据的分布式存储和负载均衡。

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

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

相关文章

Win10安装ChatTTS-2024-cuda10.1

0x00 前言 ChatTTS是专门为对话场景设计的文本转语音模型,例如大语言助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。目前在huggingface中的开源版本为4万小时训练且未SFT的版本。 0x01 准备环境 版本操作系统Win1…

鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗

ninja | 忍者 ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自…

Uniapp使用InnerAudioContext返回内部 audio 上下文 ,获取不到duration当前音频的长度,如何解决?

原因:其实是wx的bug,这个问题在开发环境中,并不会遇到。而是真机测试或发版后,就获取不到duration。 解决:我们只要去手动播放音频后,就会抓取到duration。 代码示例 关键代码 this.audioContext.play(); //手动播放音频 完整代码 Audio…

本地Docker部署Navidrome音乐服务器与远程访问听歌详细教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

StarRocks 存算分离数据回收原理

前言 StarRocks存算分离表中,垃圾回收是为了删除那些无用的历史版本数据,从而节约存储空间。考虑到对象存储按照存储容量收费,因此,节约存储空间对于降本增效尤为必要。 在系统运行过程中,有以下几种情况可能会需要删…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 07数据中心的边缘

本章将帮助你回答以下问题 可以用哪些方式将 Clos 拓扑连接到外部网终?边缘部署路由协议的最佳实践是什么?企业应如何处理混合云中的连接? 连接模型 为什么要连接到外部世界? 数据中心连接到外部世界的原因很多。如果你要对外提供某种服务(例如搜索服务广告推荐系统或内…

35岁程序员转行大模型:如何把握行业机遇与个人发展

对于一位35岁的程序员想要转行到大模型领域,这是一个很好的时机,因为人工智能和大模型技术正在快速发展,并且有着广泛的应用前景。以下是一些具体的步骤和建议,可以帮助您顺利地完成这一转变: 基础知识学习 数学基础&a…

科技在日常生活中的革新

在科技日新月异的今天,‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备,‌科技已经渗透到我们生活的每一个角落,‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现,‌无疑是科技改变生活的典…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

探索HarmonyOS中的列表组件及其自定义特性

在现代移动应用中&#xff0c;List组件是数据列表的关键元素。HarmonyOS中的List组件不仅具备传统的列表功能&#xff0c;还提供了丰富的自定义选项&#xff0c;允许开发者根据需求灵活调整列表的行为和外观展示。本文将探讨HarmonyOS中列举组件的自定义特性&#xff0c;包括自…

深度剖析C++string(上篇)

目录 前言 1.C string类 2.string类中的常见构造 3.string类对象的容量操作 4.. string类对象的访问及遍历操作 5. auto和范围for(补充&#xff09; auto关键字 范围for 结束语 前言 C语言我们学习了字符串和字符串的相关函数&#xff0c;在C语言中&#xff0c;字符串是…

C++如何为枚举量生成对应的解释:4种常见的方法

C如何为枚举量生成对应的解释 在 C 中&#xff0c;你可以通过几种方法为枚举量生成对应的解释或描述文本。以下是几种常见的方法&#xff1a; 1. 使用 switch 语句 这是最直接的方法&#xff0c;通过 switch 语句为每个枚举值返回一个对应的字符串。 #include <iostream…

day45-dynamic programming-part12-8.16

tasks for today: 1. 115.不同的子序列 2. 583.两个字符串选的删除操作 3. 72.编辑距离 4. 总结编辑两个序列关系的问题 ------------------------------------------------------------------- 1. 115.不同的子序列 In this practice, it is necessary to compare with t…

10 Java数据结构:包装类、数组(Array工具类)、ArrayList

文章目录 前言一、包装类1、Integer&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;JDK5前的包装类用法&#xff08;了解即可&#xff0c;能更好帮助我们理解下面的自动装箱和自动拆箱机制&#xff09;&#xff08;3&#xff09;自动装箱与自动拆箱机制 --- 导致&…

【学习笔记】Day 21

一、进度概述 1、机器学习常识19-22&#xff0c;以及相关代码复现 二、详情 19、矩阵分解 矩阵分解是一个纯数学问题&#xff0c;但当给矩阵赋予现实意义后&#xff0c;矩阵分解就成为了使用数学应对机器学习问题的一类典型而巧妙的方法。 在线性回归分析中&#xff…

esp32c3 luaos

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、介绍二、相关介绍2.1helloworld——2.2任务框架2.3消息传递 与消息订阅2.4uart2.5二进制数据/c结构体的打包与解析2.6 zbuffer库2.8 uart 485 数据解析2.9 …

深入探讨 ElementUI 动态渲染 el-table

在前端开发中&#xff0c;表格是不可或缺的一部分。无论是数据展示、数据录入&#xff0c;还是数据分析&#xff0c;表格都扮演着重要的角色。而在 Vue.js 生态系统中&#xff0c;ElementUI 提供了一个强大且灵活的表格组件——el-table。本文将带你深入了解如何使用 ElementUI…

缓存实现方式

缓存是一个常见的话题&#xff0c;因为它对于提高应用程序性能至关重要。缓存是一种存储数据的临时地方&#xff0c;以便快速访问数据&#xff0c;减少对原始数据源&#xff08;如数据库或文件系统&#xff09;的访问次数&#xff0c;从而提高应用程序的响应速度和吞吐量。 Jav…

【运维】Linux如何解压.rar文件

在Linux系统中解压.rar文件,你可以使用unrar或rar工具。如果系统中还没有安装它们,可以先通过包管理器进行安装。以下是具体步骤: 1. 安装 unrar 对于基于Debian的发行版(如Ubuntu):sudo apt-get install unrar对于基于Red Hat的发行版(如CentOS、Fedora):sudo yum i…

【Nodejs】六、express框架

目录 一、express 介绍 二、express 使用 2.1 express 下载 2.2 express 使用 三、express 路由 3.1 什么是路由 3.2 路由的使用 3.3 获取请求参数 3.4 获取路由参数 四、express 响应设置 五、express 中间件 5.1 什么是中间件 5.2 中间件的作用 5.3 中间件的类…