$queueKey = “queue”;
// 生产者
r e d i s − > r p u s h ( redis->rpush( redis−>rpush(queueKey, $data)
// 消费者
while (true) {
$data = r e d i s − > l p o p ( redis->lpop( redis−>lpop(queueKey);
if (null === KaTeX parse error: Expected 'EOF', got '}' at position 77: …/ 业务逻辑 ... }̲由于没有消息时使用的sleep…queueKey = “queue”;
// 生产消息
// 消费时间, 这里设置为1小时候
$consumeTimestamp = time() + 3600;
// $data需要添加随机串前缀(or后缀),防止出现重复member被丢弃
$data = $data . md5(uniqid(rand(), true));
r e d i s − > z a d d ( redis->zadd( redis−>zadd(queueKey, $consumeTimestamp, $data);
// 消费消息
while (tue) {
$arrData = r e d i s − > z r a n g e b y s c o r e ( redis->zrangebyscore( redis−>zrangebyscore(queueKey, 0, time());
if (! a r r D a t a ) u s l e e p ( 100000 ) ; c o n t i n u e ; / / 业 务 逻 辑 f o r e a c h ( arrData) { usleep(100000); continue; } // 业务逻辑 foreach ( arrData)usleep(100000);continue;//业务逻辑foreach(arrData as $data) {
d a t a = s u b s t r ( data = substr( data=substr(data, 0, strlen($data) - 32);
// 消费$data
}
}多消费者使用pub/sub主题订阅者模式,可以实现1:N的消息队列。这种模式中在消费者下线的情况下,生产的消息会丢失,在这里不推荐使用。需要强调的是不推荐使用redis作为消息队列服务,这不是redis的设计目标。如果一定要用可考虑 disque,是由redis的作者开发。分布式锁分布式锁主要解决的几个问题:互斥性: 同一时刻只能有一个服务(或应用)访问资源安全性: 锁只能被持有该锁的服务(或应用)释放容错: 在持有锁的服务crash时,锁仍能得到释放避免死锁方案1我们可能会考虑使用 setnx 和 expire 命令来实现加锁,即当没有key存在时才会成功写入value:$lockStatus = r e d i s − > s e t n x ( redis->setnx( r