php redis list

list add

// 1 list add
// lpush:   lpush key value [ value1 value2 value3 ]
// rpush:   rpush key value [ value1 value2 value3 ]
// linsert: linsert key before|after privot value
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->lpush($k33, '4', '5', '6');
$redis->linsert($k33, 'before', '5', 'a');

$res1 = $redis->lrange($k31, 0, -1);// Array ( [0] => 1 [1] => 2 [2] => 3 )
$res2 = $redis->lrange($k32, 0, -1);// Array ( [0] => 6 [1] => 5 [2] => 4 )
$res3 = $redis->lrange($k33, 0, -1);// Array ( [0] => 6 [1] => a [2] => 5 [3] => 4 )

list 查找

// 1 list 查找
// 获取指定范围内元素列表 lrange:        lrange key start end
// 获取列表指定列表下标的元素 lindex:    lindex key index
// 获取列表的长度 llen:                llen key
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->lpush($k33, '4', '5', '6');

$res1 = $redis->lrange($k31, 0, -1);// Array ( [0] => 1 [1] => 2 [2] => 3 )
$res2 = $redis->lindex($k32, 2);    // string(1) "4" 
$res3 = $redis->llen($k33);         // string(1) "3"

list 删除

// 3 list 删除
// 从列表左侧弹出元素 lpop:            返回弹出元素
// 从列表右侧弹出元素 rpop:            返回弹出元素
// 按照索引范围修剪列表 ltirm:         ltirm key start end
// 删除指定元素 lrem:                 lrem count value   返回删除元素个数
// count>0 从左到右,删除最多count个元素
// count<0 从右到左,删除最多count绝对值个元素
// count=0 删除所有
$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$k33 = 'imei:list:3';
$k34 = 'imei:list:4';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表
$redis->ltrim($k33, -1, 0);//清空列表
$redis->ltrim($k34, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->lpush($k32, '4', '5', '6');
$redis->rpush($k33, '1', '2', '2', '3', '3', '3', '4', '4', '4', '4', ' 5', '5', '5', '5', '5');
$redis->rpush($k34, '1', '2', '3', '4', '5');

$res1 = $redis->lpop($k31);          // string(1) "1"
print_r($redis->lrange($k31, 0, -1));// Array ( [0] => 2 [1] => 3 )
$res2 = $redis->rpop($k32);          // string(1) "4"
print_r($redis->lrange($k32, 0, -1));// Array ( [0] => 6 [1] => 5 )
$res3 = $redis->lrem($k33, 5, 4);    // string(1) "4"
print_r($redis->lrange($k33, 0, -1));//Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 3 [5] => 3 [6] => 5 [7] => 5 [8] => 5 [9] => 5 [10] => 5 )
$res4 = $redis->lrem($k33, -2, 3);    // string(1) "2"
print_r($redis->lrange($k33, 0, -1)); //Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 3 [4] => 5 [5] => 5 [6] => 5 [7] => 5 [8] => 5 )
$res5 = $redis->lrem($k33, 0, 3);     // string(1) "1"
print_r($redis->lrange($k33, 0, -1)); // Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 5 [4] => 5 [5] => 5 [6] => 5 [7] => 5 )
$res6 = $redis->ltrim($k34, 0, 2);    // bool(true)
print_r($redis->lrange($k34, 0, -1)); // Array ( [0] => 1 [1] => 2 [2] => 3 )

list 修改

// 4 list 修改
// 修改指定下标的元素 lset:            lset key index newValue
$k31 = 'imei:list:1';
$redis->ltrim($k31, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');

$res1 = $redis->lset($k31, 1, 100);          // bool(true) 
print_r($redis->lrange($k31, 0, -1));        // Array ( [0] => 1 [1] => 100 [2] => 3 )

list 阻塞操作

// 4 list 阻塞操作
// 阻塞式弹出 blpop: blpop key [ key1 ... ] timeout
// 阻塞式弹出 brpop: brpop key [ key1 ... ] timeout
// note: blpop brpop分别是lpop rpop的阻塞版本 他们除了弹出方向不同 使用方法基本相同
// 说明:
// 1)列表都为空:如果timeout=3 那么客户端要等待3秒后返回,如果timeout=0, 那么客户端会一直阻塞下去
//   如果在timeout期间列表添加了数据,客户端会立即返回

$k31 = 'imei:list:1';
$k32 = 'imei:list:2';
$redis->ltrim($k31, -1, 0);//清空列表
$redis->ltrim($k32, -1, 0);//清空列表

$redis->rpush($k31, '1', '2', '3');
$redis->rpush($k32, '4', '5', '6');

$res1 = $redis->blpop($k31, $k32, 3);
print_r($res1);                         // Array ( [0] => imei:list:1 [1] => 1 )
print_r($redis->lrange($k31, 0, -1));   // Array ( [0] => 2 [1] => 3 )
print_r($redis->lrange($k32, 0, -1));   // Array ( [0] => 4 [1] => 5 [2] => 6 )
// 2)有一个列表不为空:客户端会立即返回
//   使用brpop时,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回
//   如果是多个客户端对同一个键执行brpop, 那么先执行brpop命令的客户端可以获取得到弹出的值
$k31 = 'imei:list:1';
$redis->ltrim($k31, -1, 0);//清空列表
// client 1
$redis->blpop($k31, 0);
// client 2
$redis->blpop($k31, 0);
// client 3
$redis->blpop($k31, 0);
// client 4
$redis->rpush($k31, '1');
// client 1 会最获取到元素1 因为client 1最先执行brpop, 而client 2, client3继续阻塞

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355