redis 队列功能

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: redis 队列功能

Redis 队列功能介绍

List

常用命令:

Blpop 删除,并获得该列表中的第一元素,或阻塞,直到有一个可用

Brpop 删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用

Brpoplpush

Lindex 获取一个元素,通过其索引列表

Linsert 在列表中的另一个元素之前或之后插入一个元素

Llen 获得队列 (List) 的长度

Lpop 从队列的左边出队一个元素

Lpush 从队列的左边入队一个或多个元素

Lpushx 当队列存在时,从队到左边入队一个元素

Lrange 从列表中获取指定返回的元素

Lrem 从列表中删除元素

Lset 设置队列里面一个元素的值

Ltrim 修剪到指定范围内的清单

Rpop 从队列的右边出队一个元素

Rpoplpush 删除列表中的最后一个元素,将其追加到另一个列表

Rpush 从队列的右边入队一个元素

Rpushx 从队列的右边入队一个元素,仅队列存在时有效

 

Redis 支持 php、python、c 等接口

 

应用场景:

Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一,比如 twitter 的关注列表,粉丝列表等都可以用 Redis 的 list 结构来实现。

Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用 Lists 结构,我们可以轻松地实现最新消息排行等功能。

Lists 的另一个应用就是消息队列,

可以利用 Lists 的 PUSH 操作,将任务存在 Lists 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提供了操作 Lists 中某一段的 api,你可以直接查询,删除 Lists 中某一段的元素。

 

如果需要还可以用 redis 的 Sorted-Sets 数据结构来做优先队列。可以给每条消息加上一个唯一的序号。这里就不详细介绍了。

实现方式:

Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

 

示意图:

1) 入队

2) 出队 (非阻塞模式)

 

 

lpop 弹出列表首元素(即最后入队的元素)


Rpop 弹出列表尾元素 (即入队的最开始的一个元素)

注意:如果要当作队列功能,应该是用这个出队

 

 

这里的出队都是非阻塞模式,就是你用 pop 出队的时候,如果队列是空的话,你得到的是一个 NULL 的值

3) 出队 (阻塞模式)

假如现在 queue 队列为空  我们用 brpop 命令

BRPOP 是一个阻塞的列表弹出原语。 它是 RPOP 的阻塞版本,因为这个命令会在给定 list 无法弹出任何元素的时候阻塞连接。 该命令会按照给出的 key 顺序查看 list,并在找到的第一个非空 list 的尾部弹出一个元素。

 

A)

我们执行 brpop 命令

可以看到队列 queue 没有元素的时候  是阻塞的  即不返回值    

其中 0 是超时时间 为 0 表示一直等待

 

B)

这个时候我们用 lpush 往队列里 入队一个数据 “bbb”

 

C)

阻塞的队列立马会弹出出队元素   显示队列名字  和 出队元素  已经等待了多少时间

 

D)

Brpop 还能同时阻塞多个队列比如这样

用 redis 的 list 当作队列可能存在的问题

1) redis 崩溃的时候队列功能失效

2) 如果入队端一直在塞数据,而出队端没有消费数据,或者是入队的频率大而多,出队端的消费频率慢会导致内存暴涨

3) Redis 的队列也可以像 rabbitmq 那样  即可以做消息的持久化,也可以不做消息的持久化。

当做持久话的时候,需要启动 redis 的 dump 数据的功能。暂时不建议开启持久化。

 

Redis 其实只适合作为缓存,而不是数据库或是存储。它的持久化方式适用于救救急啥的,不太适合当作一个普通功能来用。应为 dump 时候,会影响性能,数据量小的时候还看不出来,当数据量达到百万级别,内存 10g 左右的时候,非常影响性能。

 

4) 假如有多个消费者同时监听一个队列,其中一个出队了一个元素,另一个则获取不到该元素

5) Redis 的队列应用场景是一对多或者一对一的关系,即有多个入队端,但是只有一个消费端 (出队)

 

PHP 的 redis 简单操作示例

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 缓存 NoSQL
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
深入了解Redis键管理:探索Redis键命令及其功能与应用场景
|
1月前
|
消息中间件 存储 缓存
探索Redis CLI:功能强大的Redis命令行工具及其应用场景
探索Redis CLI:功能强大的Redis命令行工具及其应用场景
|
7月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
7月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(二)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
7月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(一)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
4月前
|
消息中间件 NoSQL Java
别再用 Redis List 实现消息队列了,Stream 专为队列而生
别再用 Redis List 实现消息队列了,Stream 专为队列而生
70 0
|
7月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(三)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
14天前
|
缓存 NoSQL Java
【亮剑】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护,如何使用注解来实现 Redis 分布式锁的功能?
【4月更文挑战第30天】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护。基于 Redis 的分布式锁利用 SETNX 或 SET 命令实现,并考虑自动过期、可重入及原子性以确保可靠性。在 Java Spring Boot 中,可通过 `@EnableCaching`、`@Cacheable` 和 `@CacheEvict` 注解轻松实现 Redis 分布式锁功能。
|
18天前
|
存储 监控 NoSQL
|
18天前
|
存储 NoSQL API
Redis入门到通关之GEO实现附近的人功能
Redis入门到通关之GEO实现附近的人功能
12 0