应用场景:
Lists就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现,比较好理解。
实现方式:
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
1、lPush()/rPush()
在名称为key的list左边(头)添加一个值为value的元素,如果这个key值不存在则创建一个。如果key值存在并且不是一个list,则返回false
返回key值得长度,失败后返回 false
$redis->lPush('key1', 'C'); // returns 1
$redis->lPush('key1', 'B'); // returns 2
$redis->lPush('key1', 'A'); // returns 3
在名称为key的list右边(尾)添加一个值为value的 元素,如果这个key值不存在则创建一个。如果key值存在并且不是一个list,则返回false
$redis->rPush('key1', 'A'); // returns 1
$redis->rPush('key1', 'B'); // returns 2
$redis->rPush('key1', 'C'); // returns 3
2.lPushx()/rPushx()
lPushx:在名称为key的list左边(头)添加一个值为value的 元素,如果这个value存在则不添加。
返回key值得长度。
$redis->lPushx('key1', 'A'); // returns 0
$redis->lPush('key1', 'A'); // returns 1
$redis->lPushx('key1', 'B'); // returns 2
$redis->lPushx('key1', 'C'); // returns 3
rPushx:在名称为key的list右边(尾)添加一个值为value的 元素,如果这个value存在则不添加且返回Flase
$redis->rPushx('key1', 'A'); // returns 0
$redis->rPush('key1', 'A'); // returns 1
$redis->rPushx('key1', 'B'); // returns 2
$redis->rPushx('key1', 'C'); // returns 3
3.lPop()/rPop()
lPop:输出名称为key的list左(头)起的第一个元素,删除该元素
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lPop('key1');
rPop:输出名称为key的list右(尾)起起的第一个元素,删除该元素。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->rPop('key1');
4.lSize()/ILen()
返回这个key值list的个数,如果这个list不存在或为空,则返回0,如果这个值得类型并不是一个list则返回false。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lSize('key1');
$redis->rPop('key1');
$redis->lSize('key1');
5.lGet()/lIndex()
返回名称为key的list中index位置的元素,0代表第一个,1代表第二个,-1代表最后一个,-2代表倒数第二个,当这个key值不存在于list中时,返回false。
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lGet('key1', 0);
$redis->lGet('key1', -1);
$redis->lGet('key1', 10);
6.lSet()
设置名称为key的list中index位置的元素赋值为value
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lGet('key1', 0);
$redis->lSet('key1', 0, 'X');
$redis->lGet('key1', 0);
7.lRange()/lGetRange()
返回名称为key的list中start至end之间的元素(end为 -1 ,返回所有)
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1);
array(size=3)0=>string'A'(length=1)1=>string'B'(length=1)2=>string'C'(length=1)
array(size=2)0=>string'A'(length=1)1=>string'B'(length=1)
8.lTrim()/listTrim()
截取名称为key的list,保留start至end之间的元素
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1);
$redis->lTrim('key1', 0, 1);
$redis->lRange('key1', 0, -1);
array(size=3)0=>string'A'(length=1)1=>string'B'(length=1)2=>string'C'(length=1)
array(size=2)0=>string'A'(length=1)1=>string'B'(length=1)
9.lRem()/lRemove()
从列表中从头部开始移除count个匹配的值。如果count为零,所有匹配的元素都被删除。如果count是负数,内容从尾部开始删除。
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'A');
$redis->lRange('key1', 0, -1);
$redis->lRem('key1', 'A', 2);
$redis->lRange('key1', 0, -1);