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 简单操作示例

相关文章
|
3月前
|
存储 NoSQL Redis
采用Redis的Bitmaps实现类似Github连续提交状态的功能。
在现实世界的应用开发中,实现类似于Github提交跟踪系统时,还可能需要考虑用户时区、闰年等日期相关的边界条件,以及辅助数据的存储和查询优化,例如对活跃用户的即时查询和统计等。不过这些都可以在Bitmaps的基础功能之上通过额外的代码逻辑来实现。
108 0
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
237 32
|
6月前
|
存储 监控 NoSQL
使用Redis实现延迟消息发送功能
使用 Redis 的密码认证功能,为实例设置密码以防止未授权访问。为消息提供适当加密,确保消息内容在网络传输过程中不被窃取或篡改。
264 16
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
843 4
|
9月前
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
477 13
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
263 6
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
361 3
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
155 2
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
138 2
下一篇
oss云网关配置