Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
//向列表中压入数据
$redis->lPush('list','1','2','3');
//获取列表长度
$result=$redis->lLen('list');
//弹出列表中第一个元素(先入后出)
$result=$redis->lpop('list');//3
//弹出列表中最后一个元素(先入先出)
$result=$redis->rpop('list');//1
//阻塞式弹出列表中第一个元素,如果没有元素则等待1秒
while($result = $redis->blPop('list',1)){
var_export($result);//'3''2''1'
}
//阻塞式弹出列表中最后一个元素,如果没有元素则等待1秒
while($result = $redis->brPop('list',1)){
var_export($result);
}
//通过索引获取列表中的元素(先入后出)
$redis->lPush('list','1','2','3');
$r1=$redis->lIndex('list',0);
$r2=$redis->lIndex('list',1);
$r3=$redis->lIndex('list',2);
var_export($r1);//3
var_export($r2);//2
var_export($r3);//1
//将一个元素插入到表头
$redis->lPushx('list','999');
while ($r=$redis->lPop('list')){
var_export($r);//999''3''2''1'
}
//获取指定下标范围内的元素
$r=$redis->lRange('list',0,100);
var_export($r);
//array (
// 0 => '3',
// 1 => '2',
// 2 => '1',
//)
//移除列表元素
$r=$redis->lRem('list',3,1);//1
$redis->lPush('list','1','2','3');
//通过下标设置元素的值,如果下标不存在则返回false
$r=$redis->lset('list',10,100);//false
$r=$redis->lset('list',2,100);//true
//修剪队列,只保留开始下标起指定长度的元素
$r=$redis->lTrim('list',1,3);
while($r=$redis->lPop('list')){
var_export($r);//'5''4''3'
}
$redis->lPush('list','1','2','3','4','5','6');
//移除列表的最后一个元素,并将该元素添加到另一个列表并返回
$r=$redis->rpoplpush('list','list2');
while($r=$redis->lPop('list2')){
var_export($r);//1
}
//移除列表的最后一个元素,并将该元素添加到另一个列表并返回,并阻塞等待1秒
$r=$redis->brpoplpush('list','list2',1);
while($r=$redis->lPop('list2')){
var_export($r);//2
}
-
适用场景
-
消息队列
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子。 -
排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。(打个小广告,酷狗音乐“K歌擂台赛”每天都能产生一批优质翻唱作品,对普通人优质歌声有兴趣的朋友不妨来听听)。
-
网友评论