您当前的位置:首页 > 电脑百科 > 数据库 > Redis

如何在 Python 中使用 Redis

时间:2022-11-17 14:12:25  来源:今日头条  作者:IT街or

入门

redis 具有客户端-服务器架构,并使用请求-响应模型。这意味着您(客户端)通过 TCP 连接连接到 Redis 服务器,默认情况下在端口 6379 上。您请求一些操作(例如某种形式的读取、写入、获取、设置或更新),服务器会您提供响应。

可以有许多客户端与同一台服务器通信,这实际上是 Redis 或任何客户端-服务器应用程序的全部内容。每个客户端在等待服务器响应的套接字上执行(通常是阻塞的)读取。

cliinredis-cli代表命令行界面,而inserver代表redis-server运行服务器。Python/ target=_blank class=infotextkey>Python与在命令行中运行的方式相同,您可以运行redis-cli以跳转到交互式 REPL(Read Eval Print Loop),您可以在其中直接从 shell 运行客户端命令。

但是,首先,您需要启动redis-server以便有一个正在运行的 Redis 服务器可以与之通信。在开发中执行此操作的一种常见方法是在localhost(IPv4 地址127.0.0.1)上启动服务器,这是默认设置,除非您另行通知 Redis。您还可以传递redis-server配置文件的名称,这类似于将其所有键值对指定为命令行参数:

$ redis-server /etc/redis/6379.conf
31829:C 07 Mar 2019 08:45:04.030 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
31829:C 07 Mar 2019 08:45:04.030 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=31829, just started
31829:C 07 Mar 2019 08:45:04.030 # Configuration loaded

我们将daemonize配置选项设置为yes,因此服务器在后台运行。(否则,--daemonize yes用作 的选项redis-server。)

现在您已准备好启动 Redis REPL。redis-cli在命令行上输入。您将看到服务器的主机:端口对,后跟>提示:

127.0.0.1:6379>

这是最简单的 Redis 命令之一PING,它只是测试与服务器的连接并"PONG"在一切正常时返回:

127.0.0.1:6379> PING
PONG

Redis 命令不区分大小写,尽管它们的 Python 对应命令绝对不区分大小写。

注意:作为另一个健全性检查,您可以使用以下命令搜索 Redis 服务器的进程 ID pgrep:

$ pgrep redis-server
26983

要终止服务器,pkill redis-server请从命令行使用。在 mac OS X 上,您还可以使用redis-cli shutdown.

接下来,我们将使用一些常见的 Redis 命令并将它们与纯 Python 中的样子进行比较。

Redis 作为 Python 字典

Redis 代表远程字典服务

“你的意思是,像 Python字典一样?” 你可能会问。

是的。从广义上讲,您可以在 Python 字典(或通用哈希表)和 Redis 的用途和用途之间得出许多相似之处:

  • Redis 数据库包含键:值对并支持诸如 、 和 等命令GET,SET以及DEL数百个附加命令。
  • Redis始终是字符串。
  • Redis可能是许多不同的数据类型。我们将在本教程中介绍一些更重要的值数据类型:string、list、hashes和sets。一些高级类型包括地理空间项目和新的流类型。
  • 许多 Redis 命令在恒定的 O(1) 时间内运行,就像从 Pythondict或任何哈希表中检索值一样。

Redis 创建者 Salvatore Sanfilippo 可能不喜欢将 Redis 数据库与普通 Python 进行比较dict。他称该项目为“数据结构服务器”(而不是诸如memcached之类的键值存储),因为值得称赞的是,Redis 支持存储除string:string之外的其他类型的key:value数据类型。但出于我们的目的,如果您熟悉 Python 的字典对象,这是一个有用的比较。

让我们通过例子来学习。我们的第一个玩具数据库(ID 为 0)将是country:capital city的映射,SET用于设置键值对:

127.0.0.1:6379> SET Bahamas Nassau
OK
127.0.0.1:6379> SET Croatia Zagreb
OK
127.0.0.1:6379> GET Croatia
"Zagreb"
127.0.0.1:6379> GET Japan
(nil)

纯 Python 中相应的语句序列如下所示:

>>>
>>> capitals = {}
>>> capitals["Bahamas"] = "Nassau"
>>> capitals["Croatia"] = "Zagreb"
>>> capitals.get("Croatia")
'Zagreb'
>>> capitals.get("Japan") # None

我们使用capitals.get("Japan")而不是capitals["Japan"]因为 Redisnil在找不到键时会返回而不是错误,这类似于 Python 的None.

Redis 还允许您在一个命令中设置和获取多个键值对,MSET并MGET分别:

127.0.0.1:6379> MSET Lebanon Beirut Norway Oslo France Paris
OK
127.0.0.1:6379> MGET Lebanon Norway Bahamas
1) "Beirut"
2) "Oslo"
3) "Nassau"

Python中最接近的东西是dict.update():

>>>
>>> capitals.update({
... "Lebanon": "Beirut",
... "Norway": "Oslo",
... "France": "Paris",
... })
>>> [capitals.get(k) for k in ("Lebanon", "Norway", "Bahamas")]
['Beirut', 'Oslo', 'Nassau']

我们使用.get()而不是.__getitem__()模仿 Redis 在找不到键时返回类似空值的行为。

作为第三个示例,该EXISTS命令执行其听起来的操作,即检查密钥是否存在:

127.0.0.1:6379> EXISTS Norway
(integer) 1
127.0.0.1:6379> EXISTS Sweden
(integer) 0

Python 有in关键字来测试相同的东西,它路由到dict.__contAIns__(key):

>>>
>>> "Norway" in capitals
True
>>> "Sweden" in capitals
False

这几个示例旨在使用原生 Python 展示一些常见的 Redis 命令在高级别上发生的事情。Python 示例中没有客户端-服务器组件,redis-py还没有进入图片。这只是为了通过示例展示 Redis 的功能。

以下是您见过的几个 Redis 命令及其功能 Python 等价物的摘要:

SET Bahamas Nassau
capitals["Bahamas"] = "Nassau"
GET Croatia
capitals.get("Croatia")
MSET Lebanon Beirut Norway Oslo France Paris
capitals.update(
{
"Lebanon": "Beirut",
"Norway": "Oslo",
"France": "Paris",
}
)
MGET Lebanon Norway Bahamas
[capitals[k] for k in ("Lebanon", "Norway", "Bahamas")]
EXISTS Norway
"Norway" in capitals

Python Redis 客户端库,redis-py您将在本文中很快深入探讨,它的作用有所不同。它封装了到 Redis 服务器的实际 TCP 连接,并将原始命令(作为使用REdis 序列化协议(RESP) 序列化的字节)发送到服务器。然后,它获取原始回复并将其解析回 Python 对象,例如bytes、int或什至datetime.datetime。

注意:到目前为止,您一直在通过交互式redis-cliREPL 与 Redis 服务器通信。您也可以直接发出命令,就像将脚本的名称传递给python可执行文件一样,例如python myscript.py.

到目前为止,您已经看到了一些 Redis 的基本数据类型,它们是string:string的映射。虽然这种键值对在大多数键值存储中都很常见,但 Redis 提供了许多其他可能的值类型,您将在接下来看到。

Python 与 Redis 中的更多数据类型

在启动redis-pyPython 客户端之前,还有助于基本掌握更多 Redis 数据类型。需要明确的是,所有 Redis 键都是字符串。除了到目前为止示例中使用的字符串值之外,它是可以采用数据类型(或结构)的值。

哈希string:string的映射,称为字段值对,位于一个顶级键下:

127.0.0.1:6379> HSET realpython url "https://realpython.com/"
(integer) 1
127.0.0.1:6379> HSET realpython Github realpython
(integer) 1
127.0.0.1:6379> HSET realpython fullname "Real Python"
(integer) 1

这为一个键,设置了三个字段值对"realpython"。如果您习惯了 Python 的术语和对象,这可能会让人感到困惑。Redis 哈希大致类似于dict嵌套一层深度的 Python:

data = {
"realpython": {
"url": "https://realpython.com/",
"github": "realpython",
"fullname": "Real Python",
}
}

Redis 的字段类似于上面内部字典中每个嵌套键值对的 Python 键。Redis为保存散列结构本身的顶级数据库键保留术语键。

就像MSET基本的字符串:字符串键值对一样,散列也可以散列值对象HMSET中设置多个对:

127.0.0.1:6379> HMSET pypa url "https://www.pypa.io/" github pypa fullname "Python Packaging Authority"
OK
127.0.0.1:6379> HGETALL pypa
1) "url"
2) "https://www.pypa.io/"
3) "github"
4) "pypa"
5) "fullname"
6) "Python Packaging Authority"

usingHMSET可能更接近于我们分配data给上面嵌套字典的方式,而不是像使用HSET.

两个额外的值类型是列表集合,它们可以代替散列或字符串作为 Redis 值。它们在很大程度上就是它们听起来的样子,所以我不会用更多的例子来占用你的时间。散列、列表和集合都有一些特定于给定数据类型的命令,在某些情况下由它们的首字母表示:

  • 哈希:对哈希进行操作的命令以 开头H,例如HSET、HGET或HMSET。
  • 集合:对集合进行操作的命令以 开头S,例如SCARD,它获取与给定键对应的集合值处的元素数。
  • 列表:对列表进行操作的命令以Lor开头R。示例包括LPOP和RPUSH。LorR表示对列表的哪一侧进行操作。一些列表命令也以 a 开头B,表示阻塞。阻塞操作不会让其他操作在执行时中断它。例如,BLPOP在列表结构上执行阻塞左弹出。

注意: Redis 列表类型的一个值得注意的特点是它是一个链表而不是数组。这意味着追加是 O(1),而在任意索引号处进行索引是 O(N)。

以下是 Redis 中特定于字符串、哈希、列表和集合数据类型的命令的快速列表:

 

类型

命令

SADD, SCARD, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SISMEMBER, SMEMBERS, SMOVE, SPOP, SRANDMEMBER, SREM, SSCAN, SUNION,SUNIONSTORE

哈希

HDEL, HEXISTS, HGET, HGETALL, HINCRBY, HINCRBYFLOAT, HKEYS, HLEN, HMGET, HMSET, HSCAN, HSET, HSETNX, HSTRLEN,HVALS

列表

BLPOP, BRPOP, BRPOPLPUSH, LINDEX, LINSERT, LLEN, LPOP, LPUSH, LPUSHX, LRANGE, LREM, LSET, LTRIM, RPOP, RPOPLPUSH, RPUSH,RPUSHX

字符串

AppEND, BITCOUNT, BITFIELD, BITOP, BITPOS, DECR, DECRBY, GET, GETBIT, GETRANGE, GETSET, INCR, INCRBY, INCRBYFLOAT, MGET, MSET, MSETNX, PSETEX, SET, SETBIT, SETEX, SETNX, SETRANGE,STRLEN

 

此表不是 Redis 命令和类型的完整图片。有更高级的数据类型的大杂烩,例如地理空间项目、排序集和HyperLogLog。在 Redis命令页面,您可以按数据结构组进行过滤。还有数据类型总结和Redis数据类型介绍。

因为我们将切换到用 Python 做事情,你现在可以使用REPL清除你的玩具数据库FLUSHDB并退出:redis-cli

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> QUIT

这将带你回到你的 shell 提示符。您可以redis-server在后台运行,因为本教程的其余部分也需要它。



Tags:Redis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  Search: Redis  点击:(12)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25  Search: Redis  点击:(10)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  Search: Redis  点击:(18)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  Search: Redis  点击:(9)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: Redis  点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: Redis  点击:(40)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  Search: Redis  点击:(56)  评论:(0)  加入收藏
深入Go底层原理,重写Redis中间件实战
Go语言以其简洁、高效和并发性能而闻名,深入了解其底层原理可以帮助我们更好地利用其优势。在本文中,我们将探讨如何深入Go底层原理,以及如何利用这些知识重新实现一个简单的Re...【详细内容】
2024-01-25  Search: Redis  点击:(68)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  Search: Redis  点击:(60)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  Search: Redis  点击:(109)  评论:(0)  加入收藏
▌简易百科推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  dbaplus社群    Tags:Redis   点击:(12)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25    51CTO  Tags:Redis   点击:(10)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  后端Q  微信公众号  Tags:Redis   点击:(18)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  OSC开源社区    Tags:Redis   点击:(9)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  编程技术汇    Tags:Redis   点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  楼仔  微信公众号  Tags:Redis   点击:(40)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  waynaqua    Tags:Redis   点击:(56)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  小许code  微信公众号  Tags:Redis命令   点击:(60)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  架构精进之路  微信公众号  Tags:Redis   点击:(109)  评论:(0)  加入收藏
一站式Redis解决方案
Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需...【详细内容】
2024-01-01  大雷家吃饭    Tags:Redis   点击:(66)  评论:(0)  加入收藏
站内最新
站内热门
站内头条