链表篇

Redis列表(Lists)可保存根据插入顺序排序的字符串元素集合。从两端推送或弹出项目,根据偏移量修剪,读取单个或多个项目,或根据值和位置查找或移除项目。您还可以为异步信息传输进行阻塞调用。

redis-lists

场景

列表的使用场景在业务中也很广泛,比如消息队列,最前消息集合,事件日志,任务队列等等。

消息队列

Redis列表常被用作消息队列的数据结构,生产者通过将消息插入列表的尾部,消费者则通过弹出列表头部的消息来处理任务,实现简单高效的消息队列。当然这和真正的消息队列(mq, kafka)这种差距还是很大的。


// 进程1 生产消息
$redis->lPush('queue:message', 'msg1', 'msg2', 'msg3');


// 进程2 阻塞式消费消息
while(($msg = $redis->blPop('queue:message', 0))) {
    // todo message
}


最新消息排行

在社交媒体应用或新闻网站等场景中,可以使用Redis列表来存储最新的消息或文章,每当有新消息产生时,将其插入列表的头部,用户可以通过读取列表的头部获取最新的消息。


$redis->lPush('top:news', 'news:1', 'news:2', 'news:3', 'news:4');

$newSet = $redis->lRange('top:news', 0, -1);

foreach ($newSet as $objId) {
}

任务队列

类似于消息队列,任务队列也可以使用Redis列表来实现。生产者将待处理的任务插入列表的尾部,消费者则从列表头部取出任务进行处理。

实时聊天

Redis列表可以用作实时聊天应用中的消息通道,每个房间或者会话对应一个列表,用户发送的消息被插入到列表尾部,其他用户通过读取列表头部获取最新的消息。当然这只一种非常简单的实现方案。

这种方式需要客户端传递一个已显示的消息总数过来。

$offset = 10; // 客户端传过来
// 获取最新的消息 总数 - 已显示的数量 = 最新消息的数量
$newSet = $redis->lRange('room:1', 0, $redis->lLen('room:1') - $offset);

事件日志

可以使用Redis列表来存储系统的事件日志,每当系统发生一个事件时,将事件信息插入列表的尾部,可以方便地记录和查询系统的历史事件。

轮播广告

在广告展示系统中,可以使用Redis列表来存储待展示的广告内容,每个广告按照展示权重插入到列表中,然后通过随机或者轮询的方式从列表中取出广告进行展示。

任务延迟队列

可以使用Redis列表实现任务的延迟执行,将待执行的任务按照执行时间插入到列表中,并且保持列表有序,消费者定时地轮询列表头部,将到期的任务取出执行。

协作

如果你有更多的场景使用用例,可以通过github提交pr请求。有问题可以开issue编辑此页面