美文网首页
高级篇之一

高级篇之一

作者: timTang | 来源:发表于2017-12-28 11:30 被阅读0次

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这个通知了。

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

相关文章

网友评论

      本文标题:高级篇之一

      本文链接:https://www.haomeiwen.com/subject/yujmgxtx.html