高级篇之一

Redis高级功能之分管道技术、消息队列

一、管道技术

我们先来试试管道技术,Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应,说白了也就是提供请求-响应式协议的TCP服务,所以当客户端请求发出,服务端处理并返回结果到客户端,一般是以阻塞形式等待服务端的响应,但这在批量处理连接时延迟问题比较严重,所以Redis为了提升或弥补这个问题,引入了管道技术:可以做到服务端未及时响应的时候,客户端也可以继续发送命令请求,做到客户端和服务端互不干涉影响,服务端并最终返回所有服务端的响应。

在构建批量命令集或是组装属性字符串时,命令间使用\r\n进行分离,测试是否可用以下命令

$(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

在php中的实例如下:

这样来我们就可以使用多个命令,并最终一次返回数据,大大的提示了性能;

二、消息队列

在Redis中消息队列有一种为发布订阅(pub/sub),是一种消息通信模式:subscribe订阅一个频道,publish可以像频道广播消息。

pub/sub 模式固然很好用,但是同样有一个问题,就是如果有多个人订阅了同一频道,而这个频道的数据只能被一个接收方处理,不能够重复处理,这时该怎么办?

解决方法有2种:

1. publish  将数据写入到一个list or sorted list 队列,写完成后开始给终端广播消息,告诉大家,有新的数据等待处理,这个时候,谁能pop到数据,就是谁处理,这个操作是原子性的,也就是说不会被重复处理。

2. 使用阻塞模式,redis提供了blpop brpop这种操作,也就是一直阻塞一个队列,直到有数据来。 这种模式保证了数据的原子性,而且使应用程序可以支持分布式多台机器部署。

上代码,下图是sub(订阅者)实现方式:

打开redis命令行,输入以下命令:publish roban:test:channel hello

发布这条信息后,sub就会roban:test:channel hello这个通知了。

这次学习就先分享这么多了,下次再来吧。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容