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这个通知了。
这次学习就先分享这么多了,下次再来吧。