php redis list
2019-07-23 本文已影响0人
周pan
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继续阻塞